/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/polly/lib/External/isl/isl_map_lexopt_templ.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2010 INRIA Saclay |
3 | | * Copyright 2012 Ecole Normale Superieure |
4 | | * |
5 | | * Use of this software is governed by the MIT license |
6 | | * |
7 | | * Written by Sven Verdoolaege, |
8 | | * INRIA Saclay - Ile-de-France, Parc Club Orsay Universite, |
9 | | * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France |
10 | | * and Ecole Normale Superieure, 45 rue d’Ulm, 75230 Paris, France |
11 | | */ |
12 | | |
13 | | /* Function for computing the lexicographic optimum of a map |
14 | | * in the form of either an isl_map or an isl_pw_multi_aff. |
15 | | */ |
16 | | |
17 | 33.5k | #define xSF(TYPE,SUFFIX) TYPE ## SUFFIX |
18 | 33.5k | #define SF(TYPE,SUFFIX) xSF(TYPE,SUFFIX) |
19 | | |
20 | | /* Compute the lexicographic minimum (or maximum if "flags" includes |
21 | | * ISL_OPT_MAX) of "bmap" over the domain "dom" and return the result. |
22 | | * If "empty" is not NULL, then *empty is assigned a set that |
23 | | * contains those parts of the domain where there is no solution. |
24 | | * If "flags" includes ISL_OPT_FULL, then "dom" is NULL and the optimum |
25 | | * should be computed over the domain of "bmap". "empty" is also NULL |
26 | | * in this case. |
27 | | * If "bmap" is marked as rational (ISL_BASIC_MAP_RATIONAL), |
28 | | * then the rational optimum is computed. Otherwise, the integral optimum |
29 | | * is computed. |
30 | | */ |
31 | | static __isl_give TYPE *SF(isl_basic_map_partial_lexopt,SUFFIX)( |
32 | | __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom, |
33 | | __isl_give isl_set **empty, unsigned flags) |
34 | 7.85k | { |
35 | 7.85k | return SF(isl_tab_basic_map_partial_lexopt,SUFFIX)(bmap, dom, empty, |
36 | 7.85k | flags); |
37 | 7.85k | } isl_map.c:isl_basic_map_partial_lexopt_pw_multi_aff Line | Count | Source | 34 | 4.20k | { | 35 | 4.20k | return SF(isl_tab_basic_map_partial_lexopt,SUFFIX)(bmap, dom, empty, | 36 | 4.20k | flags); | 37 | 4.20k | } |
isl_map.c:isl_basic_map_partial_lexopt Line | Count | Source | 34 | 3.64k | { | 35 | 3.64k | return SF(isl_tab_basic_map_partial_lexopt,SUFFIX)(bmap, dom, empty, | 36 | 3.64k | flags); | 37 | 3.64k | } |
|
38 | | |
39 | | __isl_give TYPE *SF(isl_basic_map_partial_lexmax,SUFFIX)( |
40 | | __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom, |
41 | | __isl_give isl_set **empty) |
42 | 0 | { |
43 | 0 | unsigned flags = ISL_OPT_MAX; |
44 | 0 | return SF(isl_basic_map_partial_lexopt,SUFFIX)(bmap, dom, empty, flags); |
45 | 0 | } Unexecuted instantiation: isl_basic_map_partial_lexmax_pw_multi_aff Unexecuted instantiation: isl_basic_map_partial_lexmax |
46 | | |
47 | | __isl_give TYPE *SF(isl_basic_map_partial_lexmin,SUFFIX)( |
48 | | __isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom, |
49 | | __isl_give isl_set **empty) |
50 | 1 | { |
51 | 1 | unsigned flags = 0; |
52 | 1 | return SF(isl_basic_map_partial_lexopt,SUFFIX)(bmap, dom, empty, flags); |
53 | 1 | } Unexecuted instantiation: isl_basic_map_partial_lexmin_pw_multi_aff isl_basic_map_partial_lexmin Line | Count | Source | 50 | 1 | { | 51 | 1 | unsigned flags = 0; | 52 | 1 | return SF(isl_basic_map_partial_lexopt,SUFFIX)(bmap, dom, empty, flags); | 53 | 1 | } |
|
54 | | |
55 | | __isl_give TYPE *SF(isl_basic_set_partial_lexmin,SUFFIX)( |
56 | | __isl_take isl_basic_set *bset, __isl_take isl_basic_set *dom, |
57 | | __isl_give isl_set **empty) |
58 | 0 | { |
59 | 0 | return SF(isl_basic_map_partial_lexmin,SUFFIX)(bset, dom, empty); |
60 | 0 | } Unexecuted instantiation: isl_basic_set_partial_lexmin_pw_multi_aff Unexecuted instantiation: isl_basic_set_partial_lexmin |
61 | | |
62 | | __isl_give TYPE *SF(isl_basic_set_partial_lexmax,SUFFIX)( |
63 | | __isl_take isl_basic_set *bset, __isl_take isl_basic_set *dom, |
64 | | __isl_give isl_set **empty) |
65 | 0 | { |
66 | 0 | return SF(isl_basic_map_partial_lexmax,SUFFIX)(bset, dom, empty); |
67 | 0 | } Unexecuted instantiation: isl_basic_set_partial_lexmax_pw_multi_aff Unexecuted instantiation: isl_basic_set_partial_lexmax |
68 | | |
69 | | /* Given a basic map "bmap", compute the lexicographically minimal |
70 | | * (or maximal) image element for each domain element in dom. |
71 | | * If empty is not NULL, then set *empty to those elements in dom |
72 | | * that do not have an image element. |
73 | | * If "flags" includes ISL_OPT_FULL, then "dom" is NULL and the optimum |
74 | | * should be computed over the domain of "bmap". "empty" is also NULL |
75 | | * in this case. |
76 | | * |
77 | | * We first make sure the basic sets in dom are disjoint and then |
78 | | * simply collect the results over each of the basic sets separately. |
79 | | * We could probably improve the efficiency a bit by moving the union |
80 | | * domain down into the parametric integer programming. |
81 | | * |
82 | | * If a full optimum is being computed (i.e., "flags" includes ISL_OPT_FULL), |
83 | | * then no domain is given and there is then also no need to consider |
84 | | * the disjuncts of the domain. |
85 | | */ |
86 | | static __isl_give TYPE *SF(basic_map_partial_lexopt,SUFFIX)( |
87 | | __isl_take isl_basic_map *bmap, __isl_take isl_set *dom, |
88 | | __isl_give isl_set **empty, unsigned flags) |
89 | 8.99k | { |
90 | 8.99k | int i; |
91 | 8.99k | TYPE *res; |
92 | 8.99k | isl_set *all_empty; |
93 | 8.99k | |
94 | 8.99k | if (ISL_FL_ISSET(flags, ISL_OPT_FULL)) |
95 | 8.99k | return 3.46k SF3.46k (isl_basic_map_partial_lexopt,SUFFIX)(bmap, NULL, |
96 | 3.46k | empty, flags); |
97 | 5.53k | |
98 | 5.53k | dom = isl_set_make_disjoint(dom); |
99 | 5.53k | if (!dom) |
100 | 0 | goto error; |
101 | 5.53k | |
102 | 5.53k | if (isl_set_plain_is_empty(dom)) { |
103 | 2.73k | isl_space *space = isl_basic_map_get_space(bmap); |
104 | 2.73k | if (empty) |
105 | 2.73k | *empty = dom; |
106 | 0 | else |
107 | 0 | isl_set_free(dom); |
108 | 2.73k | isl_basic_map_free(bmap); |
109 | 2.73k | return EMPTY(space); |
110 | 2.73k | } |
111 | 2.79k | |
112 | 2.79k | res = SF(isl_basic_map_partial_lexopt,SUFFIX)(isl_basic_map_copy(bmap), |
113 | 2.79k | isl_basic_set_copy(dom->p[0]), empty, flags); |
114 | 2.79k | |
115 | 2.79k | if (empty) |
116 | 2.79k | all_empty = *empty; |
117 | 3.31k | for (i = 1; i < dom->n; ++i520 ) { |
118 | 520 | TYPE *res_i; |
119 | 520 | |
120 | 520 | res_i = SF(isl_basic_map_partial_lexopt,SUFFIX)( |
121 | 520 | isl_basic_map_copy(bmap), |
122 | 520 | isl_basic_set_copy(dom->p[i]), empty, flags); |
123 | 520 | |
124 | 520 | res = ADD(res, res_i); |
125 | 520 | if (empty) |
126 | 520 | all_empty = isl_set_union_disjoint(all_empty, *empty); |
127 | 520 | } |
128 | 2.79k | |
129 | 2.79k | if (empty) |
130 | 2.79k | *empty = all_empty; |
131 | 2.79k | isl_set_free(dom); |
132 | 2.79k | isl_basic_map_free(bmap); |
133 | 2.79k | return res; |
134 | 2.79k | error: |
135 | 0 | if (empty) |
136 | 0 | *empty = NULL; |
137 | 0 | isl_set_free(dom); |
138 | 0 | isl_basic_map_free(bmap); |
139 | 0 | return NULL; |
140 | 2.79k | } isl_map.c:basic_map_partial_lexopt_pw_multi_aff Line | Count | Source | 89 | 3.14k | { | 90 | 3.14k | int i; | 91 | 3.14k | TYPE *res; | 92 | 3.14k | isl_set *all_empty; | 93 | 3.14k | | 94 | 3.14k | if (ISL_FL_ISSET(flags, ISL_OPT_FULL)) | 95 | 3.14k | return 2.78k SF2.78k (isl_basic_map_partial_lexopt,SUFFIX)(bmap, NULL, | 96 | 2.78k | empty, flags); | 97 | 368 | | 98 | 368 | dom = isl_set_make_disjoint(dom); | 99 | 368 | if (!dom) | 100 | 0 | goto error; | 101 | 368 | | 102 | 368 | if (isl_set_plain_is_empty(dom)) { | 103 | 178 | isl_space *space = isl_basic_map_get_space(bmap); | 104 | 178 | if (empty) | 105 | 178 | *empty = dom; | 106 | 0 | else | 107 | 0 | isl_set_free(dom); | 108 | 178 | isl_basic_map_free(bmap); | 109 | 178 | return EMPTY(space); | 110 | 178 | } | 111 | 190 | | 112 | 190 | res = SF(isl_basic_map_partial_lexopt,SUFFIX)(isl_basic_map_copy(bmap), | 113 | 190 | isl_basic_set_copy(dom->p[0]), empty, flags); | 114 | 190 | | 115 | 190 | if (empty) | 116 | 190 | all_empty = *empty; | 117 | 567 | for (i = 1; i < dom->n; ++i377 ) { | 118 | 377 | TYPE *res_i; | 119 | 377 | | 120 | 377 | res_i = SF(isl_basic_map_partial_lexopt,SUFFIX)( | 121 | 377 | isl_basic_map_copy(bmap), | 122 | 377 | isl_basic_set_copy(dom->p[i]), empty, flags); | 123 | 377 | | 124 | 377 | res = ADD(res, res_i); | 125 | 377 | if (empty) | 126 | 377 | all_empty = isl_set_union_disjoint(all_empty, *empty); | 127 | 377 | } | 128 | 190 | | 129 | 190 | if (empty) | 130 | 190 | *empty = all_empty; | 131 | 190 | isl_set_free(dom); | 132 | 190 | isl_basic_map_free(bmap); | 133 | 190 | return res; | 134 | 190 | error: | 135 | 0 | if (empty) | 136 | 0 | *empty = NULL; | 137 | 0 | isl_set_free(dom); | 138 | 0 | isl_basic_map_free(bmap); | 139 | 0 | return NULL; | 140 | 190 | } |
isl_map.c:basic_map_partial_lexopt Line | Count | Source | 89 | 5.84k | { | 90 | 5.84k | int i; | 91 | 5.84k | TYPE *res; | 92 | 5.84k | isl_set *all_empty; | 93 | 5.84k | | 94 | 5.84k | if (ISL_FL_ISSET(flags, ISL_OPT_FULL)) | 95 | 5.84k | return 681 SF681 (isl_basic_map_partial_lexopt,SUFFIX)(bmap, NULL, | 96 | 681 | empty, flags); | 97 | 5.16k | | 98 | 5.16k | dom = isl_set_make_disjoint(dom); | 99 | 5.16k | if (!dom) | 100 | 0 | goto error; | 101 | 5.16k | | 102 | 5.16k | if (isl_set_plain_is_empty(dom)) { | 103 | 2.55k | isl_space *space = isl_basic_map_get_space(bmap); | 104 | 2.55k | if (empty) | 105 | 2.55k | *empty = dom; | 106 | 0 | else | 107 | 0 | isl_set_free(dom); | 108 | 2.55k | isl_basic_map_free(bmap); | 109 | 2.55k | return EMPTY(space); | 110 | 2.55k | } | 111 | 2.60k | | 112 | 2.60k | res = SF(isl_basic_map_partial_lexopt,SUFFIX)(isl_basic_map_copy(bmap), | 113 | 2.60k | isl_basic_set_copy(dom->p[0]), empty, flags); | 114 | 2.60k | | 115 | 2.60k | if (empty) | 116 | 2.60k | all_empty = *empty; | 117 | 2.75k | for (i = 1; i < dom->n; ++i143 ) { | 118 | 143 | TYPE *res_i; | 119 | 143 | | 120 | 143 | res_i = SF(isl_basic_map_partial_lexopt,SUFFIX)( | 121 | 143 | isl_basic_map_copy(bmap), | 122 | 143 | isl_basic_set_copy(dom->p[i]), empty, flags); | 123 | 143 | | 124 | 143 | res = ADD(res, res_i); | 125 | 143 | if (empty) | 126 | 143 | all_empty = isl_set_union_disjoint(all_empty, *empty); | 127 | 143 | } | 128 | 2.60k | | 129 | 2.60k | if (empty) | 130 | 2.60k | *empty = all_empty; | 131 | 2.60k | isl_set_free(dom); | 132 | 2.60k | isl_basic_map_free(bmap); | 133 | 2.60k | return res; | 134 | 2.60k | error: | 135 | 0 | if (empty) | 136 | 0 | *empty = NULL; | 137 | 0 | isl_set_free(dom); | 138 | 0 | isl_basic_map_free(bmap); | 139 | 0 | return NULL; | 140 | 2.60k | } |
|
141 | | |
142 | | /* Compute the lexicographic minimum (or maximum if "flags" includes |
143 | | * ISL_OPT_MAX) of "bmap" over its domain. |
144 | | */ |
145 | | __isl_give TYPE *SF(isl_basic_map_lexopt,SUFFIX)( |
146 | | __isl_take isl_basic_map *bmap, unsigned flags) |
147 | 1.07k | { |
148 | 1.07k | ISL_FL_SET(flags, ISL_OPT_FULL); |
149 | 1.07k | return SF(isl_basic_map_partial_lexopt,SUFFIX)(bmap, NULL, NULL, flags); |
150 | 1.07k | } isl_basic_map_lexopt_pw_multi_aff Line | Count | Source | 147 | 861 | { | 148 | 861 | ISL_FL_SET(flags, ISL_OPT_FULL); | 149 | 861 | return SF(isl_basic_map_partial_lexopt,SUFFIX)(bmap, NULL, NULL, flags); | 150 | 861 | } |
Line | Count | Source | 147 | 213 | { | 148 | 213 | ISL_FL_SET(flags, ISL_OPT_FULL); | 149 | 213 | return SF(isl_basic_map_partial_lexopt,SUFFIX)(bmap, NULL, NULL, flags); | 150 | 213 | } |
|
151 | | |
152 | | __isl_give TYPE *SF(isl_basic_map_lexmin,SUFFIX)(__isl_take isl_basic_map *bmap) |
153 | 77 | { |
154 | 77 | return SF(isl_basic_map_lexopt,SUFFIX)(bmap, 0); |
155 | 77 | } isl_basic_map_lexmin_pw_multi_aff Line | Count | Source | 153 | 77 | { | 154 | 77 | return SF(isl_basic_map_lexopt,SUFFIX)(bmap, 0); | 155 | 77 | } |
Unexecuted instantiation: isl_basic_map_lexmin |
156 | | |
157 | | static __isl_give TYPE *SF(isl_map_partial_lexopt_aligned,SUFFIX)( |
158 | | __isl_take isl_map *map, __isl_take isl_set *dom, |
159 | | __isl_give isl_set **empty, unsigned flags); |
160 | | /* This function is currently only used when TYPE is defined as isl_map. */ |
161 | | static __isl_give TYPE *SF(isl_map_partial_lexopt,SUFFIX)( |
162 | | __isl_take isl_map *map, __isl_take isl_set *dom, |
163 | | __isl_give isl_set **empty, unsigned flags) |
164 | | __attribute__ ((unused)); |
165 | | |
166 | | /* Given a map "map", compute the lexicographically minimal |
167 | | * (or maximal) image element for each domain element in dom. |
168 | | * Set *empty to those elements in dom that do not have an image element. |
169 | | * |
170 | | * Align parameters if needed and then call isl_map_partial_lexopt_aligned. |
171 | | */ |
172 | | static __isl_give TYPE *SF(isl_map_partial_lexopt,SUFFIX)( |
173 | | __isl_take isl_map *map, __isl_take isl_set *dom, |
174 | | __isl_give isl_set **empty, unsigned flags) |
175 | 12.1k | { |
176 | 12.1k | isl_bool aligned; |
177 | 12.1k | |
178 | 12.1k | aligned = isl_map_set_has_equal_params(map, dom); |
179 | 12.1k | if (aligned < 0) |
180 | 0 | goto error; |
181 | 12.1k | if (aligned) |
182 | 12.1k | return SF(isl_map_partial_lexopt_aligned,SUFFIX)(map, dom, |
183 | 12.1k | empty, flags); |
184 | 0 | if (!isl_space_has_named_params(map->dim) || |
185 | 0 | !isl_space_has_named_params(dom->dim)) |
186 | 0 | isl_die(map->ctx, isl_error_invalid, |
187 | 0 | "unaligned unnamed parameters", goto error); |
188 | 0 | map = isl_map_align_params(map, isl_map_get_space(dom)); |
189 | 0 | dom = isl_map_align_params(dom, isl_map_get_space(map)); |
190 | 0 | return SF(isl_map_partial_lexopt_aligned,SUFFIX)(map, dom, empty, |
191 | 0 | flags); |
192 | 0 | error: |
193 | 0 | if (empty) |
194 | 0 | *empty = NULL; |
195 | 0 | isl_set_free(dom); |
196 | 0 | isl_map_free(map); |
197 | 0 | return NULL; |
198 | 0 | } isl_map.c:isl_map_partial_lexopt Line | Count | Source | 175 | 12.1k | { | 176 | 12.1k | isl_bool aligned; | 177 | 12.1k | | 178 | 12.1k | aligned = isl_map_set_has_equal_params(map, dom); | 179 | 12.1k | if (aligned < 0) | 180 | 0 | goto error; | 181 | 12.1k | if (aligned) | 182 | 12.1k | return SF(isl_map_partial_lexopt_aligned,SUFFIX)(map, dom, | 183 | 12.1k | empty, flags); | 184 | 0 | if (!isl_space_has_named_params(map->dim) || | 185 | 0 | !isl_space_has_named_params(dom->dim)) | 186 | 0 | isl_die(map->ctx, isl_error_invalid, | 187 | 0 | "unaligned unnamed parameters", goto error); | 188 | 0 | map = isl_map_align_params(map, isl_map_get_space(dom)); | 189 | 0 | dom = isl_map_align_params(dom, isl_map_get_space(map)); | 190 | 0 | return SF(isl_map_partial_lexopt_aligned,SUFFIX)(map, dom, empty, | 191 | 0 | flags); | 192 | 0 | error: | 193 | 0 | if (empty) | 194 | 0 | *empty = NULL; | 195 | 0 | isl_set_free(dom); | 196 | 0 | isl_map_free(map); | 197 | 0 | return NULL; | 198 | 0 | } |
Unexecuted instantiation: isl_map.c:isl_map_partial_lexopt_pw_multi_aff |
199 | | |
200 | | /* Compute the lexicographic minimum (or maximum if "flags" includes |
201 | | * ISL_OPT_MAX) of "map" over its domain. |
202 | | */ |
203 | | __isl_give TYPE *SF(isl_map_lexopt,SUFFIX)(__isl_take isl_map *map, |
204 | | unsigned flags) |
205 | 2.17k | { |
206 | 2.17k | ISL_FL_SET(flags, ISL_OPT_FULL); |
207 | 2.17k | return SF(isl_map_partial_lexopt_aligned,SUFFIX)(map, NULL, NULL, |
208 | 2.17k | flags); |
209 | 2.17k | } isl_map_lexopt_pw_multi_aff Line | Count | Source | 205 | 1.09k | { | 206 | 1.09k | ISL_FL_SET(flags, ISL_OPT_FULL); | 207 | 1.09k | return SF(isl_map_partial_lexopt_aligned,SUFFIX)(map, NULL, NULL, | 208 | 1.09k | flags); | 209 | 1.09k | } |
Line | Count | Source | 205 | 1.07k | { | 206 | 1.07k | ISL_FL_SET(flags, ISL_OPT_FULL); | 207 | 1.07k | return SF(isl_map_partial_lexopt_aligned,SUFFIX)(map, NULL, NULL, | 208 | 1.07k | flags); | 209 | 1.07k | } |
|
210 | | |
211 | | __isl_give TYPE *SF(isl_map_lexmin,SUFFIX)(__isl_take isl_map *map) |
212 | 1.34k | { |
213 | 1.34k | return SF(isl_map_lexopt,SUFFIX)(map, 0); |
214 | 1.34k | } isl_map_lexmin_pw_multi_aff Line | Count | Source | 212 | 550 | { | 213 | 550 | return SF(isl_map_lexopt,SUFFIX)(map, 0); | 214 | 550 | } |
Line | Count | Source | 212 | 794 | { | 213 | 794 | return SF(isl_map_lexopt,SUFFIX)(map, 0); | 214 | 794 | } |
|
215 | | |
216 | | __isl_give TYPE *SF(isl_map_lexmax,SUFFIX)(__isl_take isl_map *map) |
217 | 832 | { |
218 | 832 | return SF(isl_map_lexopt,SUFFIX)(map, ISL_OPT_MAX); |
219 | 832 | } isl_map_lexmax_pw_multi_aff Line | Count | Source | 217 | 549 | { | 218 | 549 | return SF(isl_map_lexopt,SUFFIX)(map, ISL_OPT_MAX); | 219 | 549 | } |
Line | Count | Source | 217 | 283 | { | 218 | 283 | return SF(isl_map_lexopt,SUFFIX)(map, ISL_OPT_MAX); | 219 | 283 | } |
|
220 | | |
221 | | __isl_give TYPE *SF(isl_set_lexmin,SUFFIX)(__isl_take isl_set *set) |
222 | 685 | { |
223 | 685 | return SF(isl_map_lexmin,SUFFIX)(set); |
224 | 685 | } isl_set_lexmin_pw_multi_aff Line | Count | Source | 222 | 550 | { | 223 | 550 | return SF(isl_map_lexmin,SUFFIX)(set); | 224 | 550 | } |
Line | Count | Source | 222 | 135 | { | 223 | 135 | return SF(isl_map_lexmin,SUFFIX)(set); | 224 | 135 | } |
|
225 | | |
226 | | __isl_give TYPE *SF(isl_set_lexmax,SUFFIX)(__isl_take isl_set *set) |
227 | 550 | { |
228 | 550 | return SF(isl_map_lexmax,SUFFIX)(set); |
229 | 550 | } isl_set_lexmax_pw_multi_aff Line | Count | Source | 227 | 549 | { | 228 | 549 | return SF(isl_map_lexmax,SUFFIX)(set); | 229 | 549 | } |
Line | Count | Source | 227 | 1 | { | 228 | 1 | return SF(isl_map_lexmax,SUFFIX)(set); | 229 | 1 | } |
|