1 | /* |
2 | * Copyright 2018 Cerebras Systems |
3 | * |
4 | * Use of this software is governed by the MIT license |
5 | * |
6 | * Written by Sven Verdoolaege, |
7 | * Cerebras Systems, 175 S San Antonio Rd, Los Altos, CA, USA |
8 | */ |
9 | |
10 | #include "isl_multi_macro.h" |
11 | #undef TYPE |
12 | #define TYPE CAT(isl_,BASE) |
13 | |
14 | /* Check that "map" and "multi" live in the same space, ignoring parameters. |
15 | */ |
16 | static isl_stat FN(check_map_equal_tuples_multi,BASE)(__isl_keep isl_map *map, |
17 | __isl_keep MULTI(BASE) *multi) |
18 | { |
19 | isl_space *map_space, *multi_space; |
20 | |
21 | map_space = isl_map_peek_space(map); |
22 | multi_space = FN(MULTI(BASE),peek_space)(multi); |
23 | return isl_space_check_equal_tuples(space1: map_space, space2: multi_space); |
24 | } |
25 | |
26 | /* Apply "map_bound" to "map" with the corresponding value in "bound" |
27 | * for each output dimension. |
28 | * If "bound" has an explicit domain (which implies that "bound" |
29 | * is zero-dimensional), then intersect the domain of "map" |
30 | * with this explicit domain instead. |
31 | */ |
32 | static __isl_give isl_map *FN(map_bound_multi,BASE)(__isl_take isl_map *map, |
33 | __isl_take MULTI(BASE) *bound, |
34 | __isl_give isl_map *map_bound(__isl_take isl_map *map, |
35 | unsigned pos, __isl_take TYPE *value)) |
36 | { |
37 | int i; |
38 | isl_size dim; |
39 | |
40 | dim = isl_map_dim(map, type: isl_dim_out); |
41 | if (dim < 0 || FN(check_map_equal_tuples_multi,BASE)(map, multi: bound) < 0) |
42 | goto error; |
43 | |
44 | for (i = 0; i < dim; ++i) { |
45 | TYPE *el; |
46 | |
47 | el = FN(MULTI(BASE),get_at)(multi: bound, pos: i); |
48 | map = map_bound(map, i, el); |
49 | } |
50 | map = FN(FN(isl_map_intersect_multi,BASE),explicit_domain)(map, mv: bound); |
51 | FN(MULTI(BASE),free)(multi: bound); |
52 | return map; |
53 | error: |
54 | isl_map_free(map); |
55 | FN(MULTI(BASE),free)(multi: bound); |
56 | return NULL; |
57 | } |
58 | |