File: | polly/lib/External/isl/isl_space.c |
Warning: | line 233, column 9 Array access (via field 'ids') results in a null pointer dereference |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* | ||||||||||||||||
2 | * Copyright 2008-2009 Katholieke Universiteit Leuven | ||||||||||||||||
3 | * Copyright 2010 INRIA Saclay | ||||||||||||||||
4 | * Copyright 2013-2014 Ecole Normale Superieure | ||||||||||||||||
5 | * | ||||||||||||||||
6 | * Use of this software is governed by the MIT license | ||||||||||||||||
7 | * | ||||||||||||||||
8 | * Written by Sven Verdoolaege, K.U.Leuven, Departement | ||||||||||||||||
9 | * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium | ||||||||||||||||
10 | * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite, | ||||||||||||||||
11 | * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France | ||||||||||||||||
12 | * and Ecole Normale Superieure, 45 rue d’Ulm, 75230 Paris, France | ||||||||||||||||
13 | */ | ||||||||||||||||
14 | |||||||||||||||||
15 | #include <stdlib.h> | ||||||||||||||||
16 | #include <string.h> | ||||||||||||||||
17 | #include <isl_space_private.h> | ||||||||||||||||
18 | #include <isl_id_private.h> | ||||||||||||||||
19 | #include <isl_reordering.h> | ||||||||||||||||
20 | |||||||||||||||||
21 | isl_ctx *isl_space_get_ctx(__isl_keep isl_space *dim) | ||||||||||||||||
22 | { | ||||||||||||||||
23 | return dim ? dim->ctx : NULL((void*)0); | ||||||||||||||||
24 | } | ||||||||||||||||
25 | |||||||||||||||||
26 | __isl_give isl_space *isl_space_alloc(isl_ctx *ctx, | ||||||||||||||||
27 | unsigned nparam, unsigned n_in, unsigned n_out) | ||||||||||||||||
28 | { | ||||||||||||||||
29 | isl_space *dim; | ||||||||||||||||
30 | |||||||||||||||||
31 | dim = isl_alloc_type(ctx, struct isl_space)((struct isl_space *)isl_malloc_or_die(ctx, sizeof(struct isl_space ))); | ||||||||||||||||
32 | if (!dim) | ||||||||||||||||
33 | return NULL((void*)0); | ||||||||||||||||
34 | |||||||||||||||||
35 | dim->ctx = ctx; | ||||||||||||||||
36 | isl_ctx_ref(ctx); | ||||||||||||||||
37 | dim->ref = 1; | ||||||||||||||||
38 | dim->nparam = nparam; | ||||||||||||||||
39 | dim->n_in = n_in; | ||||||||||||||||
40 | dim->n_out = n_out; | ||||||||||||||||
41 | |||||||||||||||||
42 | dim->tuple_id[0] = NULL((void*)0); | ||||||||||||||||
43 | dim->tuple_id[1] = NULL((void*)0); | ||||||||||||||||
44 | |||||||||||||||||
45 | dim->nested[0] = NULL((void*)0); | ||||||||||||||||
46 | dim->nested[1] = NULL((void*)0); | ||||||||||||||||
47 | |||||||||||||||||
48 | dim->n_id = 0; | ||||||||||||||||
49 | dim->ids = NULL((void*)0); | ||||||||||||||||
50 | |||||||||||||||||
51 | return dim; | ||||||||||||||||
52 | } | ||||||||||||||||
53 | |||||||||||||||||
54 | /* Mark the space as being that of a set, by setting the domain tuple | ||||||||||||||||
55 | * to isl_id_none. | ||||||||||||||||
56 | */ | ||||||||||||||||
57 | static __isl_give isl_space *mark_as_set(__isl_take isl_space *space) | ||||||||||||||||
58 | { | ||||||||||||||||
59 | space = isl_space_cow(space); | ||||||||||||||||
60 | if (!space) | ||||||||||||||||
61 | return NULL((void*)0); | ||||||||||||||||
62 | space = isl_space_set_tuple_id(space, isl_dim_in, &isl_id_none); | ||||||||||||||||
63 | return space; | ||||||||||||||||
64 | } | ||||||||||||||||
65 | |||||||||||||||||
66 | /* Is the space that of a set? | ||||||||||||||||
67 | */ | ||||||||||||||||
68 | isl_bool isl_space_is_set(__isl_keep isl_space *space) | ||||||||||||||||
69 | { | ||||||||||||||||
70 | if (!space) | ||||||||||||||||
71 | return isl_bool_error; | ||||||||||||||||
72 | if (space->n_in != 0 || space->nested[0]) | ||||||||||||||||
73 | return isl_bool_false; | ||||||||||||||||
74 | if (space->tuple_id[0] != &isl_id_none) | ||||||||||||||||
75 | return isl_bool_false; | ||||||||||||||||
76 | return isl_bool_true; | ||||||||||||||||
77 | } | ||||||||||||||||
78 | |||||||||||||||||
79 | /* Is the given space that of a map? | ||||||||||||||||
80 | */ | ||||||||||||||||
81 | isl_bool isl_space_is_map(__isl_keep isl_space *space) | ||||||||||||||||
82 | { | ||||||||||||||||
83 | if (!space) | ||||||||||||||||
84 | return isl_bool_error; | ||||||||||||||||
85 | return space->tuple_id[0] != &isl_id_none && | ||||||||||||||||
86 | space->tuple_id[1] != &isl_id_none; | ||||||||||||||||
87 | } | ||||||||||||||||
88 | |||||||||||||||||
89 | __isl_give isl_space *isl_space_set_alloc(isl_ctx *ctx, | ||||||||||||||||
90 | unsigned nparam, unsigned dim) | ||||||||||||||||
91 | { | ||||||||||||||||
92 | isl_space *space; | ||||||||||||||||
93 | space = isl_space_alloc(ctx, nparam, 0, dim); | ||||||||||||||||
94 | space = mark_as_set(space); | ||||||||||||||||
95 | return space; | ||||||||||||||||
96 | } | ||||||||||||||||
97 | |||||||||||||||||
98 | /* Mark the space as being that of a parameter domain, by setting | ||||||||||||||||
99 | * both tuples to isl_id_none. | ||||||||||||||||
100 | */ | ||||||||||||||||
101 | static __isl_give isl_space *mark_as_params(isl_space *space) | ||||||||||||||||
102 | { | ||||||||||||||||
103 | if (!space) | ||||||||||||||||
104 | return NULL((void*)0); | ||||||||||||||||
105 | space = isl_space_set_tuple_id(space, isl_dim_in, &isl_id_none); | ||||||||||||||||
106 | space = isl_space_set_tuple_id(space, isl_dim_out, &isl_id_none); | ||||||||||||||||
107 | return space; | ||||||||||||||||
108 | } | ||||||||||||||||
109 | |||||||||||||||||
110 | /* Is the space that of a parameter domain? | ||||||||||||||||
111 | */ | ||||||||||||||||
112 | isl_bool isl_space_is_params(__isl_keep isl_space *space) | ||||||||||||||||
113 | { | ||||||||||||||||
114 | if (!space) | ||||||||||||||||
115 | return isl_bool_error; | ||||||||||||||||
116 | if (space->n_in != 0 || space->nested[0] || | ||||||||||||||||
117 | space->n_out != 0 || space->nested[1]) | ||||||||||||||||
118 | return isl_bool_false; | ||||||||||||||||
119 | if (space->tuple_id[0] != &isl_id_none) | ||||||||||||||||
120 | return isl_bool_false; | ||||||||||||||||
121 | if (space->tuple_id[1] != &isl_id_none) | ||||||||||||||||
122 | return isl_bool_false; | ||||||||||||||||
123 | return isl_bool_true; | ||||||||||||||||
124 | } | ||||||||||||||||
125 | |||||||||||||||||
126 | /* Create a space for a parameter domain. | ||||||||||||||||
127 | */ | ||||||||||||||||
128 | __isl_give isl_space *isl_space_params_alloc(isl_ctx *ctx, unsigned nparam) | ||||||||||||||||
129 | { | ||||||||||||||||
130 | isl_space *space; | ||||||||||||||||
131 | space = isl_space_alloc(ctx, nparam, 0, 0); | ||||||||||||||||
132 | space = mark_as_params(space); | ||||||||||||||||
133 | return space; | ||||||||||||||||
134 | } | ||||||||||||||||
135 | |||||||||||||||||
136 | static unsigned global_pos(__isl_keep isl_space *dim, | ||||||||||||||||
137 | enum isl_dim_type type, unsigned pos) | ||||||||||||||||
138 | { | ||||||||||||||||
139 | struct isl_ctx *ctx = dim->ctx; | ||||||||||||||||
140 | |||||||||||||||||
141 | switch (type) { | ||||||||||||||||
142 | case isl_dim_param: | ||||||||||||||||
143 | isl_assert
(ctx, isl_error_unknown, "Assertion \"" "pos < dim->nparam" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 144); return isl_space_dim(dim, isl_dim_all); } while (0); } while (0) | ||||||||||||||||
144 | return isl_space_dim(dim, isl_dim_all))do { if (pos < dim->nparam) break; do { isl_handle_error (ctx, isl_error_unknown, "Assertion \"" "pos < dim->nparam" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 144); return isl_space_dim(dim, isl_dim_all); } while (0); } while (0); | ||||||||||||||||
145 | return pos; | ||||||||||||||||
146 | case isl_dim_in: | ||||||||||||||||
147 | isl_assert(ctx, pos < dim->n_in,do { if (pos < dim->n_in) break; do { isl_handle_error( ctx, isl_error_unknown, "Assertion \"" "pos < dim->n_in" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 148); return isl_space_dim(dim, isl_dim_all); } while (0); } while (0) | ||||||||||||||||
148 | return isl_space_dim(dim, isl_dim_all))do { if (pos < dim->n_in) break; do { isl_handle_error( ctx, isl_error_unknown, "Assertion \"" "pos < dim->n_in" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 148); return isl_space_dim(dim, isl_dim_all); } while (0); } while (0); | ||||||||||||||||
149 | return pos + dim->nparam; | ||||||||||||||||
150 | case isl_dim_out: | ||||||||||||||||
151 | isl_assert(ctx, pos < dim->n_out,do { if (pos < dim->n_out) break; do { isl_handle_error (ctx, isl_error_unknown, "Assertion \"" "pos < dim->n_out" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 152); return isl_space_dim(dim, isl_dim_all); } while (0); } while (0) | ||||||||||||||||
152 | return isl_space_dim(dim, isl_dim_all))do { if (pos < dim->n_out) break; do { isl_handle_error (ctx, isl_error_unknown, "Assertion \"" "pos < dim->n_out" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 152); return isl_space_dim(dim, isl_dim_all); } while (0); } while (0); | ||||||||||||||||
153 | return pos + dim->nparam + dim->n_in; | ||||||||||||||||
154 | default: | ||||||||||||||||
155 | isl_assert(ctx, 0, return isl_space_dim(dim, isl_dim_all))do { if (0) break; do { isl_handle_error(ctx, isl_error_unknown , "Assertion \"" "0" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 155); return isl_space_dim(dim, isl_dim_all); } while (0); } while (0); | ||||||||||||||||
156 | } | ||||||||||||||||
157 | return isl_space_dim(dim, isl_dim_all); | ||||||||||||||||
158 | } | ||||||||||||||||
159 | |||||||||||||||||
160 | /* Extend length of ids array to the total number of dimensions. | ||||||||||||||||
161 | */ | ||||||||||||||||
162 | static __isl_give isl_space *extend_ids(__isl_take isl_space *dim) | ||||||||||||||||
163 | { | ||||||||||||||||
164 | isl_id **ids; | ||||||||||||||||
165 | int i; | ||||||||||||||||
166 | |||||||||||||||||
167 | if (isl_space_dim(dim, isl_dim_all) <= dim->n_id) | ||||||||||||||||
168 | return dim; | ||||||||||||||||
169 | |||||||||||||||||
170 | if (!dim->ids) { | ||||||||||||||||
171 | dim->ids = isl_calloc_array(dim->ctx,((isl_id * *)isl_calloc_or_die(dim->ctx, isl_space_dim(dim , isl_dim_all), sizeof(isl_id *))) | ||||||||||||||||
172 | isl_id *, isl_space_dim(dim, isl_dim_all))((isl_id * *)isl_calloc_or_die(dim->ctx, isl_space_dim(dim , isl_dim_all), sizeof(isl_id *))); | ||||||||||||||||
173 | if (!dim->ids) | ||||||||||||||||
174 | goto error; | ||||||||||||||||
175 | } else { | ||||||||||||||||
176 | ids = isl_realloc_array(dim->ctx, dim->ids,((isl_id * *)isl_realloc_or_die(dim->ctx, dim->ids, (isl_space_dim (dim, isl_dim_all))*sizeof(isl_id *))) | ||||||||||||||||
177 | isl_id *, isl_space_dim(dim, isl_dim_all))((isl_id * *)isl_realloc_or_die(dim->ctx, dim->ids, (isl_space_dim (dim, isl_dim_all))*sizeof(isl_id *))); | ||||||||||||||||
178 | if (!ids) | ||||||||||||||||
179 | goto error; | ||||||||||||||||
180 | dim->ids = ids; | ||||||||||||||||
181 | for (i = dim->n_id; i < isl_space_dim(dim, isl_dim_all); ++i) | ||||||||||||||||
182 | dim->ids[i] = NULL((void*)0); | ||||||||||||||||
183 | } | ||||||||||||||||
184 | |||||||||||||||||
185 | dim->n_id = isl_space_dim(dim, isl_dim_all); | ||||||||||||||||
186 | |||||||||||||||||
187 | return dim; | ||||||||||||||||
188 | error: | ||||||||||||||||
189 | isl_space_free(dim); | ||||||||||||||||
190 | return NULL((void*)0); | ||||||||||||||||
191 | } | ||||||||||||||||
192 | |||||||||||||||||
193 | static __isl_give isl_space *set_id(__isl_take isl_space *dim, | ||||||||||||||||
194 | enum isl_dim_type type, unsigned pos, __isl_take isl_id *id) | ||||||||||||||||
195 | { | ||||||||||||||||
196 | dim = isl_space_cow(dim); | ||||||||||||||||
197 | |||||||||||||||||
198 | if (!dim) | ||||||||||||||||
199 | goto error; | ||||||||||||||||
200 | |||||||||||||||||
201 | pos = global_pos(dim, type, pos); | ||||||||||||||||
202 | if (pos == isl_space_dim(dim, isl_dim_all)) | ||||||||||||||||
203 | goto error; | ||||||||||||||||
204 | |||||||||||||||||
205 | if (pos >= dim->n_id) { | ||||||||||||||||
206 | if (!id) | ||||||||||||||||
207 | return dim; | ||||||||||||||||
208 | dim = extend_ids(dim); | ||||||||||||||||
209 | if (!dim) | ||||||||||||||||
210 | goto error; | ||||||||||||||||
211 | } | ||||||||||||||||
212 | |||||||||||||||||
213 | dim->ids[pos] = id; | ||||||||||||||||
214 | |||||||||||||||||
215 | return dim; | ||||||||||||||||
216 | error: | ||||||||||||||||
217 | isl_id_free(id); | ||||||||||||||||
218 | isl_space_free(dim); | ||||||||||||||||
219 | return NULL((void*)0); | ||||||||||||||||
220 | } | ||||||||||||||||
221 | |||||||||||||||||
222 | static __isl_keep isl_id *get_id(__isl_keep isl_space *dim, | ||||||||||||||||
223 | enum isl_dim_type type, unsigned pos) | ||||||||||||||||
224 | { | ||||||||||||||||
225 | if (!dim
| ||||||||||||||||
226 | return NULL((void*)0); | ||||||||||||||||
227 | |||||||||||||||||
228 | pos = global_pos(dim, type, pos); | ||||||||||||||||
229 | if (pos == isl_space_dim(dim, isl_dim_all)) | ||||||||||||||||
230 | return NULL((void*)0); | ||||||||||||||||
231 | if (pos >= dim->n_id) | ||||||||||||||||
232 | return NULL((void*)0); | ||||||||||||||||
233 | return dim->ids[pos]; | ||||||||||||||||
| |||||||||||||||||
234 | } | ||||||||||||||||
235 | |||||||||||||||||
236 | static unsigned offset(__isl_keep isl_space *dim, enum isl_dim_type type) | ||||||||||||||||
237 | { | ||||||||||||||||
238 | switch (type) { | ||||||||||||||||
239 | case isl_dim_param: return 0; | ||||||||||||||||
240 | case isl_dim_in: return dim->nparam; | ||||||||||||||||
241 | case isl_dim_out: return dim->nparam + dim->n_in; | ||||||||||||||||
242 | default: return 0; | ||||||||||||||||
243 | } | ||||||||||||||||
244 | } | ||||||||||||||||
245 | |||||||||||||||||
246 | static unsigned n(__isl_keep isl_space *dim, enum isl_dim_type type) | ||||||||||||||||
247 | { | ||||||||||||||||
248 | switch (type) { | ||||||||||||||||
249 | case isl_dim_param: return dim->nparam; | ||||||||||||||||
250 | case isl_dim_in: return dim->n_in; | ||||||||||||||||
251 | case isl_dim_out: return dim->n_out; | ||||||||||||||||
252 | case isl_dim_all: return dim->nparam + dim->n_in + dim->n_out; | ||||||||||||||||
253 | default: return 0; | ||||||||||||||||
254 | } | ||||||||||||||||
255 | } | ||||||||||||||||
256 | |||||||||||||||||
257 | unsigned isl_space_dim(__isl_keep isl_space *dim, enum isl_dim_type type) | ||||||||||||||||
258 | { | ||||||||||||||||
259 | if (!dim
| ||||||||||||||||
260 | return 0; | ||||||||||||||||
261 | return n(dim, type); | ||||||||||||||||
262 | } | ||||||||||||||||
263 | |||||||||||||||||
264 | unsigned isl_space_offset(__isl_keep isl_space *dim, enum isl_dim_type type) | ||||||||||||||||
265 | { | ||||||||||||||||
266 | if (!dim) | ||||||||||||||||
267 | return 0; | ||||||||||||||||
268 | return offset(dim, type); | ||||||||||||||||
269 | } | ||||||||||||||||
270 | |||||||||||||||||
271 | static __isl_give isl_space *copy_ids(__isl_take isl_space *dst, | ||||||||||||||||
272 | enum isl_dim_type dst_type, unsigned offset, __isl_keep isl_space *src, | ||||||||||||||||
273 | enum isl_dim_type src_type) | ||||||||||||||||
274 | { | ||||||||||||||||
275 | int i; | ||||||||||||||||
276 | isl_id *id; | ||||||||||||||||
277 | |||||||||||||||||
278 | if (!dst) | ||||||||||||||||
279 | return NULL((void*)0); | ||||||||||||||||
280 | |||||||||||||||||
281 | for (i = 0; i < n(src, src_type); ++i) { | ||||||||||||||||
282 | id = get_id(src, src_type, i); | ||||||||||||||||
283 | if (!id) | ||||||||||||||||
284 | continue; | ||||||||||||||||
285 | dst = set_id(dst, dst_type, offset + i, isl_id_copy(id)); | ||||||||||||||||
286 | if (!dst) | ||||||||||||||||
287 | return NULL((void*)0); | ||||||||||||||||
288 | } | ||||||||||||||||
289 | return dst; | ||||||||||||||||
290 | } | ||||||||||||||||
291 | |||||||||||||||||
292 | __isl_take isl_space *isl_space_dup(__isl_keep isl_space *dim) | ||||||||||||||||
293 | { | ||||||||||||||||
294 | isl_space *dup; | ||||||||||||||||
295 | if (!dim) | ||||||||||||||||
296 | return NULL((void*)0); | ||||||||||||||||
297 | dup = isl_space_alloc(dim->ctx, dim->nparam, dim->n_in, dim->n_out); | ||||||||||||||||
298 | if (!dup) | ||||||||||||||||
299 | return NULL((void*)0); | ||||||||||||||||
300 | if (dim->tuple_id[0] && | ||||||||||||||||
301 | !(dup->tuple_id[0] = isl_id_copy(dim->tuple_id[0]))) | ||||||||||||||||
302 | goto error; | ||||||||||||||||
303 | if (dim->tuple_id[1] && | ||||||||||||||||
304 | !(dup->tuple_id[1] = isl_id_copy(dim->tuple_id[1]))) | ||||||||||||||||
305 | goto error; | ||||||||||||||||
306 | if (dim->nested[0] && !(dup->nested[0] = isl_space_copy(dim->nested[0]))) | ||||||||||||||||
307 | goto error; | ||||||||||||||||
308 | if (dim->nested[1] && !(dup->nested[1] = isl_space_copy(dim->nested[1]))) | ||||||||||||||||
309 | goto error; | ||||||||||||||||
310 | if (!dim->ids) | ||||||||||||||||
311 | return dup; | ||||||||||||||||
312 | dup = copy_ids(dup, isl_dim_param, 0, dim, isl_dim_param); | ||||||||||||||||
313 | dup = copy_ids(dup, isl_dim_in, 0, dim, isl_dim_in); | ||||||||||||||||
314 | dup = copy_ids(dup, isl_dim_out, 0, dim, isl_dim_out); | ||||||||||||||||
315 | return dup; | ||||||||||||||||
316 | error: | ||||||||||||||||
317 | isl_space_free(dup); | ||||||||||||||||
318 | return NULL((void*)0); | ||||||||||||||||
319 | } | ||||||||||||||||
320 | |||||||||||||||||
321 | __isl_give isl_space *isl_space_cow(__isl_take isl_space *dim) | ||||||||||||||||
322 | { | ||||||||||||||||
323 | if (!dim) | ||||||||||||||||
324 | return NULL((void*)0); | ||||||||||||||||
325 | |||||||||||||||||
326 | if (dim->ref == 1) | ||||||||||||||||
327 | return dim; | ||||||||||||||||
328 | dim->ref--; | ||||||||||||||||
329 | return isl_space_dup(dim); | ||||||||||||||||
330 | } | ||||||||||||||||
331 | |||||||||||||||||
332 | __isl_give isl_space *isl_space_copy(__isl_keep isl_space *dim) | ||||||||||||||||
333 | { | ||||||||||||||||
334 | if (!dim) | ||||||||||||||||
335 | return NULL((void*)0); | ||||||||||||||||
336 | |||||||||||||||||
337 | dim->ref++; | ||||||||||||||||
338 | return dim; | ||||||||||||||||
339 | } | ||||||||||||||||
340 | |||||||||||||||||
341 | __isl_null isl_space *isl_space_free(__isl_take isl_space *space) | ||||||||||||||||
342 | { | ||||||||||||||||
343 | int i; | ||||||||||||||||
344 | |||||||||||||||||
345 | if (!space) | ||||||||||||||||
346 | return NULL((void*)0); | ||||||||||||||||
347 | |||||||||||||||||
348 | if (--space->ref > 0) | ||||||||||||||||
349 | return NULL((void*)0); | ||||||||||||||||
350 | |||||||||||||||||
351 | isl_id_free(space->tuple_id[0]); | ||||||||||||||||
352 | isl_id_free(space->tuple_id[1]); | ||||||||||||||||
353 | |||||||||||||||||
354 | isl_space_free(space->nested[0]); | ||||||||||||||||
355 | isl_space_free(space->nested[1]); | ||||||||||||||||
356 | |||||||||||||||||
357 | for (i = 0; i < space->n_id; ++i) | ||||||||||||||||
358 | isl_id_free(space->ids[i]); | ||||||||||||||||
359 | free(space->ids); | ||||||||||||||||
360 | isl_ctx_deref(space->ctx); | ||||||||||||||||
361 | |||||||||||||||||
362 | free(space); | ||||||||||||||||
363 | |||||||||||||||||
364 | return NULL((void*)0); | ||||||||||||||||
365 | } | ||||||||||||||||
366 | |||||||||||||||||
367 | /* Check if "s" is a valid dimension or tuple name. | ||||||||||||||||
368 | * We currently only forbid names that look like a number. | ||||||||||||||||
369 | * | ||||||||||||||||
370 | * s is assumed to be non-NULL. | ||||||||||||||||
371 | */ | ||||||||||||||||
372 | static int name_ok(isl_ctx *ctx, const char *s) | ||||||||||||||||
373 | { | ||||||||||||||||
374 | char *p; | ||||||||||||||||
375 | long dummy; | ||||||||||||||||
376 | |||||||||||||||||
377 | dummy = strtol(s, &p, 0); | ||||||||||||||||
378 | if (p != s) | ||||||||||||||||
379 | isl_die(ctx, isl_error_invalid, "name looks like a number",do { isl_handle_error(ctx, isl_error_invalid, "name looks like a number" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 380); return 0; } while (0) | ||||||||||||||||
380 | return 0)do { isl_handle_error(ctx, isl_error_invalid, "name looks like a number" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 380); return 0; } while (0); | ||||||||||||||||
381 | |||||||||||||||||
382 | return 1; | ||||||||||||||||
383 | } | ||||||||||||||||
384 | |||||||||||||||||
385 | /* Is it possible for the given dimension type to have a tuple id? | ||||||||||||||||
386 | */ | ||||||||||||||||
387 | static int space_can_have_id(__isl_keep isl_space *space, | ||||||||||||||||
388 | enum isl_dim_type type) | ||||||||||||||||
389 | { | ||||||||||||||||
390 | if (!space) | ||||||||||||||||
391 | return 0; | ||||||||||||||||
392 | if (isl_space_is_params(space)) | ||||||||||||||||
393 | isl_die(space->ctx, isl_error_invalid,do { isl_handle_error(space->ctx, isl_error_invalid, "parameter spaces don't have tuple ids" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 394); return 0; } while (0) | ||||||||||||||||
394 | "parameter spaces don't have tuple ids", return 0)do { isl_handle_error(space->ctx, isl_error_invalid, "parameter spaces don't have tuple ids" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 394); return 0; } while (0); | ||||||||||||||||
395 | if (isl_space_is_set(space) && type != isl_dim_set) | ||||||||||||||||
396 | isl_die(space->ctx, isl_error_invalid,do { isl_handle_error(space->ctx, isl_error_invalid, "set spaces can only have a set id" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 397); return 0; } while (0) | ||||||||||||||||
397 | "set spaces can only have a set id", return 0)do { isl_handle_error(space->ctx, isl_error_invalid, "set spaces can only have a set id" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 397); return 0; } while (0); | ||||||||||||||||
398 | if (type != isl_dim_in && type != isl_dim_out) | ||||||||||||||||
399 | isl_die(space->ctx, isl_error_invalid,do { isl_handle_error(space->ctx, isl_error_invalid, "only input, output and set tuples can have ids" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 401); return 0; } while (0) | ||||||||||||||||
400 | "only input, output and set tuples can have ids",do { isl_handle_error(space->ctx, isl_error_invalid, "only input, output and set tuples can have ids" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 401); return 0; } while (0) | ||||||||||||||||
401 | return 0)do { isl_handle_error(space->ctx, isl_error_invalid, "only input, output and set tuples can have ids" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 401); return 0; } while (0); | ||||||||||||||||
402 | |||||||||||||||||
403 | return 1; | ||||||||||||||||
404 | } | ||||||||||||||||
405 | |||||||||||||||||
406 | /* Does the tuple have an id? | ||||||||||||||||
407 | */ | ||||||||||||||||
408 | isl_bool isl_space_has_tuple_id(__isl_keep isl_space *dim, | ||||||||||||||||
409 | enum isl_dim_type type) | ||||||||||||||||
410 | { | ||||||||||||||||
411 | if (!space_can_have_id(dim, type)) | ||||||||||||||||
412 | return isl_bool_error; | ||||||||||||||||
413 | return dim->tuple_id[type - isl_dim_in] != NULL((void*)0); | ||||||||||||||||
414 | } | ||||||||||||||||
415 | |||||||||||||||||
416 | __isl_give isl_id *isl_space_get_tuple_id(__isl_keep isl_space *dim, | ||||||||||||||||
417 | enum isl_dim_type type) | ||||||||||||||||
418 | { | ||||||||||||||||
419 | int has_id; | ||||||||||||||||
420 | |||||||||||||||||
421 | if (!dim) | ||||||||||||||||
422 | return NULL((void*)0); | ||||||||||||||||
423 | has_id = isl_space_has_tuple_id(dim, type); | ||||||||||||||||
424 | if (has_id < 0) | ||||||||||||||||
425 | return NULL((void*)0); | ||||||||||||||||
426 | if (!has_id) | ||||||||||||||||
427 | isl_die(dim->ctx, isl_error_invalid,do { isl_handle_error(dim->ctx, isl_error_invalid, "tuple has no id" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 428); return ((void*)0); } while (0) | ||||||||||||||||
428 | "tuple has no id", return NULL)do { isl_handle_error(dim->ctx, isl_error_invalid, "tuple has no id" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 428); return ((void*)0); } while (0); | ||||||||||||||||
429 | return isl_id_copy(dim->tuple_id[type - isl_dim_in]); | ||||||||||||||||
430 | } | ||||||||||||||||
431 | |||||||||||||||||
432 | __isl_give isl_space *isl_space_set_tuple_id(__isl_take isl_space *dim, | ||||||||||||||||
433 | enum isl_dim_type type, __isl_take isl_id *id) | ||||||||||||||||
434 | { | ||||||||||||||||
435 | dim = isl_space_cow(dim); | ||||||||||||||||
436 | if (!dim || !id) | ||||||||||||||||
437 | goto error; | ||||||||||||||||
438 | if (type != isl_dim_in && type != isl_dim_out) | ||||||||||||||||
439 | isl_die(dim->ctx, isl_error_invalid,do { isl_handle_error(dim->ctx, isl_error_invalid, "only input, output and set tuples can have names" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 441); goto error; } while (0) | ||||||||||||||||
440 | "only input, output and set tuples can have names",do { isl_handle_error(dim->ctx, isl_error_invalid, "only input, output and set tuples can have names" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 441); goto error; } while (0) | ||||||||||||||||
441 | goto error)do { isl_handle_error(dim->ctx, isl_error_invalid, "only input, output and set tuples can have names" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 441); goto error; } while (0); | ||||||||||||||||
442 | |||||||||||||||||
443 | isl_id_free(dim->tuple_id[type - isl_dim_in]); | ||||||||||||||||
444 | dim->tuple_id[type - isl_dim_in] = id; | ||||||||||||||||
445 | |||||||||||||||||
446 | return dim; | ||||||||||||||||
447 | error: | ||||||||||||||||
448 | isl_id_free(id); | ||||||||||||||||
449 | isl_space_free(dim); | ||||||||||||||||
450 | return NULL((void*)0); | ||||||||||||||||
451 | } | ||||||||||||||||
452 | |||||||||||||||||
453 | __isl_give isl_space *isl_space_reset_tuple_id(__isl_take isl_space *dim, | ||||||||||||||||
454 | enum isl_dim_type type) | ||||||||||||||||
455 | { | ||||||||||||||||
456 | dim = isl_space_cow(dim); | ||||||||||||||||
457 | if (!dim) | ||||||||||||||||
458 | return NULL((void*)0); | ||||||||||||||||
459 | if (type != isl_dim_in && type != isl_dim_out) | ||||||||||||||||
460 | isl_die(dim->ctx, isl_error_invalid,do { isl_handle_error(dim->ctx, isl_error_invalid, "only input, output and set tuples can have names" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 462); goto error; } while (0) | ||||||||||||||||
461 | "only input, output and set tuples can have names",do { isl_handle_error(dim->ctx, isl_error_invalid, "only input, output and set tuples can have names" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 462); goto error; } while (0) | ||||||||||||||||
462 | goto error)do { isl_handle_error(dim->ctx, isl_error_invalid, "only input, output and set tuples can have names" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 462); goto error; } while (0); | ||||||||||||||||
463 | |||||||||||||||||
464 | isl_id_free(dim->tuple_id[type - isl_dim_in]); | ||||||||||||||||
465 | dim->tuple_id[type - isl_dim_in] = NULL((void*)0); | ||||||||||||||||
466 | |||||||||||||||||
467 | return dim; | ||||||||||||||||
468 | error: | ||||||||||||||||
469 | isl_space_free(dim); | ||||||||||||||||
470 | return NULL((void*)0); | ||||||||||||||||
471 | } | ||||||||||||||||
472 | |||||||||||||||||
473 | /* Set the id of the given dimension of "space" to "id". | ||||||||||||||||
474 | * If the dimension already has an id, then it is replaced. | ||||||||||||||||
475 | * If the dimension is a parameter, then we need to change it | ||||||||||||||||
476 | * in the nested spaces (if any) as well. | ||||||||||||||||
477 | */ | ||||||||||||||||
478 | __isl_give isl_space *isl_space_set_dim_id(__isl_take isl_space *space, | ||||||||||||||||
479 | enum isl_dim_type type, unsigned pos, __isl_take isl_id *id) | ||||||||||||||||
480 | { | ||||||||||||||||
481 | space = isl_space_cow(space); | ||||||||||||||||
482 | if (!space || !id) | ||||||||||||||||
483 | goto error; | ||||||||||||||||
484 | |||||||||||||||||
485 | if (type == isl_dim_param) { | ||||||||||||||||
486 | int i; | ||||||||||||||||
487 | |||||||||||||||||
488 | for (i = 0; i < 2; ++i) { | ||||||||||||||||
489 | if (!space->nested[i]) | ||||||||||||||||
490 | continue; | ||||||||||||||||
491 | space->nested[i] = | ||||||||||||||||
492 | isl_space_set_dim_id(space->nested[i], | ||||||||||||||||
493 | type, pos, isl_id_copy(id)); | ||||||||||||||||
494 | if (!space->nested[i]) | ||||||||||||||||
495 | goto error; | ||||||||||||||||
496 | } | ||||||||||||||||
497 | } | ||||||||||||||||
498 | |||||||||||||||||
499 | isl_id_free(get_id(space, type, pos)); | ||||||||||||||||
500 | return set_id(space, type, pos, id); | ||||||||||||||||
501 | error: | ||||||||||||||||
502 | isl_id_free(id); | ||||||||||||||||
503 | isl_space_free(space); | ||||||||||||||||
504 | return NULL((void*)0); | ||||||||||||||||
505 | } | ||||||||||||||||
506 | |||||||||||||||||
507 | /* Reset the id of the given dimension of "space". | ||||||||||||||||
508 | * If the dimension already has an id, then it is removed. | ||||||||||||||||
509 | * If the dimension is a parameter, then we need to reset it | ||||||||||||||||
510 | * in the nested spaces (if any) as well. | ||||||||||||||||
511 | */ | ||||||||||||||||
512 | __isl_give isl_space *isl_space_reset_dim_id(__isl_take isl_space *space, | ||||||||||||||||
513 | enum isl_dim_type type, unsigned pos) | ||||||||||||||||
514 | { | ||||||||||||||||
515 | space = isl_space_cow(space); | ||||||||||||||||
516 | if (!space) | ||||||||||||||||
517 | goto error; | ||||||||||||||||
518 | |||||||||||||||||
519 | if (type == isl_dim_param) { | ||||||||||||||||
520 | int i; | ||||||||||||||||
521 | |||||||||||||||||
522 | for (i = 0; i < 2; ++i) { | ||||||||||||||||
523 | if (!space->nested[i]) | ||||||||||||||||
524 | continue; | ||||||||||||||||
525 | space->nested[i] = | ||||||||||||||||
526 | isl_space_reset_dim_id(space->nested[i], | ||||||||||||||||
527 | type, pos); | ||||||||||||||||
528 | if (!space->nested[i]) | ||||||||||||||||
529 | goto error; | ||||||||||||||||
530 | } | ||||||||||||||||
531 | } | ||||||||||||||||
532 | |||||||||||||||||
533 | isl_id_free(get_id(space, type, pos)); | ||||||||||||||||
534 | return set_id(space, type, pos, NULL((void*)0)); | ||||||||||||||||
535 | error: | ||||||||||||||||
536 | isl_space_free(space); | ||||||||||||||||
537 | return NULL((void*)0); | ||||||||||||||||
538 | } | ||||||||||||||||
539 | |||||||||||||||||
540 | isl_bool isl_space_has_dim_id(__isl_keep isl_space *dim, | ||||||||||||||||
541 | enum isl_dim_type type, unsigned pos) | ||||||||||||||||
542 | { | ||||||||||||||||
543 | if (!dim) | ||||||||||||||||
544 | return isl_bool_error; | ||||||||||||||||
545 | return get_id(dim, type, pos) != NULL((void*)0); | ||||||||||||||||
546 | } | ||||||||||||||||
547 | |||||||||||||||||
548 | __isl_give isl_id *isl_space_get_dim_id(__isl_keep isl_space *dim, | ||||||||||||||||
549 | enum isl_dim_type type, unsigned pos) | ||||||||||||||||
550 | { | ||||||||||||||||
551 | if (!dim) | ||||||||||||||||
552 | return NULL((void*)0); | ||||||||||||||||
553 | if (!get_id(dim, type, pos)) | ||||||||||||||||
554 | isl_die(dim->ctx, isl_error_invalid,do { isl_handle_error(dim->ctx, isl_error_invalid, "dim has no id" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 555); return ((void*)0); } while (0) | ||||||||||||||||
555 | "dim has no id", return NULL)do { isl_handle_error(dim->ctx, isl_error_invalid, "dim has no id" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 555); return ((void*)0); } while (0); | ||||||||||||||||
556 | return isl_id_copy(get_id(dim, type, pos)); | ||||||||||||||||
557 | } | ||||||||||||||||
558 | |||||||||||||||||
559 | __isl_give isl_space *isl_space_set_tuple_name(__isl_take isl_space *dim, | ||||||||||||||||
560 | enum isl_dim_type type, const char *s) | ||||||||||||||||
561 | { | ||||||||||||||||
562 | isl_id *id; | ||||||||||||||||
563 | |||||||||||||||||
564 | if (!dim) | ||||||||||||||||
565 | return NULL((void*)0); | ||||||||||||||||
566 | |||||||||||||||||
567 | if (!s) | ||||||||||||||||
568 | return isl_space_reset_tuple_id(dim, type); | ||||||||||||||||
569 | |||||||||||||||||
570 | if (!name_ok(dim->ctx, s)) | ||||||||||||||||
571 | goto error; | ||||||||||||||||
572 | |||||||||||||||||
573 | id = isl_id_alloc(dim->ctx, s, NULL((void*)0)); | ||||||||||||||||
574 | return isl_space_set_tuple_id(dim, type, id); | ||||||||||||||||
575 | error: | ||||||||||||||||
576 | isl_space_free(dim); | ||||||||||||||||
577 | return NULL((void*)0); | ||||||||||||||||
578 | } | ||||||||||||||||
579 | |||||||||||||||||
580 | /* Does the tuple have a name? | ||||||||||||||||
581 | */ | ||||||||||||||||
582 | isl_bool isl_space_has_tuple_name(__isl_keep isl_space *space, | ||||||||||||||||
583 | enum isl_dim_type type) | ||||||||||||||||
584 | { | ||||||||||||||||
585 | isl_id *id; | ||||||||||||||||
586 | |||||||||||||||||
587 | if (!space_can_have_id(space, type)) | ||||||||||||||||
588 | return isl_bool_error; | ||||||||||||||||
589 | id = space->tuple_id[type - isl_dim_in]; | ||||||||||||||||
590 | return id && id->name; | ||||||||||||||||
591 | } | ||||||||||||||||
592 | |||||||||||||||||
593 | __isl_keep const char *isl_space_get_tuple_name(__isl_keep isl_space *dim, | ||||||||||||||||
594 | enum isl_dim_type type) | ||||||||||||||||
595 | { | ||||||||||||||||
596 | isl_id *id; | ||||||||||||||||
597 | if (!dim) | ||||||||||||||||
598 | return NULL((void*)0); | ||||||||||||||||
599 | if (type != isl_dim_in && type != isl_dim_out) | ||||||||||||||||
600 | return NULL((void*)0); | ||||||||||||||||
601 | id = dim->tuple_id[type - isl_dim_in]; | ||||||||||||||||
602 | return id ? id->name : NULL((void*)0); | ||||||||||||||||
603 | } | ||||||||||||||||
604 | |||||||||||||||||
605 | __isl_give isl_space *isl_space_set_dim_name(__isl_take isl_space *dim, | ||||||||||||||||
606 | enum isl_dim_type type, unsigned pos, | ||||||||||||||||
607 | const char *s) | ||||||||||||||||
608 | { | ||||||||||||||||
609 | isl_id *id; | ||||||||||||||||
610 | |||||||||||||||||
611 | if (!dim) | ||||||||||||||||
612 | return NULL((void*)0); | ||||||||||||||||
613 | if (!s) | ||||||||||||||||
614 | return isl_space_reset_dim_id(dim, type, pos); | ||||||||||||||||
615 | if (!name_ok(dim->ctx, s)) | ||||||||||||||||
616 | goto error; | ||||||||||||||||
617 | id = isl_id_alloc(dim->ctx, s, NULL((void*)0)); | ||||||||||||||||
618 | return isl_space_set_dim_id(dim, type, pos, id); | ||||||||||||||||
619 | error: | ||||||||||||||||
620 | isl_space_free(dim); | ||||||||||||||||
621 | return NULL((void*)0); | ||||||||||||||||
622 | } | ||||||||||||||||
623 | |||||||||||||||||
624 | /* Does the given dimension have a name? | ||||||||||||||||
625 | */ | ||||||||||||||||
626 | isl_bool isl_space_has_dim_name(__isl_keep isl_space *space, | ||||||||||||||||
627 | enum isl_dim_type type, unsigned pos) | ||||||||||||||||
628 | { | ||||||||||||||||
629 | isl_id *id; | ||||||||||||||||
630 | |||||||||||||||||
631 | if (!space) | ||||||||||||||||
632 | return isl_bool_error; | ||||||||||||||||
633 | id = get_id(space, type, pos); | ||||||||||||||||
634 | return id && id->name; | ||||||||||||||||
635 | } | ||||||||||||||||
636 | |||||||||||||||||
637 | __isl_keep const char *isl_space_get_dim_name(__isl_keep isl_space *dim, | ||||||||||||||||
638 | enum isl_dim_type type, unsigned pos) | ||||||||||||||||
639 | { | ||||||||||||||||
640 | isl_id *id = get_id(dim, type, pos); | ||||||||||||||||
641 | return id ? id->name : NULL((void*)0); | ||||||||||||||||
642 | } | ||||||||||||||||
643 | |||||||||||||||||
644 | int isl_space_find_dim_by_id(__isl_keep isl_space *dim, enum isl_dim_type type, | ||||||||||||||||
645 | __isl_keep isl_id *id) | ||||||||||||||||
646 | { | ||||||||||||||||
647 | int i; | ||||||||||||||||
648 | int offset; | ||||||||||||||||
649 | int n; | ||||||||||||||||
650 | |||||||||||||||||
651 | if (!dim || !id) | ||||||||||||||||
652 | return -1; | ||||||||||||||||
653 | |||||||||||||||||
654 | offset = isl_space_offset(dim, type); | ||||||||||||||||
655 | n = isl_space_dim(dim, type); | ||||||||||||||||
656 | for (i = 0; i < n && offset + i < dim->n_id; ++i) | ||||||||||||||||
657 | if (dim->ids[offset + i] == id) | ||||||||||||||||
658 | return i; | ||||||||||||||||
659 | |||||||||||||||||
660 | return -1; | ||||||||||||||||
661 | } | ||||||||||||||||
662 | |||||||||||||||||
663 | int isl_space_find_dim_by_name(__isl_keep isl_space *space, | ||||||||||||||||
664 | enum isl_dim_type type, const char *name) | ||||||||||||||||
665 | { | ||||||||||||||||
666 | int i; | ||||||||||||||||
667 | int offset; | ||||||||||||||||
668 | int n; | ||||||||||||||||
669 | |||||||||||||||||
670 | if (!space || !name) | ||||||||||||||||
671 | return -1; | ||||||||||||||||
672 | |||||||||||||||||
673 | offset = isl_space_offset(space, type); | ||||||||||||||||
674 | n = isl_space_dim(space, type); | ||||||||||||||||
675 | for (i = 0; i < n && offset + i < space->n_id; ++i) { | ||||||||||||||||
676 | isl_id *id = get_id(space, type, i); | ||||||||||||||||
677 | if (id && id->name && !strcmp(id->name, name)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (id->name) && __builtin_constant_p (name) && (__s1_len = __builtin_strlen (id->name), __s2_len = __builtin_strlen (name), (!((size_t)(const void *)((id->name) + 1) - (size_t )(const void *)(id->name) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((name) + 1) - (size_t)(const void * )(name) == 1) || __s2_len >= 4)) ? __builtin_strcmp (id-> name, name) : (__builtin_constant_p (id->name) && ( (size_t)(const void *)((id->name) + 1) - (size_t)(const void *)(id->name) == 1) && (__s1_len = __builtin_strlen (id->name), __s1_len < 4) ? (__builtin_constant_p (name ) && ((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) ? __builtin_strcmp (id->name, name) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (name); int __result = (((const unsigned char *) (const char *) (id->name))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (id->name))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (id->name))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (id->name))[3] - __s2[3]); } } __result ; }))) : (__builtin_constant_p (name) && ((size_t)(const void *)((name) + 1) - (size_t)(const void *)(name) == 1) && (__s2_len = __builtin_strlen (name), __s2_len < 4) ? (__builtin_constant_p (id->name) && ((size_t)(const void *)((id->name ) + 1) - (size_t)(const void *)(id->name) == 1) ? __builtin_strcmp (id->name, name) : -(__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (id->name) ; int __result = (((const unsigned char *) (const char *) (name ))[0] - __s2[0]); if (__s2_len > 0 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (name ))[1] - __s2[1]); if (__s2_len > 1 && __result == 0 ) { __result = (((const unsigned char *) (const char *) (name ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0 ) __result = (((const unsigned char *) (const char *) (name)) [3] - __s2[3]); } } __result; }))) : __builtin_strcmp (id-> name, name)))); })) | ||||||||||||||||
678 | return i; | ||||||||||||||||
679 | } | ||||||||||||||||
680 | |||||||||||||||||
681 | return -1; | ||||||||||||||||
682 | } | ||||||||||||||||
683 | |||||||||||||||||
684 | /* Reset the user pointer on all identifiers of parameters and tuples | ||||||||||||||||
685 | * of "space". | ||||||||||||||||
686 | */ | ||||||||||||||||
687 | __isl_give isl_space *isl_space_reset_user(__isl_take isl_space *space) | ||||||||||||||||
688 | { | ||||||||||||||||
689 | int i; | ||||||||||||||||
690 | isl_ctx *ctx; | ||||||||||||||||
691 | isl_id *id; | ||||||||||||||||
692 | const char *name; | ||||||||||||||||
693 | |||||||||||||||||
694 | if (!space) | ||||||||||||||||
695 | return NULL((void*)0); | ||||||||||||||||
696 | |||||||||||||||||
697 | ctx = isl_space_get_ctx(space); | ||||||||||||||||
698 | |||||||||||||||||
699 | for (i = 0; i < space->nparam && i < space->n_id; ++i) { | ||||||||||||||||
700 | if (!isl_id_get_user(space->ids[i])) | ||||||||||||||||
701 | continue; | ||||||||||||||||
702 | space = isl_space_cow(space); | ||||||||||||||||
703 | if (!space) | ||||||||||||||||
704 | return NULL((void*)0); | ||||||||||||||||
705 | name = isl_id_get_name(space->ids[i]); | ||||||||||||||||
706 | id = isl_id_alloc(ctx, name, NULL((void*)0)); | ||||||||||||||||
707 | isl_id_free(space->ids[i]); | ||||||||||||||||
708 | space->ids[i] = id; | ||||||||||||||||
709 | if (!id) | ||||||||||||||||
710 | return isl_space_free(space); | ||||||||||||||||
711 | } | ||||||||||||||||
712 | |||||||||||||||||
713 | for (i = 0; i < 2; ++i) { | ||||||||||||||||
714 | if (!space->tuple_id[i]) | ||||||||||||||||
715 | continue; | ||||||||||||||||
716 | if (!isl_id_get_user(space->tuple_id[i])) | ||||||||||||||||
717 | continue; | ||||||||||||||||
718 | space = isl_space_cow(space); | ||||||||||||||||
719 | if (!space) | ||||||||||||||||
720 | return NULL((void*)0); | ||||||||||||||||
721 | name = isl_id_get_name(space->tuple_id[i]); | ||||||||||||||||
722 | id = isl_id_alloc(ctx, name, NULL((void*)0)); | ||||||||||||||||
723 | isl_id_free(space->tuple_id[i]); | ||||||||||||||||
724 | space->tuple_id[i] = id; | ||||||||||||||||
725 | if (!id) | ||||||||||||||||
726 | return isl_space_free(space); | ||||||||||||||||
727 | } | ||||||||||||||||
728 | |||||||||||||||||
729 | for (i = 0; i < 2; ++i) { | ||||||||||||||||
730 | if (!space->nested[i]) | ||||||||||||||||
731 | continue; | ||||||||||||||||
732 | space = isl_space_cow(space); | ||||||||||||||||
733 | if (!space) | ||||||||||||||||
734 | return NULL((void*)0); | ||||||||||||||||
735 | space->nested[i] = isl_space_reset_user(space->nested[i]); | ||||||||||||||||
736 | if (!space->nested[i]) | ||||||||||||||||
737 | return isl_space_free(space); | ||||||||||||||||
738 | } | ||||||||||||||||
739 | |||||||||||||||||
740 | return space; | ||||||||||||||||
741 | } | ||||||||||||||||
742 | |||||||||||||||||
743 | static __isl_keep isl_id *tuple_id(__isl_keep isl_space *dim, | ||||||||||||||||
744 | enum isl_dim_type type) | ||||||||||||||||
745 | { | ||||||||||||||||
746 | if (!dim
| ||||||||||||||||
747 | return NULL((void*)0); | ||||||||||||||||
748 | if (type
| ||||||||||||||||
749 | return dim->tuple_id[0]; | ||||||||||||||||
750 | if (type
| ||||||||||||||||
751 | return dim->tuple_id[1]; | ||||||||||||||||
752 | return NULL((void*)0); | ||||||||||||||||
753 | } | ||||||||||||||||
754 | |||||||||||||||||
755 | static __isl_keep isl_space *nested(__isl_keep isl_space *dim, | ||||||||||||||||
756 | enum isl_dim_type type) | ||||||||||||||||
757 | { | ||||||||||||||||
758 | if (!dim
| ||||||||||||||||
759 | return NULL((void*)0); | ||||||||||||||||
760 | if (type
| ||||||||||||||||
761 | return dim->nested[0]; | ||||||||||||||||
762 | if (type
| ||||||||||||||||
763 | return dim->nested[1]; | ||||||||||||||||
764 | return NULL((void*)0); | ||||||||||||||||
765 | } | ||||||||||||||||
766 | |||||||||||||||||
767 | /* Are the two spaces the same, apart from positions and names of parameters? | ||||||||||||||||
768 | */ | ||||||||||||||||
769 | isl_bool isl_space_has_equal_tuples(__isl_keep isl_space *space1, | ||||||||||||||||
770 | __isl_keep isl_space *space2) | ||||||||||||||||
771 | { | ||||||||||||||||
772 | if (!space1 || !space2) | ||||||||||||||||
773 | return isl_bool_error; | ||||||||||||||||
774 | if (space1 == space2) | ||||||||||||||||
775 | return isl_bool_true; | ||||||||||||||||
776 | return isl_space_tuple_is_equal(space1, isl_dim_in, | ||||||||||||||||
777 | space2, isl_dim_in) && | ||||||||||||||||
778 | isl_space_tuple_is_equal(space1, isl_dim_out, | ||||||||||||||||
779 | space2, isl_dim_out); | ||||||||||||||||
780 | } | ||||||||||||||||
781 | |||||||||||||||||
782 | /* Check if the tuple of type "type1" of "space1" is the same as | ||||||||||||||||
783 | * the tuple of type "type2" of "space2". | ||||||||||||||||
784 | * | ||||||||||||||||
785 | * That is, check if the tuples have the same identifier, the same dimension | ||||||||||||||||
786 | * and the same internal structure. | ||||||||||||||||
787 | * The identifiers of the dimensions inside the tuples do not affect the result. | ||||||||||||||||
788 | * | ||||||||||||||||
789 | * Note that this function only checks the tuples themselves. | ||||||||||||||||
790 | * If nested tuples are involved, then we need to be careful not | ||||||||||||||||
791 | * to have result affected by possibly differing parameters | ||||||||||||||||
792 | * in those nested tuples. | ||||||||||||||||
793 | */ | ||||||||||||||||
794 | isl_bool isl_space_tuple_is_equal(__isl_keep isl_space *space1, | ||||||||||||||||
795 | enum isl_dim_type type1, __isl_keep isl_space *space2, | ||||||||||||||||
796 | enum isl_dim_type type2) | ||||||||||||||||
797 | { | ||||||||||||||||
798 | isl_id *id1, *id2; | ||||||||||||||||
799 | isl_space *nested1, *nested2; | ||||||||||||||||
800 | |||||||||||||||||
801 | if (!space1 || !space2) | ||||||||||||||||
802 | return isl_bool_error; | ||||||||||||||||
803 | |||||||||||||||||
804 | if (space1 == space2 && type1 == type2) | ||||||||||||||||
805 | return isl_bool_true; | ||||||||||||||||
806 | |||||||||||||||||
807 | if (n(space1, type1) != n(space2, type2)) | ||||||||||||||||
808 | return isl_bool_false; | ||||||||||||||||
809 | id1 = tuple_id(space1, type1); | ||||||||||||||||
810 | id2 = tuple_id(space2, type2); | ||||||||||||||||
811 | if (!id1 ^ !id2) | ||||||||||||||||
812 | return isl_bool_false; | ||||||||||||||||
813 | if (id1 && id1 != id2) | ||||||||||||||||
814 | return isl_bool_false; | ||||||||||||||||
815 | nested1 = nested(space1, type1); | ||||||||||||||||
816 | nested2 = nested(space2, type2); | ||||||||||||||||
817 | if (!nested1 ^ !nested2) | ||||||||||||||||
818 | return isl_bool_false; | ||||||||||||||||
819 | if (nested1 && !isl_space_has_equal_tuples(nested1, nested2)) | ||||||||||||||||
820 | return isl_bool_false; | ||||||||||||||||
821 | return isl_bool_true; | ||||||||||||||||
822 | } | ||||||||||||||||
823 | |||||||||||||||||
824 | static isl_bool match(__isl_keep isl_space *space1, enum isl_dim_type type1, | ||||||||||||||||
825 | __isl_keep isl_space *space2, enum isl_dim_type type2) | ||||||||||||||||
826 | { | ||||||||||||||||
827 | int i; | ||||||||||||||||
828 | |||||||||||||||||
829 | if (space1 == space2 && type1 == type2) | ||||||||||||||||
830 | return isl_bool_true; | ||||||||||||||||
831 | |||||||||||||||||
832 | if (!isl_space_tuple_is_equal(space1, type1, space2, type2)) | ||||||||||||||||
833 | return isl_bool_false; | ||||||||||||||||
834 | |||||||||||||||||
835 | if (!space1->ids && !space2->ids) | ||||||||||||||||
836 | return isl_bool_true; | ||||||||||||||||
837 | |||||||||||||||||
838 | for (i = 0; i < n(space1, type1); ++i) { | ||||||||||||||||
839 | if (get_id(space1, type1, i) != get_id(space2, type2, i)) | ||||||||||||||||
840 | return isl_bool_false; | ||||||||||||||||
841 | } | ||||||||||||||||
842 | return isl_bool_true; | ||||||||||||||||
843 | } | ||||||||||||||||
844 | |||||||||||||||||
845 | /* Do "space1" and "space2" have the same parameters? | ||||||||||||||||
846 | */ | ||||||||||||||||
847 | isl_bool isl_space_has_equal_params(__isl_keep isl_space *space1, | ||||||||||||||||
848 | __isl_keep isl_space *space2) | ||||||||||||||||
849 | { | ||||||||||||||||
850 | if (!space1 || !space2) | ||||||||||||||||
851 | return isl_bool_error; | ||||||||||||||||
852 | |||||||||||||||||
853 | return match(space1, isl_dim_param, space2, isl_dim_param); | ||||||||||||||||
854 | } | ||||||||||||||||
855 | |||||||||||||||||
856 | /* Do "space1" and "space2" have the same identifiers for all | ||||||||||||||||
857 | * the tuple variables? | ||||||||||||||||
858 | */ | ||||||||||||||||
859 | isl_bool isl_space_has_equal_ids(__isl_keep isl_space *space1, | ||||||||||||||||
860 | __isl_keep isl_space *space2) | ||||||||||||||||
861 | { | ||||||||||||||||
862 | isl_bool equal; | ||||||||||||||||
863 | |||||||||||||||||
864 | if (!space1 || !space2) | ||||||||||||||||
865 | return isl_bool_error; | ||||||||||||||||
866 | |||||||||||||||||
867 | equal = match(space1, isl_dim_in, space2, isl_dim_in); | ||||||||||||||||
868 | if (equal < 0 || !equal) | ||||||||||||||||
869 | return equal; | ||||||||||||||||
870 | return match(space1, isl_dim_out, space2, isl_dim_out); | ||||||||||||||||
871 | } | ||||||||||||||||
872 | |||||||||||||||||
873 | isl_bool isl_space_match(__isl_keep isl_space *space1, enum isl_dim_type type1, | ||||||||||||||||
874 | __isl_keep isl_space *space2, enum isl_dim_type type2) | ||||||||||||||||
875 | { | ||||||||||||||||
876 | if (!space1 || !space2) | ||||||||||||||||
877 | return isl_bool_error; | ||||||||||||||||
878 | |||||||||||||||||
879 | return match(space1, type1, space2, type2); | ||||||||||||||||
880 | } | ||||||||||||||||
881 | |||||||||||||||||
882 | static void get_ids(__isl_keep isl_space *dim, enum isl_dim_type type, | ||||||||||||||||
883 | unsigned first, unsigned n, __isl_keep isl_id **ids) | ||||||||||||||||
884 | { | ||||||||||||||||
885 | int i; | ||||||||||||||||
886 | |||||||||||||||||
887 | for (i = 0; i < n ; ++i) | ||||||||||||||||
888 | ids[i] = get_id(dim, type, first + i); | ||||||||||||||||
889 | } | ||||||||||||||||
890 | |||||||||||||||||
891 | static __isl_give isl_space *space_extend(__isl_take isl_space *space, | ||||||||||||||||
892 | unsigned nparam, unsigned n_in, unsigned n_out) | ||||||||||||||||
893 | { | ||||||||||||||||
894 | isl_id **ids = NULL((void*)0); | ||||||||||||||||
895 | |||||||||||||||||
896 | if (!space) | ||||||||||||||||
897 | return NULL((void*)0); | ||||||||||||||||
898 | if (space->nparam == nparam && | ||||||||||||||||
899 | space->n_in == n_in && space->n_out == n_out) | ||||||||||||||||
900 | return space; | ||||||||||||||||
901 | |||||||||||||||||
902 | isl_assert(space->ctx, space->nparam <= nparam, goto error)do { if (space->nparam <= nparam) break; do { isl_handle_error (space->ctx, isl_error_unknown, "Assertion \"" "space->nparam <= nparam" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 902); goto error; } while (0); } while (0); | ||||||||||||||||
903 | isl_assert(space->ctx, space->n_in <= n_in, goto error)do { if (space->n_in <= n_in) break; do { isl_handle_error (space->ctx, isl_error_unknown, "Assertion \"" "space->n_in <= n_in" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 903); goto error; } while (0); } while (0); | ||||||||||||||||
904 | isl_assert(space->ctx, space->n_out <= n_out, goto error)do { if (space->n_out <= n_out) break; do { isl_handle_error (space->ctx, isl_error_unknown, "Assertion \"" "space->n_out <= n_out" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 904); goto error; } while (0); } while (0); | ||||||||||||||||
905 | |||||||||||||||||
906 | space = isl_space_cow(space); | ||||||||||||||||
907 | if (!space) | ||||||||||||||||
908 | goto error; | ||||||||||||||||
909 | |||||||||||||||||
910 | if (space->ids) { | ||||||||||||||||
911 | unsigned n; | ||||||||||||||||
912 | n = nparam + n_in + n_out; | ||||||||||||||||
913 | if (n < nparam || n < n_in || n < n_out) | ||||||||||||||||
914 | isl_die(isl_space_get_ctx(space), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "overflow in total number of dimensions", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 916); goto error; } while (0) | ||||||||||||||||
915 | "overflow in total number of dimensions",do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "overflow in total number of dimensions", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 916); goto error; } while (0) | ||||||||||||||||
916 | goto error)do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "overflow in total number of dimensions", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 916); goto error; } while (0); | ||||||||||||||||
917 | ids = isl_calloc_array(space->ctx, isl_id *, n)((isl_id * *)isl_calloc_or_die(space->ctx, n, sizeof(isl_id *))); | ||||||||||||||||
918 | if (!ids) | ||||||||||||||||
919 | goto error; | ||||||||||||||||
920 | get_ids(space, isl_dim_param, 0, space->nparam, ids); | ||||||||||||||||
921 | get_ids(space, isl_dim_in, 0, space->n_in, ids + nparam); | ||||||||||||||||
922 | get_ids(space, isl_dim_out, 0, space->n_out, | ||||||||||||||||
923 | ids + nparam + n_in); | ||||||||||||||||
924 | free(space->ids); | ||||||||||||||||
925 | space->ids = ids; | ||||||||||||||||
926 | space->n_id = nparam + n_in + n_out; | ||||||||||||||||
927 | } | ||||||||||||||||
928 | space->nparam = nparam; | ||||||||||||||||
929 | space->n_in = n_in; | ||||||||||||||||
930 | space->n_out = n_out; | ||||||||||||||||
931 | |||||||||||||||||
932 | return space; | ||||||||||||||||
933 | error: | ||||||||||||||||
934 | free(ids); | ||||||||||||||||
935 | isl_space_free(space); | ||||||||||||||||
936 | return NULL((void*)0); | ||||||||||||||||
937 | } | ||||||||||||||||
938 | |||||||||||||||||
939 | __isl_give isl_space *isl_space_extend(__isl_take isl_space *space, | ||||||||||||||||
940 | unsigned nparam, unsigned n_in, unsigned n_out) | ||||||||||||||||
941 | { | ||||||||||||||||
942 | return space_extend(space, nparam, n_in, n_out); | ||||||||||||||||
943 | } | ||||||||||||||||
944 | |||||||||||||||||
945 | __isl_give isl_space *isl_space_add_dims(__isl_take isl_space *space, | ||||||||||||||||
946 | enum isl_dim_type type, unsigned n) | ||||||||||||||||
947 | { | ||||||||||||||||
948 | space = isl_space_reset(space, type); | ||||||||||||||||
949 | if (!space) | ||||||||||||||||
950 | return NULL((void*)0); | ||||||||||||||||
951 | switch (type) { | ||||||||||||||||
952 | case isl_dim_param: | ||||||||||||||||
953 | space = space_extend(space, | ||||||||||||||||
954 | space->nparam + n, space->n_in, space->n_out); | ||||||||||||||||
955 | if (space && space->nested[0] && | ||||||||||||||||
956 | !(space->nested[0] = isl_space_add_dims(space->nested[0], | ||||||||||||||||
957 | isl_dim_param, n))) | ||||||||||||||||
958 | goto error; | ||||||||||||||||
959 | if (space && space->nested[1] && | ||||||||||||||||
960 | !(space->nested[1] = isl_space_add_dims(space->nested[1], | ||||||||||||||||
961 | isl_dim_param, n))) | ||||||||||||||||
962 | goto error; | ||||||||||||||||
963 | return space; | ||||||||||||||||
964 | case isl_dim_in: | ||||||||||||||||
965 | return space_extend(space, | ||||||||||||||||
966 | space->nparam, space->n_in + n, space->n_out); | ||||||||||||||||
967 | case isl_dim_out: | ||||||||||||||||
968 | return space_extend(space, | ||||||||||||||||
969 | space->nparam, space->n_in, space->n_out + n); | ||||||||||||||||
970 | default: | ||||||||||||||||
971 | isl_die(space->ctx, isl_error_invalid,do { isl_handle_error(space->ctx, isl_error_invalid, "cannot add dimensions of specified type" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 972); goto error; } while (0) | ||||||||||||||||
972 | "cannot add dimensions of specified type", goto error)do { isl_handle_error(space->ctx, isl_error_invalid, "cannot add dimensions of specified type" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 972); goto error; } while (0); | ||||||||||||||||
973 | } | ||||||||||||||||
974 | error: | ||||||||||||||||
975 | isl_space_free(space); | ||||||||||||||||
976 | return NULL((void*)0); | ||||||||||||||||
977 | } | ||||||||||||||||
978 | |||||||||||||||||
979 | /* Add a parameter with identifier "id" to "space", provided | ||||||||||||||||
980 | * it does not already appear in "space". | ||||||||||||||||
981 | */ | ||||||||||||||||
982 | __isl_give isl_space *isl_space_add_param_id(__isl_take isl_space *space, | ||||||||||||||||
983 | __isl_take isl_id *id) | ||||||||||||||||
984 | { | ||||||||||||||||
985 | int pos; | ||||||||||||||||
986 | |||||||||||||||||
987 | if (!space || !id) | ||||||||||||||||
988 | goto error; | ||||||||||||||||
989 | |||||||||||||||||
990 | if (isl_space_find_dim_by_id(space, isl_dim_param, id) >= 0) { | ||||||||||||||||
991 | isl_id_free(id); | ||||||||||||||||
992 | return space; | ||||||||||||||||
993 | } | ||||||||||||||||
994 | |||||||||||||||||
995 | pos = isl_space_dim(space, isl_dim_param); | ||||||||||||||||
996 | space = isl_space_add_dims(space, isl_dim_param, 1); | ||||||||||||||||
997 | space = isl_space_set_dim_id(space, isl_dim_param, pos, id); | ||||||||||||||||
998 | |||||||||||||||||
999 | return space; | ||||||||||||||||
1000 | error: | ||||||||||||||||
1001 | isl_space_free(space); | ||||||||||||||||
1002 | isl_id_free(id); | ||||||||||||||||
1003 | return NULL((void*)0); | ||||||||||||||||
1004 | } | ||||||||||||||||
1005 | |||||||||||||||||
1006 | static int valid_dim_type(enum isl_dim_type type) | ||||||||||||||||
1007 | { | ||||||||||||||||
1008 | switch (type) { | ||||||||||||||||
1009 | case isl_dim_param: | ||||||||||||||||
1010 | case isl_dim_in: | ||||||||||||||||
1011 | case isl_dim_out: | ||||||||||||||||
1012 | return 1; | ||||||||||||||||
1013 | default: | ||||||||||||||||
1014 | return 0; | ||||||||||||||||
1015 | } | ||||||||||||||||
1016 | } | ||||||||||||||||
1017 | |||||||||||||||||
1018 | /* Insert "n" dimensions of type "type" at position "pos". | ||||||||||||||||
1019 | * If we are inserting parameters, then they are also inserted in | ||||||||||||||||
1020 | * any nested spaces. | ||||||||||||||||
1021 | */ | ||||||||||||||||
1022 | __isl_give isl_space *isl_space_insert_dims(__isl_take isl_space *space, | ||||||||||||||||
1023 | enum isl_dim_type type, unsigned pos, unsigned n) | ||||||||||||||||
1024 | { | ||||||||||||||||
1025 | isl_ctx *ctx; | ||||||||||||||||
1026 | isl_id **ids = NULL((void*)0); | ||||||||||||||||
1027 | unsigned total; | ||||||||||||||||
1028 | |||||||||||||||||
1029 | if (!space) | ||||||||||||||||
1030 | return NULL((void*)0); | ||||||||||||||||
1031 | if (n == 0) | ||||||||||||||||
1032 | return isl_space_reset(space, type); | ||||||||||||||||
1033 | |||||||||||||||||
1034 | ctx = isl_space_get_ctx(space); | ||||||||||||||||
1035 | if (!valid_dim_type(type)) | ||||||||||||||||
1036 | isl_die(ctx, isl_error_invalid,do { isl_handle_error(ctx, isl_error_invalid, "cannot insert dimensions of specified type" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1038); goto error; } while (0) | ||||||||||||||||
1037 | "cannot insert dimensions of specified type",do { isl_handle_error(ctx, isl_error_invalid, "cannot insert dimensions of specified type" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1038); goto error; } while (0) | ||||||||||||||||
1038 | goto error)do { isl_handle_error(ctx, isl_error_invalid, "cannot insert dimensions of specified type" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1038); goto error; } while (0); | ||||||||||||||||
1039 | |||||||||||||||||
1040 | total = isl_space_dim(space, isl_dim_all); | ||||||||||||||||
1041 | if (total + n < total) | ||||||||||||||||
1042 | isl_die(ctx, isl_error_invalid,do { isl_handle_error(ctx, isl_error_invalid, "overflow in total number of dimensions" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1044); return isl_space_free(space); } while (0) | ||||||||||||||||
1043 | "overflow in total number of dimensions",do { isl_handle_error(ctx, isl_error_invalid, "overflow in total number of dimensions" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1044); return isl_space_free(space); } while (0) | ||||||||||||||||
1044 | return isl_space_free(space))do { isl_handle_error(ctx, isl_error_invalid, "overflow in total number of dimensions" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1044); return isl_space_free(space); } while (0); | ||||||||||||||||
1045 | isl_assert(ctx, pos <= isl_space_dim(space, type), goto error)do { if (pos <= isl_space_dim(space, type)) break; do { isl_handle_error (ctx, isl_error_unknown, "Assertion \"" "pos <= isl_space_dim(space, type)" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1045); goto error; } while (0); } while (0); | ||||||||||||||||
1046 | |||||||||||||||||
1047 | space = isl_space_cow(space); | ||||||||||||||||
1048 | if (!space) | ||||||||||||||||
1049 | return NULL((void*)0); | ||||||||||||||||
1050 | |||||||||||||||||
1051 | if (space->ids) { | ||||||||||||||||
1052 | enum isl_dim_type t, o = isl_dim_param; | ||||||||||||||||
1053 | int off; | ||||||||||||||||
1054 | int s[3]; | ||||||||||||||||
1055 | ids = isl_calloc_array(ctx, isl_id *,((isl_id * *)isl_calloc_or_die(ctx, space->nparam + space-> n_in + space->n_out + n, sizeof(isl_id *))) | ||||||||||||||||
1056 | space->nparam + space->n_in + space->n_out + n)((isl_id * *)isl_calloc_or_die(ctx, space->nparam + space-> n_in + space->n_out + n, sizeof(isl_id *))); | ||||||||||||||||
1057 | if (!ids) | ||||||||||||||||
1058 | goto error; | ||||||||||||||||
1059 | off = 0; | ||||||||||||||||
1060 | s[isl_dim_param - o] = space->nparam; | ||||||||||||||||
1061 | s[isl_dim_in - o] = space->n_in; | ||||||||||||||||
1062 | s[isl_dim_out - o] = space->n_out; | ||||||||||||||||
1063 | for (t = isl_dim_param; t <= isl_dim_out; ++t) { | ||||||||||||||||
1064 | if (t != type) { | ||||||||||||||||
1065 | get_ids(space, t, 0, s[t - o], ids + off); | ||||||||||||||||
1066 | off += s[t - o]; | ||||||||||||||||
1067 | } else { | ||||||||||||||||
1068 | get_ids(space, t, 0, pos, ids + off); | ||||||||||||||||
1069 | off += pos + n; | ||||||||||||||||
1070 | get_ids(space, t, pos, s[t - o] - pos, | ||||||||||||||||
1071 | ids + off); | ||||||||||||||||
1072 | off += s[t - o] - pos; | ||||||||||||||||
1073 | } | ||||||||||||||||
1074 | } | ||||||||||||||||
1075 | free(space->ids); | ||||||||||||||||
1076 | space->ids = ids; | ||||||||||||||||
1077 | space->n_id = space->nparam + space->n_in + space->n_out + n; | ||||||||||||||||
1078 | } | ||||||||||||||||
1079 | switch (type) { | ||||||||||||||||
1080 | case isl_dim_param: space->nparam += n; break; | ||||||||||||||||
1081 | case isl_dim_in: space->n_in += n; break; | ||||||||||||||||
1082 | case isl_dim_out: space->n_out += n; break; | ||||||||||||||||
1083 | default: ; | ||||||||||||||||
1084 | } | ||||||||||||||||
1085 | space = isl_space_reset(space, type); | ||||||||||||||||
1086 | |||||||||||||||||
1087 | if (type == isl_dim_param) { | ||||||||||||||||
1088 | if (space && space->nested[0] && | ||||||||||||||||
1089 | !(space->nested[0] = isl_space_insert_dims(space->nested[0], | ||||||||||||||||
1090 | isl_dim_param, pos, n))) | ||||||||||||||||
1091 | goto error; | ||||||||||||||||
1092 | if (space && space->nested[1] && | ||||||||||||||||
1093 | !(space->nested[1] = isl_space_insert_dims(space->nested[1], | ||||||||||||||||
1094 | isl_dim_param, pos, n))) | ||||||||||||||||
1095 | goto error; | ||||||||||||||||
1096 | } | ||||||||||||||||
1097 | |||||||||||||||||
1098 | return space; | ||||||||||||||||
1099 | error: | ||||||||||||||||
1100 | isl_space_free(space); | ||||||||||||||||
1101 | return NULL((void*)0); | ||||||||||||||||
1102 | } | ||||||||||||||||
1103 | |||||||||||||||||
1104 | __isl_give isl_space *isl_space_move_dims(__isl_take isl_space *space, | ||||||||||||||||
1105 | enum isl_dim_type dst_type, unsigned dst_pos, | ||||||||||||||||
1106 | enum isl_dim_type src_type, unsigned src_pos, unsigned n) | ||||||||||||||||
1107 | { | ||||||||||||||||
1108 | int i; | ||||||||||||||||
1109 | |||||||||||||||||
1110 | space = isl_space_reset(space, src_type); | ||||||||||||||||
1111 | space = isl_space_reset(space, dst_type); | ||||||||||||||||
1112 | if (!space) | ||||||||||||||||
1113 | return NULL((void*)0); | ||||||||||||||||
1114 | if (n == 0) | ||||||||||||||||
1115 | return space; | ||||||||||||||||
1116 | |||||||||||||||||
1117 | isl_assert(space->ctx, src_pos + n <= isl_space_dim(space, src_type),do { if (src_pos + n <= isl_space_dim(space, src_type)) break ; do { isl_handle_error(space->ctx, isl_error_unknown, "Assertion \"" "src_pos + n <= isl_space_dim(space, src_type)" "\" failed" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1118); goto error; } while (0); } while (0) | ||||||||||||||||
1118 | goto error)do { if (src_pos + n <= isl_space_dim(space, src_type)) break ; do { isl_handle_error(space->ctx, isl_error_unknown, "Assertion \"" "src_pos + n <= isl_space_dim(space, src_type)" "\" failed" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1118); goto error; } while (0); } while (0); | ||||||||||||||||
1119 | |||||||||||||||||
1120 | if (dst_type == src_type && dst_pos == src_pos) | ||||||||||||||||
1121 | return space; | ||||||||||||||||
1122 | |||||||||||||||||
1123 | isl_assert(space->ctx, dst_type != src_type, goto error)do { if (dst_type != src_type) break; do { isl_handle_error(space ->ctx, isl_error_unknown, "Assertion \"" "dst_type != src_type" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1123); goto error; } while (0); } while (0); | ||||||||||||||||
1124 | |||||||||||||||||
1125 | space = isl_space_cow(space); | ||||||||||||||||
1126 | if (!space) | ||||||||||||||||
1127 | return NULL((void*)0); | ||||||||||||||||
1128 | |||||||||||||||||
1129 | if (space->ids) { | ||||||||||||||||
1130 | isl_id **ids; | ||||||||||||||||
1131 | enum isl_dim_type t, o = isl_dim_param; | ||||||||||||||||
1132 | int off; | ||||||||||||||||
1133 | int s[3]; | ||||||||||||||||
1134 | ids = isl_calloc_array(space->ctx, isl_id *,((isl_id * *)isl_calloc_or_die(space->ctx, space->nparam + space->n_in + space->n_out, sizeof(isl_id *))) | ||||||||||||||||
1135 | space->nparam + space->n_in + space->n_out)((isl_id * *)isl_calloc_or_die(space->ctx, space->nparam + space->n_in + space->n_out, sizeof(isl_id *))); | ||||||||||||||||
1136 | if (!ids) | ||||||||||||||||
1137 | goto error; | ||||||||||||||||
1138 | off = 0; | ||||||||||||||||
1139 | s[isl_dim_param - o] = space->nparam; | ||||||||||||||||
1140 | s[isl_dim_in - o] = space->n_in; | ||||||||||||||||
1141 | s[isl_dim_out - o] = space->n_out; | ||||||||||||||||
1142 | for (t = isl_dim_param; t <= isl_dim_out; ++t) { | ||||||||||||||||
1143 | if (t == dst_type) { | ||||||||||||||||
1144 | get_ids(space, t, 0, dst_pos, ids + off); | ||||||||||||||||
1145 | off += dst_pos; | ||||||||||||||||
1146 | get_ids(space, src_type, src_pos, n, ids + off); | ||||||||||||||||
1147 | off += n; | ||||||||||||||||
1148 | get_ids(space, t, dst_pos, s[t - o] - dst_pos, | ||||||||||||||||
1149 | ids + off); | ||||||||||||||||
1150 | off += s[t - o] - dst_pos; | ||||||||||||||||
1151 | } else if (t == src_type) { | ||||||||||||||||
1152 | get_ids(space, t, 0, src_pos, ids + off); | ||||||||||||||||
1153 | off += src_pos; | ||||||||||||||||
1154 | get_ids(space, t, src_pos + n, | ||||||||||||||||
1155 | s[t - o] - src_pos - n, ids + off); | ||||||||||||||||
1156 | off += s[t - o] - src_pos - n; | ||||||||||||||||
1157 | } else { | ||||||||||||||||
1158 | get_ids(space, t, 0, s[t - o], ids + off); | ||||||||||||||||
1159 | off += s[t - o]; | ||||||||||||||||
1160 | } | ||||||||||||||||
1161 | } | ||||||||||||||||
1162 | free(space->ids); | ||||||||||||||||
1163 | space->ids = ids; | ||||||||||||||||
1164 | space->n_id = space->nparam + space->n_in + space->n_out; | ||||||||||||||||
1165 | } | ||||||||||||||||
1166 | |||||||||||||||||
1167 | switch (dst_type) { | ||||||||||||||||
1168 | case isl_dim_param: space->nparam += n; break; | ||||||||||||||||
1169 | case isl_dim_in: space->n_in += n; break; | ||||||||||||||||
1170 | case isl_dim_out: space->n_out += n; break; | ||||||||||||||||
1171 | default: ; | ||||||||||||||||
1172 | } | ||||||||||||||||
1173 | |||||||||||||||||
1174 | switch (src_type) { | ||||||||||||||||
1175 | case isl_dim_param: space->nparam -= n; break; | ||||||||||||||||
1176 | case isl_dim_in: space->n_in -= n; break; | ||||||||||||||||
1177 | case isl_dim_out: space->n_out -= n; break; | ||||||||||||||||
1178 | default: ; | ||||||||||||||||
1179 | } | ||||||||||||||||
1180 | |||||||||||||||||
1181 | if (dst_type != isl_dim_param && src_type != isl_dim_param) | ||||||||||||||||
1182 | return space; | ||||||||||||||||
1183 | |||||||||||||||||
1184 | for (i = 0; i < 2; ++i) { | ||||||||||||||||
1185 | if (!space->nested[i]) | ||||||||||||||||
1186 | continue; | ||||||||||||||||
1187 | space->nested[i] = isl_space_replace_params(space->nested[i], | ||||||||||||||||
1188 | space); | ||||||||||||||||
1189 | if (!space->nested[i]) | ||||||||||||||||
1190 | goto error; | ||||||||||||||||
1191 | } | ||||||||||||||||
1192 | |||||||||||||||||
1193 | return space; | ||||||||||||||||
1194 | error: | ||||||||||||||||
1195 | isl_space_free(space); | ||||||||||||||||
1196 | return NULL((void*)0); | ||||||||||||||||
1197 | } | ||||||||||||||||
1198 | |||||||||||||||||
1199 | /* Check that "space1" and "space2" have the same parameters, | ||||||||||||||||
1200 | * reporting an error if they do not. | ||||||||||||||||
1201 | */ | ||||||||||||||||
1202 | isl_stat isl_space_check_equal_params(__isl_keep isl_space *space1, | ||||||||||||||||
1203 | __isl_keep isl_space *space2) | ||||||||||||||||
1204 | { | ||||||||||||||||
1205 | isl_bool equal; | ||||||||||||||||
1206 | |||||||||||||||||
1207 | equal = isl_space_has_equal_params(space1, space2); | ||||||||||||||||
1208 | if (equal < 0) | ||||||||||||||||
1209 | return isl_stat_error; | ||||||||||||||||
1210 | if (!equal) | ||||||||||||||||
1211 | isl_die(isl_space_get_ctx(space1), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space1), isl_error_invalid , "parameters need to match", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1212); return isl_stat_error; } while (0) | ||||||||||||||||
1212 | "parameters need to match", return isl_stat_error)do { isl_handle_error(isl_space_get_ctx(space1), isl_error_invalid , "parameters need to match", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1212); return isl_stat_error; } while (0); | ||||||||||||||||
1213 | return isl_stat_ok; | ||||||||||||||||
1214 | } | ||||||||||||||||
1215 | |||||||||||||||||
1216 | __isl_give isl_space *isl_space_join(__isl_take isl_space *left, | ||||||||||||||||
1217 | __isl_take isl_space *right) | ||||||||||||||||
1218 | { | ||||||||||||||||
1219 | isl_space *dim; | ||||||||||||||||
1220 | |||||||||||||||||
1221 | if (isl_space_check_equal_params(left, right) < 0) | ||||||||||||||||
1222 | goto error; | ||||||||||||||||
1223 | |||||||||||||||||
1224 | isl_assert(left->ctx,do { if (isl_space_tuple_is_equal(left, isl_dim_out, right, isl_dim_in )) break; do { isl_handle_error(left->ctx, isl_error_unknown , "Assertion \"" "isl_space_tuple_is_equal(left, isl_dim_out, right, isl_dim_in)" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1226); goto error; } while (0); } while (0) | ||||||||||||||||
1225 | isl_space_tuple_is_equal(left, isl_dim_out, right, isl_dim_in),do { if (isl_space_tuple_is_equal(left, isl_dim_out, right, isl_dim_in )) break; do { isl_handle_error(left->ctx, isl_error_unknown , "Assertion \"" "isl_space_tuple_is_equal(left, isl_dim_out, right, isl_dim_in)" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1226); goto error; } while (0); } while (0) | ||||||||||||||||
1226 | goto error)do { if (isl_space_tuple_is_equal(left, isl_dim_out, right, isl_dim_in )) break; do { isl_handle_error(left->ctx, isl_error_unknown , "Assertion \"" "isl_space_tuple_is_equal(left, isl_dim_out, right, isl_dim_in)" "\" failed", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1226); goto error; } while (0); } while (0); | ||||||||||||||||
1227 | |||||||||||||||||
1228 | dim = isl_space_alloc(left->ctx, left->nparam, left->n_in, right->n_out); | ||||||||||||||||
1229 | if (!dim) | ||||||||||||||||
1230 | goto error; | ||||||||||||||||
1231 | |||||||||||||||||
1232 | dim = copy_ids(dim, isl_dim_param, 0, left, isl_dim_param); | ||||||||||||||||
1233 | dim = copy_ids(dim, isl_dim_in, 0, left, isl_dim_in); | ||||||||||||||||
1234 | dim = copy_ids(dim, isl_dim_out, 0, right, isl_dim_out); | ||||||||||||||||
1235 | |||||||||||||||||
1236 | if (dim && left->tuple_id[0] && | ||||||||||||||||
1237 | !(dim->tuple_id[0] = isl_id_copy(left->tuple_id[0]))) | ||||||||||||||||
1238 | goto error; | ||||||||||||||||
1239 | if (dim && right->tuple_id[1] && | ||||||||||||||||
1240 | !(dim->tuple_id[1] = isl_id_copy(right->tuple_id[1]))) | ||||||||||||||||
1241 | goto error; | ||||||||||||||||
1242 | if (dim && left->nested[0] && | ||||||||||||||||
1243 | !(dim->nested[0] = isl_space_copy(left->nested[0]))) | ||||||||||||||||
1244 | goto error; | ||||||||||||||||
1245 | if (dim && right->nested[1] && | ||||||||||||||||
1246 | !(dim->nested[1] = isl_space_copy(right->nested[1]))) | ||||||||||||||||
1247 | goto error; | ||||||||||||||||
1248 | |||||||||||||||||
1249 | isl_space_free(left); | ||||||||||||||||
1250 | isl_space_free(right); | ||||||||||||||||
1251 | |||||||||||||||||
1252 | return dim; | ||||||||||||||||
1253 | error: | ||||||||||||||||
1254 | isl_space_free(left); | ||||||||||||||||
1255 | isl_space_free(right); | ||||||||||||||||
1256 | return NULL((void*)0); | ||||||||||||||||
1257 | } | ||||||||||||||||
1258 | |||||||||||||||||
1259 | /* Given two map spaces { A -> C } and { B -> D }, construct the space | ||||||||||||||||
1260 | * { [A -> B] -> [C -> D] }. | ||||||||||||||||
1261 | * Given two set spaces { A } and { B }, construct the space { [A -> B] }. | ||||||||||||||||
1262 | */ | ||||||||||||||||
1263 | __isl_give isl_space *isl_space_product(__isl_take isl_space *left, | ||||||||||||||||
1264 | __isl_take isl_space *right) | ||||||||||||||||
1265 | { | ||||||||||||||||
1266 | isl_space *dom1, *dom2, *nest1, *nest2; | ||||||||||||||||
1267 | int is_set; | ||||||||||||||||
1268 | |||||||||||||||||
1269 | if (!left || !right) | ||||||||||||||||
1270 | goto error; | ||||||||||||||||
1271 | |||||||||||||||||
1272 | is_set = isl_space_is_set(left); | ||||||||||||||||
1273 | if (is_set != isl_space_is_set(right)) | ||||||||||||||||
1274 | isl_die(isl_space_get_ctx(left), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(left), isl_error_invalid , "expecting either two set spaces or two map spaces", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1276); goto error; } while (0) | ||||||||||||||||
1275 | "expecting either two set spaces or two map spaces",do { isl_handle_error(isl_space_get_ctx(left), isl_error_invalid , "expecting either two set spaces or two map spaces", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1276); goto error; } while (0) | ||||||||||||||||
1276 | goto error)do { isl_handle_error(isl_space_get_ctx(left), isl_error_invalid , "expecting either two set spaces or two map spaces", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1276); goto error; } while (0); | ||||||||||||||||
1277 | if (is_set) | ||||||||||||||||
1278 | return isl_space_range_product(left, right); | ||||||||||||||||
1279 | |||||||||||||||||
1280 | if (isl_space_check_equal_params(left, right) < 0) | ||||||||||||||||
1281 | goto error; | ||||||||||||||||
1282 | |||||||||||||||||
1283 | dom1 = isl_space_domain(isl_space_copy(left)); | ||||||||||||||||
1284 | dom2 = isl_space_domain(isl_space_copy(right)); | ||||||||||||||||
1285 | nest1 = isl_space_wrap(isl_space_join(isl_space_reverse(dom1), dom2)); | ||||||||||||||||
1286 | |||||||||||||||||
1287 | dom1 = isl_space_range(left); | ||||||||||||||||
1288 | dom2 = isl_space_range(right); | ||||||||||||||||
1289 | nest2 = isl_space_wrap(isl_space_join(isl_space_reverse(dom1), dom2)); | ||||||||||||||||
1290 | |||||||||||||||||
1291 | return isl_space_join(isl_space_reverse(nest1), nest2); | ||||||||||||||||
1292 | error: | ||||||||||||||||
1293 | isl_space_free(left); | ||||||||||||||||
1294 | isl_space_free(right); | ||||||||||||||||
1295 | return NULL((void*)0); | ||||||||||||||||
1296 | } | ||||||||||||||||
1297 | |||||||||||||||||
1298 | /* Given two spaces { A -> C } and { B -> C }, construct the space | ||||||||||||||||
1299 | * { [A -> B] -> C } | ||||||||||||||||
1300 | */ | ||||||||||||||||
1301 | __isl_give isl_space *isl_space_domain_product(__isl_take isl_space *left, | ||||||||||||||||
1302 | __isl_take isl_space *right) | ||||||||||||||||
1303 | { | ||||||||||||||||
1304 | isl_space *ran, *dom1, *dom2, *nest; | ||||||||||||||||
1305 | |||||||||||||||||
1306 | if (isl_space_check_equal_params(left, right) < 0) | ||||||||||||||||
1307 | goto error; | ||||||||||||||||
1308 | |||||||||||||||||
1309 | if (!isl_space_tuple_is_equal(left, isl_dim_out, right, isl_dim_out)) | ||||||||||||||||
1310 | isl_die(left->ctx, isl_error_invalid,do { isl_handle_error(left->ctx, isl_error_invalid, "ranges need to match" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1311); goto error; } while (0) | ||||||||||||||||
1311 | "ranges need to match", goto error)do { isl_handle_error(left->ctx, isl_error_invalid, "ranges need to match" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1311); goto error; } while (0); | ||||||||||||||||
1312 | |||||||||||||||||
1313 | ran = isl_space_range(isl_space_copy(left)); | ||||||||||||||||
1314 | |||||||||||||||||
1315 | dom1 = isl_space_domain(left); | ||||||||||||||||
1316 | dom2 = isl_space_domain(right); | ||||||||||||||||
1317 | nest = isl_space_wrap(isl_space_join(isl_space_reverse(dom1), dom2)); | ||||||||||||||||
1318 | |||||||||||||||||
1319 | return isl_space_join(isl_space_reverse(nest), ran); | ||||||||||||||||
1320 | error: | ||||||||||||||||
1321 | isl_space_free(left); | ||||||||||||||||
1322 | isl_space_free(right); | ||||||||||||||||
1323 | return NULL((void*)0); | ||||||||||||||||
1324 | } | ||||||||||||||||
1325 | |||||||||||||||||
1326 | __isl_give isl_space *isl_space_range_product(__isl_take isl_space *left, | ||||||||||||||||
1327 | __isl_take isl_space *right) | ||||||||||||||||
1328 | { | ||||||||||||||||
1329 | isl_space *dom, *ran1, *ran2, *nest; | ||||||||||||||||
1330 | |||||||||||||||||
1331 | if (isl_space_check_equal_params(left, right) < 0) | ||||||||||||||||
1332 | goto error; | ||||||||||||||||
1333 | |||||||||||||||||
1334 | if (!isl_space_tuple_is_equal(left, isl_dim_in, right, isl_dim_in)) | ||||||||||||||||
1335 | isl_die(left->ctx, isl_error_invalid,do { isl_handle_error(left->ctx, isl_error_invalid, "domains need to match" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1336); goto error; } while (0) | ||||||||||||||||
1336 | "domains need to match", goto error)do { isl_handle_error(left->ctx, isl_error_invalid, "domains need to match" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1336); goto error; } while (0); | ||||||||||||||||
1337 | |||||||||||||||||
1338 | dom = isl_space_domain(isl_space_copy(left)); | ||||||||||||||||
1339 | |||||||||||||||||
1340 | ran1 = isl_space_range(left); | ||||||||||||||||
1341 | ran2 = isl_space_range(right); | ||||||||||||||||
1342 | nest = isl_space_wrap(isl_space_join(isl_space_reverse(ran1), ran2)); | ||||||||||||||||
1343 | |||||||||||||||||
1344 | return isl_space_join(isl_space_reverse(dom), nest); | ||||||||||||||||
1345 | error: | ||||||||||||||||
1346 | isl_space_free(left); | ||||||||||||||||
1347 | isl_space_free(right); | ||||||||||||||||
1348 | return NULL((void*)0); | ||||||||||||||||
1349 | } | ||||||||||||||||
1350 | |||||||||||||||||
1351 | /* Given a space of the form [A -> B] -> C, return the space A -> C. | ||||||||||||||||
1352 | */ | ||||||||||||||||
1353 | __isl_give isl_space *isl_space_domain_factor_domain( | ||||||||||||||||
1354 | __isl_take isl_space *space) | ||||||||||||||||
1355 | { | ||||||||||||||||
1356 | isl_space *nested; | ||||||||||||||||
1357 | isl_space *domain; | ||||||||||||||||
1358 | |||||||||||||||||
1359 | if (!space) | ||||||||||||||||
1360 | return NULL((void*)0); | ||||||||||||||||
1361 | if (!isl_space_domain_is_wrapping(space)) | ||||||||||||||||
1362 | isl_die(isl_space_get_ctx(space), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "domain not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1363); return isl_space_free(space); } while (0) | ||||||||||||||||
1363 | "domain not a product", return isl_space_free(space))do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "domain not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1363); return isl_space_free(space); } while (0); | ||||||||||||||||
1364 | |||||||||||||||||
1365 | nested = space->nested[0]; | ||||||||||||||||
1366 | domain = isl_space_copy(space); | ||||||||||||||||
1367 | domain = isl_space_drop_dims(domain, isl_dim_in, | ||||||||||||||||
1368 | nested->n_in, nested->n_out); | ||||||||||||||||
1369 | if (!domain) | ||||||||||||||||
1370 | return isl_space_free(space); | ||||||||||||||||
1371 | if (nested->tuple_id[0]) { | ||||||||||||||||
1372 | domain->tuple_id[0] = isl_id_copy(nested->tuple_id[0]); | ||||||||||||||||
1373 | if (!domain->tuple_id[0]) | ||||||||||||||||
1374 | goto error; | ||||||||||||||||
1375 | } | ||||||||||||||||
1376 | if (nested->nested[0]) { | ||||||||||||||||
1377 | domain->nested[0] = isl_space_copy(nested->nested[0]); | ||||||||||||||||
1378 | if (!domain->nested[0]) | ||||||||||||||||
1379 | goto error; | ||||||||||||||||
1380 | } | ||||||||||||||||
1381 | |||||||||||||||||
1382 | isl_space_free(space); | ||||||||||||||||
1383 | return domain; | ||||||||||||||||
1384 | error: | ||||||||||||||||
1385 | isl_space_free(space); | ||||||||||||||||
1386 | isl_space_free(domain); | ||||||||||||||||
1387 | return NULL((void*)0); | ||||||||||||||||
1388 | } | ||||||||||||||||
1389 | |||||||||||||||||
1390 | /* Given a space of the form [A -> B] -> C, return the space B -> C. | ||||||||||||||||
1391 | */ | ||||||||||||||||
1392 | __isl_give isl_space *isl_space_domain_factor_range( | ||||||||||||||||
1393 | __isl_take isl_space *space) | ||||||||||||||||
1394 | { | ||||||||||||||||
1395 | isl_space *nested; | ||||||||||||||||
1396 | isl_space *range; | ||||||||||||||||
1397 | |||||||||||||||||
1398 | if (!space) | ||||||||||||||||
1399 | return NULL((void*)0); | ||||||||||||||||
1400 | if (!isl_space_domain_is_wrapping(space)) | ||||||||||||||||
1401 | isl_die(isl_space_get_ctx(space), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "domain not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1402); return isl_space_free(space); } while (0) | ||||||||||||||||
1402 | "domain not a product", return isl_space_free(space))do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "domain not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1402); return isl_space_free(space); } while (0); | ||||||||||||||||
1403 | |||||||||||||||||
1404 | nested = space->nested[0]; | ||||||||||||||||
1405 | range = isl_space_copy(space); | ||||||||||||||||
1406 | range = isl_space_drop_dims(range, isl_dim_in, 0, nested->n_in); | ||||||||||||||||
1407 | if (!range) | ||||||||||||||||
1408 | return isl_space_free(space); | ||||||||||||||||
1409 | if (nested->tuple_id[1]) { | ||||||||||||||||
1410 | range->tuple_id[0] = isl_id_copy(nested->tuple_id[1]); | ||||||||||||||||
1411 | if (!range->tuple_id[0]) | ||||||||||||||||
1412 | goto error; | ||||||||||||||||
1413 | } | ||||||||||||||||
1414 | if (nested->nested[1]) { | ||||||||||||||||
1415 | range->nested[0] = isl_space_copy(nested->nested[1]); | ||||||||||||||||
1416 | if (!range->nested[0]) | ||||||||||||||||
1417 | goto error; | ||||||||||||||||
1418 | } | ||||||||||||||||
1419 | |||||||||||||||||
1420 | isl_space_free(space); | ||||||||||||||||
1421 | return range; | ||||||||||||||||
1422 | error: | ||||||||||||||||
1423 | isl_space_free(space); | ||||||||||||||||
1424 | isl_space_free(range); | ||||||||||||||||
1425 | return NULL((void*)0); | ||||||||||||||||
1426 | } | ||||||||||||||||
1427 | |||||||||||||||||
1428 | /* Internal function that selects the domain of the map that is | ||||||||||||||||
1429 | * embedded in either a set space or the range of a map space. | ||||||||||||||||
1430 | * In particular, given a space of the form [A -> B], return the space A. | ||||||||||||||||
1431 | * Given a space of the form A -> [B -> C], return the space A -> B. | ||||||||||||||||
1432 | */ | ||||||||||||||||
1433 | static __isl_give isl_space *range_factor_domain(__isl_take isl_space *space) | ||||||||||||||||
1434 | { | ||||||||||||||||
1435 | isl_space *nested; | ||||||||||||||||
1436 | isl_space *domain; | ||||||||||||||||
1437 | |||||||||||||||||
1438 | if (!space) | ||||||||||||||||
1439 | return NULL((void*)0); | ||||||||||||||||
1440 | |||||||||||||||||
1441 | nested = space->nested[1]; | ||||||||||||||||
1442 | domain = isl_space_copy(space); | ||||||||||||||||
1443 | domain = isl_space_drop_dims(domain, isl_dim_out, | ||||||||||||||||
1444 | nested->n_in, nested->n_out); | ||||||||||||||||
1445 | if (!domain) | ||||||||||||||||
1446 | return isl_space_free(space); | ||||||||||||||||
1447 | if (nested->tuple_id[0]) { | ||||||||||||||||
1448 | domain->tuple_id[1] = isl_id_copy(nested->tuple_id[0]); | ||||||||||||||||
1449 | if (!domain->tuple_id[1]) | ||||||||||||||||
1450 | goto error; | ||||||||||||||||
1451 | } | ||||||||||||||||
1452 | if (nested->nested[0]) { | ||||||||||||||||
1453 | domain->nested[1] = isl_space_copy(nested->nested[0]); | ||||||||||||||||
1454 | if (!domain->nested[1]) | ||||||||||||||||
1455 | goto error; | ||||||||||||||||
1456 | } | ||||||||||||||||
1457 | |||||||||||||||||
1458 | isl_space_free(space); | ||||||||||||||||
1459 | return domain; | ||||||||||||||||
1460 | error: | ||||||||||||||||
1461 | isl_space_free(space); | ||||||||||||||||
1462 | isl_space_free(domain); | ||||||||||||||||
1463 | return NULL((void*)0); | ||||||||||||||||
1464 | } | ||||||||||||||||
1465 | |||||||||||||||||
1466 | /* Given a space of the form A -> [B -> C], return the space A -> B. | ||||||||||||||||
1467 | */ | ||||||||||||||||
1468 | __isl_give isl_space *isl_space_range_factor_domain( | ||||||||||||||||
1469 | __isl_take isl_space *space) | ||||||||||||||||
1470 | { | ||||||||||||||||
1471 | if (!space) | ||||||||||||||||
1472 | return NULL((void*)0); | ||||||||||||||||
1473 | if (!isl_space_range_is_wrapping(space)) | ||||||||||||||||
1474 | isl_die(isl_space_get_ctx(space), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "range not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1475); return isl_space_free(space); } while (0) | ||||||||||||||||
1475 | "range not a product", return isl_space_free(space))do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "range not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1475); return isl_space_free(space); } while (0); | ||||||||||||||||
1476 | |||||||||||||||||
1477 | return range_factor_domain(space); | ||||||||||||||||
1478 | } | ||||||||||||||||
1479 | |||||||||||||||||
1480 | /* Given a space of the form [A -> B], return the space A. | ||||||||||||||||
1481 | */ | ||||||||||||||||
1482 | static __isl_give isl_space *set_factor_domain(__isl_take isl_space *space) | ||||||||||||||||
1483 | { | ||||||||||||||||
1484 | if (!space) | ||||||||||||||||
1485 | return NULL((void*)0); | ||||||||||||||||
1486 | if (!isl_space_is_wrapping(space)) | ||||||||||||||||
1487 | isl_die(isl_space_get_ctx(space), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1488); return isl_space_free(space); } while (0) | ||||||||||||||||
1488 | "not a product", return isl_space_free(space))do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1488); return isl_space_free(space); } while (0); | ||||||||||||||||
1489 | |||||||||||||||||
1490 | return range_factor_domain(space); | ||||||||||||||||
1491 | } | ||||||||||||||||
1492 | |||||||||||||||||
1493 | /* Given a space of the form [A -> B] -> [C -> D], return the space A -> C. | ||||||||||||||||
1494 | * Given a space of the form [A -> B], return the space A. | ||||||||||||||||
1495 | */ | ||||||||||||||||
1496 | __isl_give isl_space *isl_space_factor_domain(__isl_take isl_space *space) | ||||||||||||||||
1497 | { | ||||||||||||||||
1498 | if (!space) | ||||||||||||||||
1499 | return NULL((void*)0); | ||||||||||||||||
1500 | if (isl_space_is_set(space)) | ||||||||||||||||
1501 | return set_factor_domain(space); | ||||||||||||||||
1502 | space = isl_space_domain_factor_domain(space); | ||||||||||||||||
1503 | space = isl_space_range_factor_domain(space); | ||||||||||||||||
1504 | return space; | ||||||||||||||||
1505 | } | ||||||||||||||||
1506 | |||||||||||||||||
1507 | /* Internal function that selects the range of the map that is | ||||||||||||||||
1508 | * embedded in either a set space or the range of a map space. | ||||||||||||||||
1509 | * In particular, given a space of the form [A -> B], return the space B. | ||||||||||||||||
1510 | * Given a space of the form A -> [B -> C], return the space A -> C. | ||||||||||||||||
1511 | */ | ||||||||||||||||
1512 | static __isl_give isl_space *range_factor_range(__isl_take isl_space *space) | ||||||||||||||||
1513 | { | ||||||||||||||||
1514 | isl_space *nested; | ||||||||||||||||
1515 | isl_space *range; | ||||||||||||||||
1516 | |||||||||||||||||
1517 | if (!space) | ||||||||||||||||
1518 | return NULL((void*)0); | ||||||||||||||||
1519 | |||||||||||||||||
1520 | nested = space->nested[1]; | ||||||||||||||||
1521 | range = isl_space_copy(space); | ||||||||||||||||
1522 | range = isl_space_drop_dims(range, isl_dim_out, 0, nested->n_in); | ||||||||||||||||
1523 | if (!range) | ||||||||||||||||
1524 | return isl_space_free(space); | ||||||||||||||||
1525 | if (nested->tuple_id[1]) { | ||||||||||||||||
1526 | range->tuple_id[1] = isl_id_copy(nested->tuple_id[1]); | ||||||||||||||||
1527 | if (!range->tuple_id[1]) | ||||||||||||||||
1528 | goto error; | ||||||||||||||||
1529 | } | ||||||||||||||||
1530 | if (nested->nested[1]) { | ||||||||||||||||
1531 | range->nested[1] = isl_space_copy(nested->nested[1]); | ||||||||||||||||
1532 | if (!range->nested[1]) | ||||||||||||||||
1533 | goto error; | ||||||||||||||||
1534 | } | ||||||||||||||||
1535 | |||||||||||||||||
1536 | isl_space_free(space); | ||||||||||||||||
1537 | return range; | ||||||||||||||||
1538 | error: | ||||||||||||||||
1539 | isl_space_free(space); | ||||||||||||||||
1540 | isl_space_free(range); | ||||||||||||||||
1541 | return NULL((void*)0); | ||||||||||||||||
1542 | } | ||||||||||||||||
1543 | |||||||||||||||||
1544 | /* Given a space of the form A -> [B -> C], return the space A -> C. | ||||||||||||||||
1545 | */ | ||||||||||||||||
1546 | __isl_give isl_space *isl_space_range_factor_range( | ||||||||||||||||
1547 | __isl_take isl_space *space) | ||||||||||||||||
1548 | { | ||||||||||||||||
1549 | if (!space) | ||||||||||||||||
1550 | return NULL((void*)0); | ||||||||||||||||
1551 | if (!isl_space_range_is_wrapping(space)) | ||||||||||||||||
1552 | isl_die(isl_space_get_ctx(space), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "range not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1553); return isl_space_free(space); } while (0) | ||||||||||||||||
1553 | "range not a product", return isl_space_free(space))do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "range not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1553); return isl_space_free(space); } while (0); | ||||||||||||||||
1554 | |||||||||||||||||
1555 | return range_factor_range(space); | ||||||||||||||||
1556 | } | ||||||||||||||||
1557 | |||||||||||||||||
1558 | /* Given a space of the form [A -> B], return the space B. | ||||||||||||||||
1559 | */ | ||||||||||||||||
1560 | static __isl_give isl_space *set_factor_range(__isl_take isl_space *space) | ||||||||||||||||
1561 | { | ||||||||||||||||
1562 | if (!space) | ||||||||||||||||
1563 | return NULL((void*)0); | ||||||||||||||||
1564 | if (!isl_space_is_wrapping(space)) | ||||||||||||||||
1565 | isl_die(isl_space_get_ctx(space), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1566); return isl_space_free(space); } while (0) | ||||||||||||||||
1566 | "not a product", return isl_space_free(space))do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "not a product", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1566); return isl_space_free(space); } while (0); | ||||||||||||||||
1567 | |||||||||||||||||
1568 | return range_factor_range(space); | ||||||||||||||||
1569 | } | ||||||||||||||||
1570 | |||||||||||||||||
1571 | /* Given a space of the form [A -> B] -> [C -> D], return the space B -> D. | ||||||||||||||||
1572 | * Given a space of the form [A -> B], return the space B. | ||||||||||||||||
1573 | */ | ||||||||||||||||
1574 | __isl_give isl_space *isl_space_factor_range(__isl_take isl_space *space) | ||||||||||||||||
1575 | { | ||||||||||||||||
1576 | if (!space) | ||||||||||||||||
1577 | return NULL((void*)0); | ||||||||||||||||
1578 | if (isl_space_is_set(space)) | ||||||||||||||||
1579 | return set_factor_range(space); | ||||||||||||||||
1580 | space = isl_space_domain_factor_range(space); | ||||||||||||||||
1581 | space = isl_space_range_factor_range(space); | ||||||||||||||||
1582 | return space; | ||||||||||||||||
1583 | } | ||||||||||||||||
1584 | |||||||||||||||||
1585 | __isl_give isl_space *isl_space_map_from_set(__isl_take isl_space *space) | ||||||||||||||||
1586 | { | ||||||||||||||||
1587 | isl_ctx *ctx; | ||||||||||||||||
1588 | isl_id **ids = NULL((void*)0); | ||||||||||||||||
1589 | int n_id; | ||||||||||||||||
1590 | |||||||||||||||||
1591 | if (!space) | ||||||||||||||||
1592 | return NULL((void*)0); | ||||||||||||||||
1593 | ctx = isl_space_get_ctx(space); | ||||||||||||||||
1594 | if (!isl_space_is_set(space)) | ||||||||||||||||
1595 | isl_die(ctx, isl_error_invalid, "not a set space", goto error)do { isl_handle_error(ctx, isl_error_invalid, "not a set space" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1595); goto error; } while (0); | ||||||||||||||||
1596 | space = isl_space_cow(space); | ||||||||||||||||
1597 | if (!space) | ||||||||||||||||
1598 | return NULL((void*)0); | ||||||||||||||||
1599 | n_id = space->nparam + space->n_out + space->n_out; | ||||||||||||||||
1600 | if (n_id > 0 && space->ids) { | ||||||||||||||||
1601 | ids = isl_calloc_array(space->ctx, isl_id *, n_id)((isl_id * *)isl_calloc_or_die(space->ctx, n_id, sizeof(isl_id *))); | ||||||||||||||||
1602 | if (!ids) | ||||||||||||||||
1603 | goto error; | ||||||||||||||||
1604 | get_ids(space, isl_dim_param, 0, space->nparam, ids); | ||||||||||||||||
1605 | get_ids(space, isl_dim_out, 0, space->n_out, | ||||||||||||||||
1606 | ids + space->nparam); | ||||||||||||||||
1607 | } | ||||||||||||||||
1608 | space->n_in = space->n_out; | ||||||||||||||||
1609 | if (ids) { | ||||||||||||||||
1610 | free(space->ids); | ||||||||||||||||
1611 | space->ids = ids; | ||||||||||||||||
1612 | space->n_id = n_id; | ||||||||||||||||
1613 | space = copy_ids(space, isl_dim_out, 0, space, isl_dim_in); | ||||||||||||||||
1614 | } | ||||||||||||||||
1615 | isl_id_free(space->tuple_id[0]); | ||||||||||||||||
1616 | space->tuple_id[0] = isl_id_copy(space->tuple_id[1]); | ||||||||||||||||
1617 | isl_space_free(space->nested[0]); | ||||||||||||||||
1618 | space->nested[0] = isl_space_copy(space->nested[1]); | ||||||||||||||||
1619 | return space; | ||||||||||||||||
1620 | error: | ||||||||||||||||
1621 | isl_space_free(space); | ||||||||||||||||
1622 | return NULL((void*)0); | ||||||||||||||||
1623 | } | ||||||||||||||||
1624 | |||||||||||||||||
1625 | __isl_give isl_space *isl_space_map_from_domain_and_range( | ||||||||||||||||
1626 | __isl_take isl_space *domain, __isl_take isl_space *range) | ||||||||||||||||
1627 | { | ||||||||||||||||
1628 | if (!domain || !range) | ||||||||||||||||
1629 | goto error; | ||||||||||||||||
1630 | if (!isl_space_is_set(domain)) | ||||||||||||||||
1631 | isl_die(isl_space_get_ctx(domain), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(domain), isl_error_invalid , "domain is not a set space", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1632); goto error; } while (0) | ||||||||||||||||
1632 | "domain is not a set space", goto error)do { isl_handle_error(isl_space_get_ctx(domain), isl_error_invalid , "domain is not a set space", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1632); goto error; } while (0); | ||||||||||||||||
1633 | if (!isl_space_is_set(range)) | ||||||||||||||||
1634 | isl_die(isl_space_get_ctx(range), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(range), isl_error_invalid , "range is not a set space", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1635); goto error; } while (0) | ||||||||||||||||
1635 | "range is not a set space", goto error)do { isl_handle_error(isl_space_get_ctx(range), isl_error_invalid , "range is not a set space", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1635); goto error; } while (0); | ||||||||||||||||
1636 | return isl_space_join(isl_space_reverse(domain), range); | ||||||||||||||||
1637 | error: | ||||||||||||||||
1638 | isl_space_free(domain); | ||||||||||||||||
1639 | isl_space_free(range); | ||||||||||||||||
1640 | return NULL((void*)0); | ||||||||||||||||
1641 | } | ||||||||||||||||
1642 | |||||||||||||||||
1643 | static __isl_give isl_space *set_ids(__isl_take isl_space *dim, | ||||||||||||||||
1644 | enum isl_dim_type type, | ||||||||||||||||
1645 | unsigned first, unsigned n, __isl_take isl_id **ids) | ||||||||||||||||
1646 | { | ||||||||||||||||
1647 | int i; | ||||||||||||||||
1648 | |||||||||||||||||
1649 | for (i = 0; i < n ; ++i) | ||||||||||||||||
1650 | dim = set_id(dim, type, first + i, ids[i]); | ||||||||||||||||
1651 | |||||||||||||||||
1652 | return dim; | ||||||||||||||||
1653 | } | ||||||||||||||||
1654 | |||||||||||||||||
1655 | __isl_give isl_space *isl_space_reverse(__isl_take isl_space *dim) | ||||||||||||||||
1656 | { | ||||||||||||||||
1657 | unsigned t; | ||||||||||||||||
1658 | isl_space *nested; | ||||||||||||||||
1659 | isl_id **ids = NULL((void*)0); | ||||||||||||||||
1660 | isl_id *id; | ||||||||||||||||
1661 | |||||||||||||||||
1662 | if (!dim) | ||||||||||||||||
1663 | return NULL((void*)0); | ||||||||||||||||
1664 | if (match(dim, isl_dim_in, dim, isl_dim_out)) | ||||||||||||||||
1665 | return dim; | ||||||||||||||||
1666 | |||||||||||||||||
1667 | dim = isl_space_cow(dim); | ||||||||||||||||
1668 | if (!dim) | ||||||||||||||||
1669 | return NULL((void*)0); | ||||||||||||||||
1670 | |||||||||||||||||
1671 | id = dim->tuple_id[0]; | ||||||||||||||||
1672 | dim->tuple_id[0] = dim->tuple_id[1]; | ||||||||||||||||
1673 | dim->tuple_id[1] = id; | ||||||||||||||||
1674 | |||||||||||||||||
1675 | nested = dim->nested[0]; | ||||||||||||||||
1676 | dim->nested[0] = dim->nested[1]; | ||||||||||||||||
1677 | dim->nested[1] = nested; | ||||||||||||||||
1678 | |||||||||||||||||
1679 | if (dim->ids) { | ||||||||||||||||
1680 | int n_id = dim->n_in + dim->n_out; | ||||||||||||||||
1681 | ids = isl_alloc_array(dim->ctx, isl_id *, n_id)((isl_id * *)isl_malloc_or_die(dim->ctx, (n_id)*sizeof(isl_id *))); | ||||||||||||||||
1682 | if (n_id && !ids) | ||||||||||||||||
1683 | goto error; | ||||||||||||||||
1684 | get_ids(dim, isl_dim_in, 0, dim->n_in, ids); | ||||||||||||||||
1685 | get_ids(dim, isl_dim_out, 0, dim->n_out, ids + dim->n_in); | ||||||||||||||||
1686 | } | ||||||||||||||||
1687 | |||||||||||||||||
1688 | t = dim->n_in; | ||||||||||||||||
1689 | dim->n_in = dim->n_out; | ||||||||||||||||
1690 | dim->n_out = t; | ||||||||||||||||
1691 | |||||||||||||||||
1692 | if (dim->ids) { | ||||||||||||||||
1693 | dim = set_ids(dim, isl_dim_out, 0, dim->n_out, ids); | ||||||||||||||||
1694 | dim = set_ids(dim, isl_dim_in, 0, dim->n_in, ids + dim->n_out); | ||||||||||||||||
1695 | free(ids); | ||||||||||||||||
1696 | } | ||||||||||||||||
1697 | |||||||||||||||||
1698 | return dim; | ||||||||||||||||
1699 | error: | ||||||||||||||||
1700 | free(ids); | ||||||||||||||||
1701 | isl_space_free(dim); | ||||||||||||||||
1702 | return NULL((void*)0); | ||||||||||||||||
1703 | } | ||||||||||||||||
1704 | |||||||||||||||||
1705 | __isl_give isl_space *isl_space_drop_dims(__isl_take isl_space *dim, | ||||||||||||||||
1706 | enum isl_dim_type type, unsigned first, unsigned num) | ||||||||||||||||
1707 | { | ||||||||||||||||
1708 | int i; | ||||||||||||||||
1709 | |||||||||||||||||
1710 | if (!dim) | ||||||||||||||||
1711 | return NULL((void*)0); | ||||||||||||||||
1712 | |||||||||||||||||
1713 | if (num == 0) | ||||||||||||||||
1714 | return isl_space_reset(dim, type); | ||||||||||||||||
1715 | |||||||||||||||||
1716 | if (!valid_dim_type(type)) | ||||||||||||||||
1717 | isl_die(dim->ctx, isl_error_invalid,do { isl_handle_error(dim->ctx, isl_error_invalid, "cannot drop dimensions of specified type" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1718); goto error; } while (0) | ||||||||||||||||
1718 | "cannot drop dimensions of specified type", goto error)do { isl_handle_error(dim->ctx, isl_error_invalid, "cannot drop dimensions of specified type" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1718); goto error; } while (0); | ||||||||||||||||
1719 | |||||||||||||||||
1720 | if (first + num > n(dim, type) || first + num < first) | ||||||||||||||||
1721 | isl_die(isl_space_get_ctx(dim), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(dim), isl_error_invalid , "index out of bounds", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1722); return isl_space_free(dim); } while (0) | ||||||||||||||||
1722 | "index out of bounds", return isl_space_free(dim))do { isl_handle_error(isl_space_get_ctx(dim), isl_error_invalid , "index out of bounds", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1722); return isl_space_free(dim); } while (0); | ||||||||||||||||
1723 | dim = isl_space_cow(dim); | ||||||||||||||||
1724 | if (!dim) | ||||||||||||||||
1725 | goto error; | ||||||||||||||||
1726 | if (dim->ids) { | ||||||||||||||||
1727 | dim = extend_ids(dim); | ||||||||||||||||
1728 | if (!dim) | ||||||||||||||||
1729 | goto error; | ||||||||||||||||
1730 | for (i = 0; i < num; ++i) | ||||||||||||||||
1731 | isl_id_free(get_id(dim, type, first + i)); | ||||||||||||||||
1732 | for (i = first+num; i < n(dim, type); ++i) | ||||||||||||||||
1733 | set_id(dim, type, i - num, get_id(dim, type, i)); | ||||||||||||||||
1734 | switch (type) { | ||||||||||||||||
1735 | case isl_dim_param: | ||||||||||||||||
1736 | get_ids(dim, isl_dim_in, 0, dim->n_in, | ||||||||||||||||
1737 | dim->ids + offset(dim, isl_dim_in) - num); | ||||||||||||||||
1738 | case isl_dim_in: | ||||||||||||||||
1739 | get_ids(dim, isl_dim_out, 0, dim->n_out, | ||||||||||||||||
1740 | dim->ids + offset(dim, isl_dim_out) - num); | ||||||||||||||||
1741 | default: | ||||||||||||||||
1742 | ; | ||||||||||||||||
1743 | } | ||||||||||||||||
1744 | dim->n_id -= num; | ||||||||||||||||
1745 | } | ||||||||||||||||
1746 | switch (type) { | ||||||||||||||||
1747 | case isl_dim_param: dim->nparam -= num; break; | ||||||||||||||||
1748 | case isl_dim_in: dim->n_in -= num; break; | ||||||||||||||||
1749 | case isl_dim_out: dim->n_out -= num; break; | ||||||||||||||||
1750 | default: ; | ||||||||||||||||
1751 | } | ||||||||||||||||
1752 | dim = isl_space_reset(dim, type); | ||||||||||||||||
1753 | if (type == isl_dim_param) { | ||||||||||||||||
1754 | if (dim && dim->nested[0] && | ||||||||||||||||
1755 | !(dim->nested[0] = isl_space_drop_dims(dim->nested[0], | ||||||||||||||||
1756 | isl_dim_param, first, num))) | ||||||||||||||||
1757 | goto error; | ||||||||||||||||
1758 | if (dim && dim->nested[1] && | ||||||||||||||||
1759 | !(dim->nested[1] = isl_space_drop_dims(dim->nested[1], | ||||||||||||||||
1760 | isl_dim_param, first, num))) | ||||||||||||||||
1761 | goto error; | ||||||||||||||||
1762 | } | ||||||||||||||||
1763 | return dim; | ||||||||||||||||
1764 | error: | ||||||||||||||||
1765 | isl_space_free(dim); | ||||||||||||||||
1766 | return NULL((void*)0); | ||||||||||||||||
1767 | } | ||||||||||||||||
1768 | |||||||||||||||||
1769 | __isl_give isl_space *isl_space_drop_inputs(__isl_take isl_space *dim, | ||||||||||||||||
1770 | unsigned first, unsigned n) | ||||||||||||||||
1771 | { | ||||||||||||||||
1772 | if (!dim) | ||||||||||||||||
1773 | return NULL((void*)0); | ||||||||||||||||
1774 | return isl_space_drop_dims(dim, isl_dim_in, first, n); | ||||||||||||||||
1775 | } | ||||||||||||||||
1776 | |||||||||||||||||
1777 | __isl_give isl_space *isl_space_drop_outputs(__isl_take isl_space *dim, | ||||||||||||||||
1778 | unsigned first, unsigned n) | ||||||||||||||||
1779 | { | ||||||||||||||||
1780 | if (!dim) | ||||||||||||||||
1781 | return NULL((void*)0); | ||||||||||||||||
1782 | return isl_space_drop_dims(dim, isl_dim_out, first, n); | ||||||||||||||||
1783 | } | ||||||||||||||||
1784 | |||||||||||||||||
1785 | __isl_give isl_space *isl_space_domain(__isl_take isl_space *space) | ||||||||||||||||
1786 | { | ||||||||||||||||
1787 | if (!space) | ||||||||||||||||
1788 | return NULL((void*)0); | ||||||||||||||||
1789 | space = isl_space_drop_dims(space, isl_dim_out, 0, space->n_out); | ||||||||||||||||
1790 | space = isl_space_reverse(space); | ||||||||||||||||
1791 | space = mark_as_set(space); | ||||||||||||||||
1792 | return space; | ||||||||||||||||
1793 | } | ||||||||||||||||
1794 | |||||||||||||||||
1795 | __isl_give isl_space *isl_space_from_domain(__isl_take isl_space *dim) | ||||||||||||||||
1796 | { | ||||||||||||||||
1797 | if (!dim) | ||||||||||||||||
1798 | return NULL((void*)0); | ||||||||||||||||
1799 | if (!isl_space_is_set(dim)) | ||||||||||||||||
1800 | isl_die(isl_space_get_ctx(dim), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(dim), isl_error_invalid , "not a set space", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1801); goto error; } while (0) | ||||||||||||||||
1801 | "not a set space", goto error)do { isl_handle_error(isl_space_get_ctx(dim), isl_error_invalid , "not a set space", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1801); goto error; } while (0); | ||||||||||||||||
1802 | dim = isl_space_reverse(dim); | ||||||||||||||||
1803 | dim = isl_space_reset(dim, isl_dim_out); | ||||||||||||||||
1804 | return dim; | ||||||||||||||||
1805 | error: | ||||||||||||||||
1806 | isl_space_free(dim); | ||||||||||||||||
1807 | return NULL((void*)0); | ||||||||||||||||
1808 | } | ||||||||||||||||
1809 | |||||||||||||||||
1810 | __isl_give isl_space *isl_space_range(__isl_take isl_space *space) | ||||||||||||||||
1811 | { | ||||||||||||||||
1812 | if (!space) | ||||||||||||||||
1813 | return NULL((void*)0); | ||||||||||||||||
1814 | space = isl_space_drop_dims(space, isl_dim_in, 0, space->n_in); | ||||||||||||||||
1815 | space = mark_as_set(space); | ||||||||||||||||
1816 | return space; | ||||||||||||||||
1817 | } | ||||||||||||||||
1818 | |||||||||||||||||
1819 | __isl_give isl_space *isl_space_from_range(__isl_take isl_space *dim) | ||||||||||||||||
1820 | { | ||||||||||||||||
1821 | if (!dim) | ||||||||||||||||
1822 | return NULL((void*)0); | ||||||||||||||||
1823 | if (!isl_space_is_set(dim)) | ||||||||||||||||
1824 | isl_die(isl_space_get_ctx(dim), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(dim), isl_error_invalid , "not a set space", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1825); goto error; } while (0) | ||||||||||||||||
1825 | "not a set space", goto error)do { isl_handle_error(isl_space_get_ctx(dim), isl_error_invalid , "not a set space", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1825); goto error; } while (0); | ||||||||||||||||
1826 | return isl_space_reset(dim, isl_dim_in); | ||||||||||||||||
1827 | error: | ||||||||||||||||
1828 | isl_space_free(dim); | ||||||||||||||||
1829 | return NULL((void*)0); | ||||||||||||||||
1830 | } | ||||||||||||||||
1831 | |||||||||||||||||
1832 | /* Given a map space A -> B, return the map space [A -> B] -> A. | ||||||||||||||||
1833 | */ | ||||||||||||||||
1834 | __isl_give isl_space *isl_space_domain_map(__isl_take isl_space *space) | ||||||||||||||||
1835 | { | ||||||||||||||||
1836 | isl_space *domain; | ||||||||||||||||
1837 | |||||||||||||||||
1838 | domain = isl_space_from_range(isl_space_domain(isl_space_copy(space))); | ||||||||||||||||
1839 | space = isl_space_from_domain(isl_space_wrap(space)); | ||||||||||||||||
1840 | space = isl_space_join(space, domain); | ||||||||||||||||
1841 | |||||||||||||||||
1842 | return space; | ||||||||||||||||
1843 | } | ||||||||||||||||
1844 | |||||||||||||||||
1845 | /* Given a map space A -> B, return the map space [A -> B] -> B. | ||||||||||||||||
1846 | */ | ||||||||||||||||
1847 | __isl_give isl_space *isl_space_range_map(__isl_take isl_space *space) | ||||||||||||||||
1848 | { | ||||||||||||||||
1849 | isl_space *range; | ||||||||||||||||
1850 | |||||||||||||||||
1851 | range = isl_space_from_range(isl_space_range(isl_space_copy(space))); | ||||||||||||||||
1852 | space = isl_space_from_domain(isl_space_wrap(space)); | ||||||||||||||||
1853 | space = isl_space_join(space, range); | ||||||||||||||||
1854 | |||||||||||||||||
1855 | return space; | ||||||||||||||||
1856 | } | ||||||||||||||||
1857 | |||||||||||||||||
1858 | __isl_give isl_space *isl_space_params(__isl_take isl_space *space) | ||||||||||||||||
1859 | { | ||||||||||||||||
1860 | if (isl_space_is_params(space)) | ||||||||||||||||
1861 | return space; | ||||||||||||||||
1862 | space = isl_space_drop_dims(space, | ||||||||||||||||
1863 | isl_dim_in, 0, isl_space_dim(space, isl_dim_in)); | ||||||||||||||||
1864 | space = isl_space_drop_dims(space, | ||||||||||||||||
1865 | isl_dim_out, 0, isl_space_dim(space, isl_dim_out)); | ||||||||||||||||
1866 | space = mark_as_params(space); | ||||||||||||||||
1867 | return space; | ||||||||||||||||
1868 | } | ||||||||||||||||
1869 | |||||||||||||||||
1870 | __isl_give isl_space *isl_space_set_from_params(__isl_take isl_space *space) | ||||||||||||||||
1871 | { | ||||||||||||||||
1872 | if (!space) | ||||||||||||||||
1873 | return NULL((void*)0); | ||||||||||||||||
1874 | if (!isl_space_is_params(space)) | ||||||||||||||||
1875 | isl_die(isl_space_get_ctx(space), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "not a parameter space", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1876); goto error; } while (0) | ||||||||||||||||
1876 | "not a parameter space", goto error)do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "not a parameter space", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 1876); goto error; } while (0); | ||||||||||||||||
1877 | return isl_space_reset(space, isl_dim_set); | ||||||||||||||||
1878 | error: | ||||||||||||||||
1879 | isl_space_free(space); | ||||||||||||||||
1880 | return NULL((void*)0); | ||||||||||||||||
1881 | } | ||||||||||||||||
1882 | |||||||||||||||||
1883 | __isl_give isl_space *isl_space_underlying(__isl_take isl_space *dim, | ||||||||||||||||
1884 | unsigned n_div) | ||||||||||||||||
1885 | { | ||||||||||||||||
1886 | int i; | ||||||||||||||||
1887 | |||||||||||||||||
1888 | if (!dim) | ||||||||||||||||
1889 | return NULL((void*)0); | ||||||||||||||||
1890 | if (n_div == 0 && | ||||||||||||||||
1891 | dim->nparam == 0 && dim->n_in == 0 && dim->n_id == 0) | ||||||||||||||||
1892 | return isl_space_reset(isl_space_reset(dim, isl_dim_in), isl_dim_out); | ||||||||||||||||
1893 | dim = isl_space_cow(dim); | ||||||||||||||||
1894 | if (!dim) | ||||||||||||||||
1895 | return NULL((void*)0); | ||||||||||||||||
1896 | dim->n_out += dim->nparam + dim->n_in + n_div; | ||||||||||||||||
1897 | dim->nparam = 0; | ||||||||||||||||
1898 | dim->n_in = 0; | ||||||||||||||||
1899 | |||||||||||||||||
1900 | for (i = 0; i < dim->n_id; ++i) | ||||||||||||||||
1901 | isl_id_free(get_id(dim, isl_dim_out, i)); | ||||||||||||||||
1902 | dim->n_id = 0; | ||||||||||||||||
1903 | dim = isl_space_reset(dim, isl_dim_in); | ||||||||||||||||
1904 | dim = isl_space_reset(dim, isl_dim_out); | ||||||||||||||||
1905 | |||||||||||||||||
1906 | return dim; | ||||||||||||||||
1907 | } | ||||||||||||||||
1908 | |||||||||||||||||
1909 | /* Are the two spaces the same, including positions and names of parameters? | ||||||||||||||||
1910 | */ | ||||||||||||||||
1911 | isl_bool isl_space_is_equal(__isl_keep isl_space *space1, | ||||||||||||||||
1912 | __isl_keep isl_space *space2) | ||||||||||||||||
1913 | { | ||||||||||||||||
1914 | isl_bool equal; | ||||||||||||||||
1915 | |||||||||||||||||
1916 | if (!space1 || !space2) | ||||||||||||||||
1917 | return isl_bool_error; | ||||||||||||||||
1918 | if (space1 == space2) | ||||||||||||||||
1919 | return isl_bool_true; | ||||||||||||||||
1920 | equal = isl_space_has_equal_params(space1, space2); | ||||||||||||||||
1921 | if (equal < 0 || !equal) | ||||||||||||||||
1922 | return equal; | ||||||||||||||||
1923 | return isl_space_has_equal_tuples(space1, space2); | ||||||||||||||||
1924 | } | ||||||||||||||||
1925 | |||||||||||||||||
1926 | /* Do the tuples of "space1" correspond to those of the domain of "space2"? | ||||||||||||||||
1927 | * That is, is "space1" eqaul to the domain of "space2", ignoring parameters. | ||||||||||||||||
1928 | * | ||||||||||||||||
1929 | * "space2" is allowed to be a set space, in which case "space1" | ||||||||||||||||
1930 | * should be a parameter space. | ||||||||||||||||
1931 | */ | ||||||||||||||||
1932 | isl_bool isl_space_has_domain_tuples(__isl_keep isl_space *space1, | ||||||||||||||||
1933 | __isl_keep isl_space *space2) | ||||||||||||||||
1934 | { | ||||||||||||||||
1935 | isl_bool is_set; | ||||||||||||||||
1936 | |||||||||||||||||
1937 | is_set = isl_space_is_set(space1); | ||||||||||||||||
1938 | if (is_set < 0 || !is_set) | ||||||||||||||||
1939 | return is_set; | ||||||||||||||||
1940 | return isl_space_tuple_is_equal(space1, isl_dim_set, | ||||||||||||||||
1941 | space2, isl_dim_in); | ||||||||||||||||
1942 | } | ||||||||||||||||
1943 | |||||||||||||||||
1944 | /* Is space1 equal to the domain of space2? | ||||||||||||||||
1945 | * | ||||||||||||||||
1946 | * In the internal version we also allow space2 to be the space of a set, | ||||||||||||||||
1947 | * provided space1 is a parameter space. | ||||||||||||||||
1948 | */ | ||||||||||||||||
1949 | isl_bool isl_space_is_domain_internal(__isl_keep isl_space *space1, | ||||||||||||||||
1950 | __isl_keep isl_space *space2) | ||||||||||||||||
1951 | { | ||||||||||||||||
1952 | isl_bool equal_params; | ||||||||||||||||
1953 | |||||||||||||||||
1954 | if (!space1 || !space2) | ||||||||||||||||
1955 | return isl_bool_error; | ||||||||||||||||
1956 | equal_params = isl_space_has_equal_params(space1, space2); | ||||||||||||||||
1957 | if (equal_params < 0 || !equal_params) | ||||||||||||||||
1958 | return equal_params; | ||||||||||||||||
1959 | return isl_space_has_domain_tuples(space1, space2); | ||||||||||||||||
1960 | } | ||||||||||||||||
1961 | |||||||||||||||||
1962 | /* Is space1 equal to the domain of space2? | ||||||||||||||||
1963 | */ | ||||||||||||||||
1964 | isl_bool isl_space_is_domain(__isl_keep isl_space *space1, | ||||||||||||||||
1965 | __isl_keep isl_space *space2) | ||||||||||||||||
1966 | { | ||||||||||||||||
1967 | if (!space2) | ||||||||||||||||
1968 | return isl_bool_error; | ||||||||||||||||
1969 | if (!isl_space_is_map(space2)) | ||||||||||||||||
1970 | return isl_bool_false; | ||||||||||||||||
1971 | return isl_space_is_domain_internal(space1, space2); | ||||||||||||||||
1972 | } | ||||||||||||||||
1973 | |||||||||||||||||
1974 | /* Is space1 equal to the range of space2? | ||||||||||||||||
1975 | * | ||||||||||||||||
1976 | * In the internal version, space2 is allowed to be the space of a set, | ||||||||||||||||
1977 | * in which case it should be equal to space1. | ||||||||||||||||
1978 | */ | ||||||||||||||||
1979 | isl_bool isl_space_is_range_internal(__isl_keep isl_space *space1, | ||||||||||||||||
1980 | __isl_keep isl_space *space2) | ||||||||||||||||
1981 | { | ||||||||||||||||
1982 | isl_bool equal_params; | ||||||||||||||||
1983 | |||||||||||||||||
1984 | if (!space1 || !space2) | ||||||||||||||||
1985 | return isl_bool_error; | ||||||||||||||||
1986 | if (!isl_space_is_set(space1)) | ||||||||||||||||
1987 | return isl_bool_false; | ||||||||||||||||
1988 | equal_params = isl_space_has_equal_params(space1, space2); | ||||||||||||||||
1989 | if (equal_params < 0 || !equal_params) | ||||||||||||||||
1990 | return equal_params; | ||||||||||||||||
1991 | return isl_space_tuple_is_equal(space1, isl_dim_set, | ||||||||||||||||
1992 | space2, isl_dim_out); | ||||||||||||||||
1993 | } | ||||||||||||||||
1994 | |||||||||||||||||
1995 | /* Is space1 equal to the range of space2? | ||||||||||||||||
1996 | */ | ||||||||||||||||
1997 | isl_bool isl_space_is_range(__isl_keep isl_space *space1, | ||||||||||||||||
1998 | __isl_keep isl_space *space2) | ||||||||||||||||
1999 | { | ||||||||||||||||
2000 | if (!space2) | ||||||||||||||||
2001 | return isl_bool_error; | ||||||||||||||||
2002 | if (!isl_space_is_map(space2)) | ||||||||||||||||
2003 | return isl_bool_false; | ||||||||||||||||
2004 | return isl_space_is_range_internal(space1, space2); | ||||||||||||||||
2005 | } | ||||||||||||||||
2006 | |||||||||||||||||
2007 | /* Update "hash" by hashing in the parameters of "space". | ||||||||||||||||
2008 | */ | ||||||||||||||||
2009 | static uint32_t isl_hash_params(uint32_t hash, __isl_keep isl_space *space) | ||||||||||||||||
2010 | { | ||||||||||||||||
2011 | int i; | ||||||||||||||||
2012 | isl_id *id; | ||||||||||||||||
2013 | |||||||||||||||||
2014 | if (!space) | ||||||||||||||||
2015 | return hash; | ||||||||||||||||
2016 | |||||||||||||||||
2017 | isl_hash_byte(hash, space->nparam % 256)do { hash *= 16777619; hash ^= space->nparam % 256; } while (0); | ||||||||||||||||
2018 | |||||||||||||||||
2019 | for (i = 0; i < space->nparam; ++i) { | ||||||||||||||||
2020 | id = get_id(space, isl_dim_param, i); | ||||||||||||||||
2021 | hash = isl_hash_id(hash, id); | ||||||||||||||||
2022 | } | ||||||||||||||||
2023 | |||||||||||||||||
2024 | return hash; | ||||||||||||||||
2025 | } | ||||||||||||||||
2026 | |||||||||||||||||
2027 | /* Update "hash" by hashing in the tuples of "space". | ||||||||||||||||
2028 | * Changes in this function should be reflected in isl_hash_tuples_domain. | ||||||||||||||||
2029 | */ | ||||||||||||||||
2030 | static uint32_t isl_hash_tuples(uint32_t hash, __isl_keep isl_space *space) | ||||||||||||||||
2031 | { | ||||||||||||||||
2032 | isl_id *id; | ||||||||||||||||
2033 | |||||||||||||||||
2034 | if (!space) | ||||||||||||||||
2035 | return hash; | ||||||||||||||||
2036 | |||||||||||||||||
2037 | isl_hash_byte(hash, space->n_in % 256)do { hash *= 16777619; hash ^= space->n_in % 256; } while( 0); | ||||||||||||||||
2038 | isl_hash_byte(hash, space->n_out % 256)do { hash *= 16777619; hash ^= space->n_out % 256; } while (0); | ||||||||||||||||
2039 | |||||||||||||||||
2040 | id = tuple_id(space, isl_dim_in); | ||||||||||||||||
2041 | hash = isl_hash_id(hash, id); | ||||||||||||||||
2042 | id = tuple_id(space, isl_dim_out); | ||||||||||||||||
2043 | hash = isl_hash_id(hash, id); | ||||||||||||||||
2044 | |||||||||||||||||
2045 | hash = isl_hash_tuples(hash, space->nested[0]); | ||||||||||||||||
2046 | hash = isl_hash_tuples(hash, space->nested[1]); | ||||||||||||||||
2047 | |||||||||||||||||
2048 | return hash; | ||||||||||||||||
2049 | } | ||||||||||||||||
2050 | |||||||||||||||||
2051 | /* Update "hash" by hashing in the domain tuple of "space". | ||||||||||||||||
2052 | * The result of this function is equal to the result of applying | ||||||||||||||||
2053 | * isl_hash_tuples to the domain of "space". | ||||||||||||||||
2054 | */ | ||||||||||||||||
2055 | static uint32_t isl_hash_tuples_domain(uint32_t hash, | ||||||||||||||||
2056 | __isl_keep isl_space *space) | ||||||||||||||||
2057 | { | ||||||||||||||||
2058 | isl_id *id; | ||||||||||||||||
2059 | |||||||||||||||||
2060 | if (!space) | ||||||||||||||||
2061 | return hash; | ||||||||||||||||
2062 | |||||||||||||||||
2063 | isl_hash_byte(hash, 0)do { hash *= 16777619; hash ^= 0; } while(0); | ||||||||||||||||
2064 | isl_hash_byte(hash, space->n_in % 256)do { hash *= 16777619; hash ^= space->n_in % 256; } while( 0); | ||||||||||||||||
2065 | |||||||||||||||||
2066 | hash = isl_hash_id(hash, &isl_id_none); | ||||||||||||||||
2067 | id = tuple_id(space, isl_dim_in); | ||||||||||||||||
2068 | hash = isl_hash_id(hash, id); | ||||||||||||||||
2069 | |||||||||||||||||
2070 | hash = isl_hash_tuples(hash, space->nested[0]); | ||||||||||||||||
2071 | |||||||||||||||||
2072 | return hash; | ||||||||||||||||
2073 | } | ||||||||||||||||
2074 | |||||||||||||||||
2075 | /* Return a hash value that digests the tuples of "space", | ||||||||||||||||
2076 | * i.e., that ignores the parameters. | ||||||||||||||||
2077 | */ | ||||||||||||||||
2078 | uint32_t isl_space_get_tuple_hash(__isl_keep isl_space *space) | ||||||||||||||||
2079 | { | ||||||||||||||||
2080 | uint32_t hash; | ||||||||||||||||
2081 | |||||||||||||||||
2082 | if (!space) | ||||||||||||||||
2083 | return 0; | ||||||||||||||||
2084 | |||||||||||||||||
2085 | hash = isl_hash_init()(2166136261u); | ||||||||||||||||
2086 | hash = isl_hash_tuples(hash, space); | ||||||||||||||||
2087 | |||||||||||||||||
2088 | return hash; | ||||||||||||||||
2089 | } | ||||||||||||||||
2090 | |||||||||||||||||
2091 | uint32_t isl_space_get_hash(__isl_keep isl_space *space) | ||||||||||||||||
2092 | { | ||||||||||||||||
2093 | uint32_t hash; | ||||||||||||||||
2094 | |||||||||||||||||
2095 | if (!space) | ||||||||||||||||
2096 | return 0; | ||||||||||||||||
2097 | |||||||||||||||||
2098 | hash = isl_hash_init()(2166136261u); | ||||||||||||||||
2099 | hash = isl_hash_params(hash, space); | ||||||||||||||||
2100 | hash = isl_hash_tuples(hash, space); | ||||||||||||||||
2101 | |||||||||||||||||
2102 | return hash; | ||||||||||||||||
2103 | } | ||||||||||||||||
2104 | |||||||||||||||||
2105 | /* Return the hash value of the domain of "space". | ||||||||||||||||
2106 | * That is, isl_space_get_domain_hash(space) is equal to | ||||||||||||||||
2107 | * isl_space_get_hash(isl_space_domain(space)). | ||||||||||||||||
2108 | */ | ||||||||||||||||
2109 | uint32_t isl_space_get_domain_hash(__isl_keep isl_space *space) | ||||||||||||||||
2110 | { | ||||||||||||||||
2111 | uint32_t hash; | ||||||||||||||||
2112 | |||||||||||||||||
2113 | if (!space) | ||||||||||||||||
2114 | return 0; | ||||||||||||||||
2115 | |||||||||||||||||
2116 | hash = isl_hash_init()(2166136261u); | ||||||||||||||||
2117 | hash = isl_hash_params(hash, space); | ||||||||||||||||
2118 | hash = isl_hash_tuples_domain(hash, space); | ||||||||||||||||
2119 | |||||||||||||||||
2120 | return hash; | ||||||||||||||||
2121 | } | ||||||||||||||||
2122 | |||||||||||||||||
2123 | isl_bool isl_space_is_wrapping(__isl_keep isl_space *dim) | ||||||||||||||||
2124 | { | ||||||||||||||||
2125 | if (!dim) | ||||||||||||||||
2126 | return isl_bool_error; | ||||||||||||||||
2127 | |||||||||||||||||
2128 | if (!isl_space_is_set(dim)) | ||||||||||||||||
2129 | return isl_bool_false; | ||||||||||||||||
2130 | |||||||||||||||||
2131 | return dim->nested[1] != NULL((void*)0); | ||||||||||||||||
2132 | } | ||||||||||||||||
2133 | |||||||||||||||||
2134 | /* Is "space" the space of a map where the domain is a wrapped map space? | ||||||||||||||||
2135 | */ | ||||||||||||||||
2136 | isl_bool isl_space_domain_is_wrapping(__isl_keep isl_space *space) | ||||||||||||||||
2137 | { | ||||||||||||||||
2138 | if (!space) | ||||||||||||||||
2139 | return isl_bool_error; | ||||||||||||||||
2140 | |||||||||||||||||
2141 | if (isl_space_is_set(space)) | ||||||||||||||||
2142 | return isl_bool_false; | ||||||||||||||||
2143 | |||||||||||||||||
2144 | return space->nested[0] != NULL((void*)0); | ||||||||||||||||
2145 | } | ||||||||||||||||
2146 | |||||||||||||||||
2147 | /* Is "space" the space of a map where the range is a wrapped map space? | ||||||||||||||||
2148 | */ | ||||||||||||||||
2149 | isl_bool isl_space_range_is_wrapping(__isl_keep isl_space *space) | ||||||||||||||||
2150 | { | ||||||||||||||||
2151 | if (!space) | ||||||||||||||||
2152 | return isl_bool_error; | ||||||||||||||||
2153 | |||||||||||||||||
2154 | if (isl_space_is_set(space)) | ||||||||||||||||
2155 | return isl_bool_false; | ||||||||||||||||
2156 | |||||||||||||||||
2157 | return space->nested[1] != NULL((void*)0); | ||||||||||||||||
2158 | } | ||||||||||||||||
2159 | |||||||||||||||||
2160 | /* Is "space" a product of two spaces? | ||||||||||||||||
2161 | * That is, is it a wrapping set space or a map space | ||||||||||||||||
2162 | * with wrapping domain and range? | ||||||||||||||||
2163 | */ | ||||||||||||||||
2164 | isl_bool isl_space_is_product(__isl_keep isl_space *space) | ||||||||||||||||
2165 | { | ||||||||||||||||
2166 | isl_bool is_set; | ||||||||||||||||
2167 | isl_bool is_product; | ||||||||||||||||
2168 | |||||||||||||||||
2169 | is_set = isl_space_is_set(space); | ||||||||||||||||
2170 | if (is_set < 0) | ||||||||||||||||
2171 | return isl_bool_error; | ||||||||||||||||
2172 | if (is_set) | ||||||||||||||||
2173 | return isl_space_is_wrapping(space); | ||||||||||||||||
2174 | is_product = isl_space_domain_is_wrapping(space); | ||||||||||||||||
2175 | if (is_product < 0 || !is_product) | ||||||||||||||||
2176 | return is_product; | ||||||||||||||||
2177 | return isl_space_range_is_wrapping(space); | ||||||||||||||||
2178 | } | ||||||||||||||||
2179 | |||||||||||||||||
2180 | __isl_give isl_space *isl_space_wrap(__isl_take isl_space *dim) | ||||||||||||||||
2181 | { | ||||||||||||||||
2182 | isl_space *wrap; | ||||||||||||||||
2183 | |||||||||||||||||
2184 | if (!dim) | ||||||||||||||||
2185 | return NULL((void*)0); | ||||||||||||||||
2186 | |||||||||||||||||
2187 | wrap = isl_space_set_alloc(dim->ctx, | ||||||||||||||||
2188 | dim->nparam, dim->n_in + dim->n_out); | ||||||||||||||||
2189 | |||||||||||||||||
2190 | wrap = copy_ids(wrap, isl_dim_param, 0, dim, isl_dim_param); | ||||||||||||||||
2191 | wrap = copy_ids(wrap, isl_dim_set, 0, dim, isl_dim_in); | ||||||||||||||||
2192 | wrap = copy_ids(wrap, isl_dim_set, dim->n_in, dim, isl_dim_out); | ||||||||||||||||
2193 | |||||||||||||||||
2194 | if (!wrap) | ||||||||||||||||
2195 | goto error; | ||||||||||||||||
2196 | |||||||||||||||||
2197 | wrap->nested[1] = dim; | ||||||||||||||||
2198 | |||||||||||||||||
2199 | return wrap; | ||||||||||||||||
2200 | error: | ||||||||||||||||
2201 | isl_space_free(dim); | ||||||||||||||||
2202 | return NULL((void*)0); | ||||||||||||||||
2203 | } | ||||||||||||||||
2204 | |||||||||||||||||
2205 | __isl_give isl_space *isl_space_unwrap(__isl_take isl_space *dim) | ||||||||||||||||
2206 | { | ||||||||||||||||
2207 | isl_space *unwrap; | ||||||||||||||||
2208 | |||||||||||||||||
2209 | if (!dim) | ||||||||||||||||
2210 | return NULL((void*)0); | ||||||||||||||||
2211 | |||||||||||||||||
2212 | if (!isl_space_is_wrapping(dim)) | ||||||||||||||||
2213 | isl_die(dim->ctx, isl_error_invalid, "not a wrapping space",do { isl_handle_error(dim->ctx, isl_error_invalid, "not a wrapping space" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2214); goto error; } while (0) | ||||||||||||||||
2214 | goto error)do { isl_handle_error(dim->ctx, isl_error_invalid, "not a wrapping space" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2214); goto error; } while (0); | ||||||||||||||||
2215 | |||||||||||||||||
2216 | unwrap = isl_space_copy(dim->nested[1]); | ||||||||||||||||
2217 | isl_space_free(dim); | ||||||||||||||||
2218 | |||||||||||||||||
2219 | return unwrap; | ||||||||||||||||
2220 | error: | ||||||||||||||||
2221 | isl_space_free(dim); | ||||||||||||||||
2222 | return NULL((void*)0); | ||||||||||||||||
2223 | } | ||||||||||||||||
2224 | |||||||||||||||||
2225 | isl_bool isl_space_is_named_or_nested(__isl_keep isl_space *space, | ||||||||||||||||
2226 | enum isl_dim_type type) | ||||||||||||||||
2227 | { | ||||||||||||||||
2228 | if (type != isl_dim_in && type != isl_dim_out) | ||||||||||||||||
2229 | return isl_bool_false; | ||||||||||||||||
2230 | if (!space) | ||||||||||||||||
2231 | return isl_bool_error; | ||||||||||||||||
2232 | if (space->tuple_id[type - isl_dim_in]) | ||||||||||||||||
2233 | return isl_bool_true; | ||||||||||||||||
2234 | if (space->nested[type - isl_dim_in]) | ||||||||||||||||
2235 | return isl_bool_true; | ||||||||||||||||
2236 | return isl_bool_false; | ||||||||||||||||
2237 | } | ||||||||||||||||
2238 | |||||||||||||||||
2239 | isl_bool isl_space_may_be_set(__isl_keep isl_space *space) | ||||||||||||||||
2240 | { | ||||||||||||||||
2241 | isl_bool nested; | ||||||||||||||||
2242 | |||||||||||||||||
2243 | if (!space) | ||||||||||||||||
2244 | return isl_bool_error; | ||||||||||||||||
2245 | if (isl_space_is_set(space)) | ||||||||||||||||
2246 | return isl_bool_true; | ||||||||||||||||
2247 | if (isl_space_dim(space, isl_dim_in) != 0) | ||||||||||||||||
2248 | return isl_bool_false; | ||||||||||||||||
2249 | nested = isl_space_is_named_or_nested(space, isl_dim_in); | ||||||||||||||||
2250 | if (nested < 0 || nested) | ||||||||||||||||
2251 | return isl_bool_not(nested); | ||||||||||||||||
2252 | return isl_bool_true; | ||||||||||||||||
2253 | } | ||||||||||||||||
2254 | |||||||||||||||||
2255 | __isl_give isl_space *isl_space_reset(__isl_take isl_space *dim, | ||||||||||||||||
2256 | enum isl_dim_type type) | ||||||||||||||||
2257 | { | ||||||||||||||||
2258 | if (!isl_space_is_named_or_nested(dim, type)) | ||||||||||||||||
2259 | return dim; | ||||||||||||||||
2260 | |||||||||||||||||
2261 | dim = isl_space_cow(dim); | ||||||||||||||||
2262 | if (!dim) | ||||||||||||||||
2263 | return NULL((void*)0); | ||||||||||||||||
2264 | |||||||||||||||||
2265 | isl_id_free(dim->tuple_id[type - isl_dim_in]); | ||||||||||||||||
2266 | dim->tuple_id[type - isl_dim_in] = NULL((void*)0); | ||||||||||||||||
2267 | isl_space_free(dim->nested[type - isl_dim_in]); | ||||||||||||||||
2268 | dim->nested[type - isl_dim_in] = NULL((void*)0); | ||||||||||||||||
2269 | |||||||||||||||||
2270 | return dim; | ||||||||||||||||
2271 | } | ||||||||||||||||
2272 | |||||||||||||||||
2273 | __isl_give isl_space *isl_space_flatten(__isl_take isl_space *dim) | ||||||||||||||||
2274 | { | ||||||||||||||||
2275 | if (!dim) | ||||||||||||||||
2276 | return NULL((void*)0); | ||||||||||||||||
2277 | if (!dim->nested[0] && !dim->nested[1]) | ||||||||||||||||
2278 | return dim; | ||||||||||||||||
2279 | |||||||||||||||||
2280 | if (dim->nested[0]) | ||||||||||||||||
2281 | dim = isl_space_reset(dim, isl_dim_in); | ||||||||||||||||
2282 | if (dim && dim->nested[1]) | ||||||||||||||||
2283 | dim = isl_space_reset(dim, isl_dim_out); | ||||||||||||||||
2284 | |||||||||||||||||
2285 | return dim; | ||||||||||||||||
2286 | } | ||||||||||||||||
2287 | |||||||||||||||||
2288 | __isl_give isl_space *isl_space_flatten_domain(__isl_take isl_space *space) | ||||||||||||||||
2289 | { | ||||||||||||||||
2290 | if (!space) | ||||||||||||||||
2291 | return NULL((void*)0); | ||||||||||||||||
2292 | if (!space->nested[0]) | ||||||||||||||||
2293 | return space; | ||||||||||||||||
2294 | |||||||||||||||||
2295 | return isl_space_reset(space, isl_dim_in); | ||||||||||||||||
2296 | } | ||||||||||||||||
2297 | |||||||||||||||||
2298 | __isl_give isl_space *isl_space_flatten_range(__isl_take isl_space *space) | ||||||||||||||||
2299 | { | ||||||||||||||||
2300 | if (!space) | ||||||||||||||||
2301 | return NULL((void*)0); | ||||||||||||||||
2302 | if (!space->nested[1]) | ||||||||||||||||
2303 | return space; | ||||||||||||||||
2304 | |||||||||||||||||
2305 | return isl_space_reset(space, isl_dim_out); | ||||||||||||||||
2306 | } | ||||||||||||||||
2307 | |||||||||||||||||
2308 | /* Replace the parameters of dst by those of src. | ||||||||||||||||
2309 | */ | ||||||||||||||||
2310 | __isl_give isl_space *isl_space_replace_params(__isl_take isl_space *dst, | ||||||||||||||||
2311 | __isl_keep isl_space *src) | ||||||||||||||||
2312 | { | ||||||||||||||||
2313 | isl_bool equal_params; | ||||||||||||||||
2314 | enum isl_dim_type type = isl_dim_param; | ||||||||||||||||
2315 | |||||||||||||||||
2316 | equal_params = isl_space_has_equal_params(dst, src); | ||||||||||||||||
2317 | if (equal_params < 0) | ||||||||||||||||
2318 | return isl_space_free(dst); | ||||||||||||||||
2319 | if (equal_params) | ||||||||||||||||
2320 | return dst; | ||||||||||||||||
2321 | |||||||||||||||||
2322 | dst = isl_space_cow(dst); | ||||||||||||||||
2323 | |||||||||||||||||
2324 | if (!dst || !src) | ||||||||||||||||
2325 | goto error; | ||||||||||||||||
2326 | |||||||||||||||||
2327 | dst = isl_space_drop_dims(dst, type, 0, isl_space_dim(dst, type)); | ||||||||||||||||
2328 | dst = isl_space_add_dims(dst, type, isl_space_dim(src, type)); | ||||||||||||||||
2329 | dst = copy_ids(dst, type, 0, src, type); | ||||||||||||||||
2330 | |||||||||||||||||
2331 | if (dst) { | ||||||||||||||||
2332 | int i; | ||||||||||||||||
2333 | for (i = 0; i <= 1; ++i) { | ||||||||||||||||
2334 | if (!dst->nested[i]) | ||||||||||||||||
2335 | continue; | ||||||||||||||||
2336 | dst->nested[i] = isl_space_replace_params( | ||||||||||||||||
2337 | dst->nested[i], src); | ||||||||||||||||
2338 | if (!dst->nested[i]) | ||||||||||||||||
2339 | goto error; | ||||||||||||||||
2340 | } | ||||||||||||||||
2341 | } | ||||||||||||||||
2342 | |||||||||||||||||
2343 | return dst; | ||||||||||||||||
2344 | error: | ||||||||||||||||
2345 | isl_space_free(dst); | ||||||||||||||||
2346 | return NULL((void*)0); | ||||||||||||||||
2347 | } | ||||||||||||||||
2348 | |||||||||||||||||
2349 | /* Given a dimension specification "dim" of a set, create a dimension | ||||||||||||||||
2350 | * specification for the lift of the set. In particular, the result | ||||||||||||||||
2351 | * is of the form [dim -> local[..]], with n_local variables in the | ||||||||||||||||
2352 | * range of the wrapped map. | ||||||||||||||||
2353 | */ | ||||||||||||||||
2354 | __isl_give isl_space *isl_space_lift(__isl_take isl_space *dim, unsigned n_local) | ||||||||||||||||
2355 | { | ||||||||||||||||
2356 | isl_space *local_dim; | ||||||||||||||||
2357 | |||||||||||||||||
2358 | if (!dim) | ||||||||||||||||
2359 | return NULL((void*)0); | ||||||||||||||||
2360 | |||||||||||||||||
2361 | local_dim = isl_space_dup(dim); | ||||||||||||||||
2362 | local_dim = isl_space_drop_dims(local_dim, isl_dim_set, 0, dim->n_out); | ||||||||||||||||
2363 | local_dim = isl_space_add_dims(local_dim, isl_dim_set, n_local); | ||||||||||||||||
2364 | local_dim = isl_space_set_tuple_name(local_dim, isl_dim_set, "local"); | ||||||||||||||||
2365 | dim = isl_space_join(isl_space_from_domain(dim), | ||||||||||||||||
2366 | isl_space_from_range(local_dim)); | ||||||||||||||||
2367 | dim = isl_space_wrap(dim); | ||||||||||||||||
2368 | dim = isl_space_set_tuple_name(dim, isl_dim_set, "lifted"); | ||||||||||||||||
2369 | |||||||||||||||||
2370 | return dim; | ||||||||||||||||
2371 | } | ||||||||||||||||
2372 | |||||||||||||||||
2373 | isl_bool isl_space_can_zip(__isl_keep isl_space *space) | ||||||||||||||||
2374 | { | ||||||||||||||||
2375 | isl_bool is_set; | ||||||||||||||||
2376 | |||||||||||||||||
2377 | is_set = isl_space_is_set(space); | ||||||||||||||||
2378 | if (is_set < 0) | ||||||||||||||||
2379 | return isl_bool_error; | ||||||||||||||||
2380 | if (is_set) | ||||||||||||||||
2381 | return isl_bool_false; | ||||||||||||||||
2382 | return isl_space_is_product(space); | ||||||||||||||||
2383 | } | ||||||||||||||||
2384 | |||||||||||||||||
2385 | __isl_give isl_space *isl_space_zip(__isl_take isl_space *dim) | ||||||||||||||||
2386 | { | ||||||||||||||||
2387 | isl_space *dom, *ran; | ||||||||||||||||
2388 | isl_space *dom_dom, *dom_ran, *ran_dom, *ran_ran; | ||||||||||||||||
2389 | |||||||||||||||||
2390 | if (!isl_space_can_zip(dim)) | ||||||||||||||||
2391 | isl_die(dim->ctx, isl_error_invalid, "dim cannot be zipped",do { isl_handle_error(dim->ctx, isl_error_invalid, "dim cannot be zipped" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2392); goto error; } while (0) | ||||||||||||||||
2392 | goto error)do { isl_handle_error(dim->ctx, isl_error_invalid, "dim cannot be zipped" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2392); goto error; } while (0); | ||||||||||||||||
2393 | |||||||||||||||||
2394 | if (!dim) | ||||||||||||||||
2395 | return NULL((void*)0); | ||||||||||||||||
2396 | dom = isl_space_unwrap(isl_space_domain(isl_space_copy(dim))); | ||||||||||||||||
2397 | ran = isl_space_unwrap(isl_space_range(dim)); | ||||||||||||||||
2398 | dom_dom = isl_space_domain(isl_space_copy(dom)); | ||||||||||||||||
2399 | dom_ran = isl_space_range(dom); | ||||||||||||||||
2400 | ran_dom = isl_space_domain(isl_space_copy(ran)); | ||||||||||||||||
2401 | ran_ran = isl_space_range(ran); | ||||||||||||||||
2402 | dom = isl_space_join(isl_space_from_domain(dom_dom), | ||||||||||||||||
2403 | isl_space_from_range(ran_dom)); | ||||||||||||||||
2404 | ran = isl_space_join(isl_space_from_domain(dom_ran), | ||||||||||||||||
2405 | isl_space_from_range(ran_ran)); | ||||||||||||||||
2406 | return isl_space_join(isl_space_from_domain(isl_space_wrap(dom)), | ||||||||||||||||
2407 | isl_space_from_range(isl_space_wrap(ran))); | ||||||||||||||||
2408 | error: | ||||||||||||||||
2409 | isl_space_free(dim); | ||||||||||||||||
2410 | return NULL((void*)0); | ||||||||||||||||
2411 | } | ||||||||||||||||
2412 | |||||||||||||||||
2413 | /* Can we apply isl_space_curry to "space"? | ||||||||||||||||
2414 | * That is, does it have a nested relation in its domain? | ||||||||||||||||
2415 | */ | ||||||||||||||||
2416 | isl_bool isl_space_can_curry(__isl_keep isl_space *space) | ||||||||||||||||
2417 | { | ||||||||||||||||
2418 | if (!space) | ||||||||||||||||
2419 | return isl_bool_error; | ||||||||||||||||
2420 | |||||||||||||||||
2421 | return !!space->nested[0]; | ||||||||||||||||
2422 | } | ||||||||||||||||
2423 | |||||||||||||||||
2424 | /* Given a space (A -> B) -> C, return the corresponding space | ||||||||||||||||
2425 | * A -> (B -> C). | ||||||||||||||||
2426 | */ | ||||||||||||||||
2427 | __isl_give isl_space *isl_space_curry(__isl_take isl_space *space) | ||||||||||||||||
2428 | { | ||||||||||||||||
2429 | isl_space *dom, *ran; | ||||||||||||||||
2430 | isl_space *dom_dom, *dom_ran; | ||||||||||||||||
2431 | |||||||||||||||||
2432 | if (!space) | ||||||||||||||||
2433 | return NULL((void*)0); | ||||||||||||||||
2434 | |||||||||||||||||
2435 | if (!isl_space_can_curry(space)) | ||||||||||||||||
2436 | isl_die(space->ctx, isl_error_invalid,do { isl_handle_error(space->ctx, isl_error_invalid, "space cannot be curried" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2437); goto error; } while (0) | ||||||||||||||||
2437 | "space cannot be curried", goto error)do { isl_handle_error(space->ctx, isl_error_invalid, "space cannot be curried" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2437); goto error; } while (0); | ||||||||||||||||
2438 | |||||||||||||||||
2439 | dom = isl_space_unwrap(isl_space_domain(isl_space_copy(space))); | ||||||||||||||||
2440 | ran = isl_space_range(space); | ||||||||||||||||
2441 | dom_dom = isl_space_domain(isl_space_copy(dom)); | ||||||||||||||||
2442 | dom_ran = isl_space_range(dom); | ||||||||||||||||
2443 | ran = isl_space_join(isl_space_from_domain(dom_ran), | ||||||||||||||||
2444 | isl_space_from_range(ran)); | ||||||||||||||||
2445 | return isl_space_join(isl_space_from_domain(dom_dom), | ||||||||||||||||
2446 | isl_space_from_range(isl_space_wrap(ran))); | ||||||||||||||||
2447 | error: | ||||||||||||||||
2448 | isl_space_free(space); | ||||||||||||||||
2449 | return NULL((void*)0); | ||||||||||||||||
2450 | } | ||||||||||||||||
2451 | |||||||||||||||||
2452 | /* Can isl_space_range_curry be applied to "space"? | ||||||||||||||||
2453 | * That is, does it have a nested relation in its range, | ||||||||||||||||
2454 | * the domain of which is itself a nested relation? | ||||||||||||||||
2455 | */ | ||||||||||||||||
2456 | isl_bool isl_space_can_range_curry(__isl_keep isl_space *space) | ||||||||||||||||
2457 | { | ||||||||||||||||
2458 | isl_bool can; | ||||||||||||||||
2459 | |||||||||||||||||
2460 | if (!space) | ||||||||||||||||
2461 | return isl_bool_error; | ||||||||||||||||
2462 | can = isl_space_range_is_wrapping(space); | ||||||||||||||||
2463 | if (can < 0 || !can) | ||||||||||||||||
2464 | return can; | ||||||||||||||||
2465 | return isl_space_can_curry(space->nested[1]); | ||||||||||||||||
2466 | } | ||||||||||||||||
2467 | |||||||||||||||||
2468 | /* Given a space A -> ((B -> C) -> D), return the corresponding space | ||||||||||||||||
2469 | * A -> (B -> (C -> D)). | ||||||||||||||||
2470 | */ | ||||||||||||||||
2471 | __isl_give isl_space *isl_space_range_curry(__isl_take isl_space *space) | ||||||||||||||||
2472 | { | ||||||||||||||||
2473 | if (!space) | ||||||||||||||||
2474 | return NULL((void*)0); | ||||||||||||||||
2475 | |||||||||||||||||
2476 | if (!isl_space_can_range_curry(space)) | ||||||||||||||||
2477 | isl_die(isl_space_get_ctx(space), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "space range cannot be curried", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2479); return isl_space_free(space); } while (0) | ||||||||||||||||
2478 | "space range cannot be curried",do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "space range cannot be curried", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2479); return isl_space_free(space); } while (0) | ||||||||||||||||
2479 | return isl_space_free(space))do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "space range cannot be curried", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2479); return isl_space_free(space); } while (0); | ||||||||||||||||
2480 | |||||||||||||||||
2481 | space = isl_space_cow(space); | ||||||||||||||||
2482 | if (!space) | ||||||||||||||||
2483 | return NULL((void*)0); | ||||||||||||||||
2484 | space->nested[1] = isl_space_curry(space->nested[1]); | ||||||||||||||||
2485 | if (!space->nested[1]) | ||||||||||||||||
2486 | return isl_space_free(space); | ||||||||||||||||
2487 | |||||||||||||||||
2488 | return space; | ||||||||||||||||
2489 | } | ||||||||||||||||
2490 | |||||||||||||||||
2491 | /* Can we apply isl_space_uncurry to "space"? | ||||||||||||||||
2492 | * That is, does it have a nested relation in its range? | ||||||||||||||||
2493 | */ | ||||||||||||||||
2494 | isl_bool isl_space_can_uncurry(__isl_keep isl_space *space) | ||||||||||||||||
2495 | { | ||||||||||||||||
2496 | if (!space) | ||||||||||||||||
2497 | return isl_bool_error; | ||||||||||||||||
2498 | |||||||||||||||||
2499 | return !!space->nested[1]; | ||||||||||||||||
2500 | } | ||||||||||||||||
2501 | |||||||||||||||||
2502 | /* Given a space A -> (B -> C), return the corresponding space | ||||||||||||||||
2503 | * (A -> B) -> C. | ||||||||||||||||
2504 | */ | ||||||||||||||||
2505 | __isl_give isl_space *isl_space_uncurry(__isl_take isl_space *space) | ||||||||||||||||
2506 | { | ||||||||||||||||
2507 | isl_space *dom, *ran; | ||||||||||||||||
2508 | isl_space *ran_dom, *ran_ran; | ||||||||||||||||
2509 | |||||||||||||||||
2510 | if (!space) | ||||||||||||||||
2511 | return NULL((void*)0); | ||||||||||||||||
2512 | |||||||||||||||||
2513 | if (!isl_space_can_uncurry(space)) | ||||||||||||||||
2514 | isl_die(space->ctx, isl_error_invalid,do { isl_handle_error(space->ctx, isl_error_invalid, "space cannot be uncurried" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2516); return isl_space_free(space); } while (0) | ||||||||||||||||
2515 | "space cannot be uncurried",do { isl_handle_error(space->ctx, isl_error_invalid, "space cannot be uncurried" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2516); return isl_space_free(space); } while (0) | ||||||||||||||||
2516 | return isl_space_free(space))do { isl_handle_error(space->ctx, isl_error_invalid, "space cannot be uncurried" , "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2516); return isl_space_free(space); } while (0); | ||||||||||||||||
2517 | |||||||||||||||||
2518 | dom = isl_space_domain(isl_space_copy(space)); | ||||||||||||||||
2519 | ran = isl_space_unwrap(isl_space_range(space)); | ||||||||||||||||
2520 | ran_dom = isl_space_domain(isl_space_copy(ran)); | ||||||||||||||||
2521 | ran_ran = isl_space_range(ran); | ||||||||||||||||
2522 | dom = isl_space_join(isl_space_from_domain(dom), | ||||||||||||||||
2523 | isl_space_from_range(ran_dom)); | ||||||||||||||||
2524 | return isl_space_join(isl_space_from_domain(isl_space_wrap(dom)), | ||||||||||||||||
2525 | isl_space_from_range(ran_ran)); | ||||||||||||||||
2526 | } | ||||||||||||||||
2527 | |||||||||||||||||
2528 | isl_bool isl_space_has_named_params(__isl_keep isl_space *space) | ||||||||||||||||
2529 | { | ||||||||||||||||
2530 | int i; | ||||||||||||||||
2531 | unsigned off; | ||||||||||||||||
2532 | |||||||||||||||||
2533 | if (!space) | ||||||||||||||||
2534 | return isl_bool_error; | ||||||||||||||||
2535 | if (space->nparam == 0) | ||||||||||||||||
2536 | return isl_bool_true; | ||||||||||||||||
2537 | off = isl_space_offset(space, isl_dim_param); | ||||||||||||||||
2538 | if (off + space->nparam > space->n_id) | ||||||||||||||||
2539 | return isl_bool_false; | ||||||||||||||||
2540 | for (i = 0; i < space->nparam; ++i) | ||||||||||||||||
2541 | if (!space->ids[off + i]) | ||||||||||||||||
2542 | return isl_bool_false; | ||||||||||||||||
2543 | return isl_bool_true; | ||||||||||||||||
2544 | } | ||||||||||||||||
2545 | |||||||||||||||||
2546 | /* Check that "space" has only named parameters, reporting an error | ||||||||||||||||
2547 | * if it does not. | ||||||||||||||||
2548 | */ | ||||||||||||||||
2549 | isl_stat isl_space_check_named_params(__isl_keep isl_space *space) | ||||||||||||||||
2550 | { | ||||||||||||||||
2551 | isl_bool named; | ||||||||||||||||
2552 | |||||||||||||||||
2553 | named = isl_space_has_named_params(space); | ||||||||||||||||
2554 | if (named < 0) | ||||||||||||||||
2555 | return isl_stat_error; | ||||||||||||||||
2556 | if (!named) | ||||||||||||||||
2557 | isl_die(isl_space_get_ctx(space), isl_error_invalid,do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "unexpected unnamed parameters", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2558); return isl_stat_error; } while (0) | ||||||||||||||||
2558 | "unexpected unnamed parameters", return isl_stat_error)do { isl_handle_error(isl_space_get_ctx(space), isl_error_invalid , "unexpected unnamed parameters", "/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c" , 2558); return isl_stat_error; } while (0); | ||||||||||||||||
2559 | |||||||||||||||||
2560 | return isl_stat_ok; | ||||||||||||||||
2561 | } | ||||||||||||||||
2562 | |||||||||||||||||
2563 | /* Align the initial parameters of space1 to match the order in space2. | ||||||||||||||||
2564 | */ | ||||||||||||||||
2565 | __isl_give isl_space *isl_space_align_params(__isl_take isl_space *space1, | ||||||||||||||||
2566 | __isl_take isl_space *space2) | ||||||||||||||||
2567 | { | ||||||||||||||||
2568 | isl_reordering *exp; | ||||||||||||||||
2569 | |||||||||||||||||
2570 | if (isl_space_check_named_params(space1) < 0 || | ||||||||||||||||
2571 | isl_space_check_named_params(space2) < 0) | ||||||||||||||||
2572 | goto error; | ||||||||||||||||
2573 | |||||||||||||||||
2574 | exp = isl_parameter_alignment_reordering(space1, space2); | ||||||||||||||||
2575 | exp = isl_reordering_extend_space(exp, space1); | ||||||||||||||||
2576 | isl_space_free(space2); | ||||||||||||||||
2577 | space1 = isl_reordering_get_space(exp); | ||||||||||||||||
2578 | isl_reordering_free(exp); | ||||||||||||||||
2579 | return space1; | ||||||||||||||||
2580 | error: | ||||||||||||||||
2581 | isl_space_free(space1); | ||||||||||||||||
2582 | isl_space_free(space2); | ||||||||||||||||
2583 | return NULL((void*)0); | ||||||||||||||||
2584 | } | ||||||||||||||||
2585 | |||||||||||||||||
2586 | /* Given the space of set (domain), construct a space for a map | ||||||||||||||||
2587 | * with as domain the given space and as range the range of "model". | ||||||||||||||||
2588 | */ | ||||||||||||||||
2589 | __isl_give isl_space *isl_space_extend_domain_with_range( | ||||||||||||||||
2590 | __isl_take isl_space *space, __isl_take isl_space *model) | ||||||||||||||||
2591 | { | ||||||||||||||||
2592 | if (!model) | ||||||||||||||||
2593 | goto error; | ||||||||||||||||
2594 | |||||||||||||||||
2595 | space = isl_space_from_domain(space); | ||||||||||||||||
2596 | space = isl_space_add_dims(space, isl_dim_out, | ||||||||||||||||
2597 | isl_space_dim(model, isl_dim_out)); | ||||||||||||||||
2598 | if (isl_space_has_tuple_id(model, isl_dim_out)) | ||||||||||||||||
2599 | space = isl_space_set_tuple_id(space, isl_dim_out, | ||||||||||||||||
2600 | isl_space_get_tuple_id(model, isl_dim_out)); | ||||||||||||||||
2601 | if (!space) | ||||||||||||||||
2602 | goto error; | ||||||||||||||||
2603 | if (model->nested[1]) { | ||||||||||||||||
2604 | isl_space *nested = isl_space_copy(model->nested[1]); | ||||||||||||||||
2605 | int n_nested, n_space; | ||||||||||||||||
2606 | nested = isl_space_align_params(nested, isl_space_copy(space)); | ||||||||||||||||
2607 | n_nested = isl_space_dim(nested, isl_dim_param); | ||||||||||||||||
2608 | n_space = isl_space_dim(space, isl_dim_param); | ||||||||||||||||
2609 | if (n_nested > n_space) | ||||||||||||||||
2610 | nested = isl_space_drop_dims(nested, isl_dim_param, | ||||||||||||||||
2611 | n_space, n_nested - n_space); | ||||||||||||||||
2612 | if (!nested) | ||||||||||||||||
2613 | goto error; | ||||||||||||||||
2614 | space->nested[1] = nested; | ||||||||||||||||
2615 | } | ||||||||||||||||
2616 | isl_space_free(model); | ||||||||||||||||
2617 | return space; | ||||||||||||||||
2618 | error: | ||||||||||||||||
2619 | isl_space_free(model); | ||||||||||||||||
2620 | isl_space_free(space); | ||||||||||||||||
2621 | return NULL((void*)0); | ||||||||||||||||
2622 | } | ||||||||||||||||
2623 | |||||||||||||||||
2624 | /* Compare the "type" dimensions of two isl_spaces. | ||||||||||||||||
2625 | * | ||||||||||||||||
2626 | * The order is fairly arbitrary. | ||||||||||||||||
2627 | */ | ||||||||||||||||
2628 | static int isl_space_cmp_type(__isl_keep isl_space *space1, | ||||||||||||||||
2629 | __isl_keep isl_space *space2, enum isl_dim_type type) | ||||||||||||||||
2630 | { | ||||||||||||||||
2631 | int cmp; | ||||||||||||||||
2632 | isl_space *nested1, *nested2; | ||||||||||||||||
2633 | |||||||||||||||||
2634 | if (isl_space_dim(space1, type) != isl_space_dim(space2, type)) | ||||||||||||||||
| |||||||||||||||||
2635 | return isl_space_dim(space1, type) - | ||||||||||||||||
2636 | isl_space_dim(space2, type); | ||||||||||||||||
2637 | |||||||||||||||||
2638 | cmp = isl_id_cmp(tuple_id(space1, type), tuple_id(space2, type)); | ||||||||||||||||
2639 | if (cmp != 0) | ||||||||||||||||
2640 | return cmp; | ||||||||||||||||
2641 | |||||||||||||||||
2642 | nested1 = nested(space1, type); | ||||||||||||||||
2643 | nested2 = nested(space2, type); | ||||||||||||||||
2644 | if (!nested1 != !nested2) | ||||||||||||||||
2645 | return !nested1 - !nested2; | ||||||||||||||||
2646 | |||||||||||||||||
2647 | if (nested1
| ||||||||||||||||
2648 | return isl_space_cmp(nested1, nested2); | ||||||||||||||||
2649 | |||||||||||||||||
2650 | return 0; | ||||||||||||||||
2651 | } | ||||||||||||||||
2652 | |||||||||||||||||
2653 | /* Compare two isl_spaces. | ||||||||||||||||
2654 | * | ||||||||||||||||
2655 | * The order is fairly arbitrary. | ||||||||||||||||
2656 | */ | ||||||||||||||||
2657 | int isl_space_cmp(__isl_keep isl_space *space1, __isl_keep isl_space *space2) | ||||||||||||||||
2658 | { | ||||||||||||||||
2659 | int i; | ||||||||||||||||
2660 | int cmp; | ||||||||||||||||
2661 | |||||||||||||||||
2662 | if (space1 == space2) | ||||||||||||||||
2663 | return 0; | ||||||||||||||||
2664 | if (!space1
| ||||||||||||||||
2665 | return -1; | ||||||||||||||||
2666 | if (!space2
| ||||||||||||||||
2667 | return 1; | ||||||||||||||||
2668 | |||||||||||||||||
2669 | cmp = isl_space_cmp_type(space1, space2, isl_dim_param); | ||||||||||||||||
2670 | if (cmp
| ||||||||||||||||
2671 | return cmp; | ||||||||||||||||
2672 | cmp = isl_space_cmp_type(space1, space2, isl_dim_in); | ||||||||||||||||
2673 | if (cmp
| ||||||||||||||||
2674 | return cmp; | ||||||||||||||||
2675 | cmp = isl_space_cmp_type(space1, space2, isl_dim_out); | ||||||||||||||||
2676 | if (cmp
| ||||||||||||||||
2677 | return cmp; | ||||||||||||||||
2678 | |||||||||||||||||
2679 | if (!space1->ids && !space2->ids) | ||||||||||||||||
2680 | return 0; | ||||||||||||||||
2681 | |||||||||||||||||
2682 | for (i = 0; i < n(space1, isl_dim_param); ++i) { | ||||||||||||||||
2683 | cmp = isl_id_cmp(get_id(space1, isl_dim_param, i), | ||||||||||||||||
2684 | get_id(space2, isl_dim_param, i)); | ||||||||||||||||
2685 | if (cmp != 0) | ||||||||||||||||
2686 | return cmp; | ||||||||||||||||
2687 | } | ||||||||||||||||
2688 | |||||||||||||||||
2689 | return 0; | ||||||||||||||||
2690 | } |