Bug Summary

File:polly/lib/External/isl/isl_space.c
Warning:line 233, column 9
Array access (via field 'ids') results in a null pointer dereference

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name isl_space.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mthread-model posix -mframe-pointer=none -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -ffunction-sections -fdata-sections -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/build-llvm/tools/polly/lib/External -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/pet/include -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/ppcg/include -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/ppcg/imath -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/build-llvm/tools/polly/lib/External/ppcg -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/include -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/imath -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/build-llvm/tools/polly/lib/External/isl -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/build-llvm/tools/polly/include -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/build-llvm/tools/polly/lib/External/isl/include -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/include -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/build-llvm/include -I /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/llvm/include -U NDEBUG -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-comment -std=gnu99 -fconst-strings -fdebug-compilation-dir /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/build-llvm/tools/polly/lib/External -fdebug-prefix-map=/build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da=. -ferror-limit 19 -fmessage-length 0 -stack-protector 2 -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -o /tmp/scan-build-2020-01-02-185133-36554-1 -x c /build/llvm-toolchain-snapshot-10~+20200102111109+a2976c490da/polly/lib/External/isl/isl_space.c
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
21isl_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 */
57static __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 */
68isl_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 */
81isl_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 */
101static __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 */
112isl_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
136static 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) {
206
Control jumps to 'case isl_dim_param:' at line 142
142 case isl_dim_param:
143 isl_assert
206.1
'pos' is < field 'nparam'
(ctx, pos < dim->nparam,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)
207
Taking true branch
208
Execution continues on line 145
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;
209
Returning without writing to 'dim->ids'
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 */
162static __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;
188error:
189 isl_space_free(dim);
190 return NULL((void*)0);
191}
192
193static __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;
216error:
217 isl_id_free(id);
218 isl_space_free(dim);
219 return NULL((void*)0);
220}
221
222static __isl_keep isl_id *get_id(__isl_keep isl_space *dim,
223 enum isl_dim_type type, unsigned pos)
224{
225 if (!dim
203.1
'dim' is non-null
)
204
Taking false branch
226 return NULL((void*)0);
227
228 pos = global_pos(dim, type, pos);
205
Calling 'global_pos'
210
Returning from 'global_pos'
229 if (pos == isl_space_dim(dim, isl_dim_all))
211
Calling 'isl_space_dim'
218
Returning from 'isl_space_dim'
219
Assuming the condition is false
220
Taking false branch
230 return NULL((void*)0);
231 if (pos >= dim->n_id)
221
Assuming 'pos' is < field 'n_id'
222
Taking false branch
232 return NULL((void*)0);
233 return dim->ids[pos];
223
Array access (via field 'ids') results in a null pointer dereference
234}
235
236static 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
246static unsigned n(__isl_keep isl_space *dim, enum isl_dim_type type)
247{
248 switch (type) {
30
Control jumps to 'case isl_dim_param:' at line 249
40
Control jumps to 'case isl_dim_param:' at line 249
86
Control jumps to 'case isl_dim_in:' at line 250
96
Control jumps to 'case isl_dim_in:' at line 250
140
Control jumps to 'case isl_dim_out:' at line 251
150
Control jumps to 'case isl_dim_out:' at line 251
198
Control jumps to 'case isl_dim_param:' at line 249
214
Control jumps to 'case isl_dim_all:' at line 252
249 case isl_dim_param: return dim->nparam;
31
Returning without writing to 'dim->ids', which participates in a condition later
32
Returning without writing to 'dim->ids'
41
Returning without writing to 'dim->ids', which participates in a condition later
199
Returning without writing to 'dim->ids'
250 case isl_dim_in: return dim->n_in;
87
Returning without writing to 'dim->ids', which participates in a condition later
88
Returning without writing to 'dim->ids'
97
Returning without writing to 'dim->ids', which participates in a condition later
251 case isl_dim_out: return dim->n_out;
141
Returning without writing to 'dim->ids', which participates in a condition later
142
Returning without writing to 'dim->ids'
151
Returning without writing to 'dim->ids', which participates in a condition later
252 case isl_dim_all: return dim->nparam + dim->n_in + dim->n_out;
215
Returning without writing to 'dim->ids'
253 default: return 0;
254 }
255}
256
257unsigned isl_space_dim(__isl_keep isl_space *dim, enum isl_dim_type type)
258{
259 if (!dim
27.1
'dim' is non-null
37.1
'dim' is non-null
83.1
'dim' is non-null
93.1
'dim' is non-null
137.1
'dim' is non-null
147.1
'dim' is non-null
211.1
'dim' is non-null
)
28
Taking false branch
38
Taking false branch
84
Taking false branch
94
Taking false branch
138
Taking false branch
148
Taking false branch
212
Taking false branch
260 return 0;
261 return n(dim, type);
29
Calling 'n'
33
Returning from 'n'
34
Returning without writing to 'dim->ids', which participates in a condition later
35
Returning without writing to 'dim->ids'
39
Calling 'n'
42
Returning from 'n'
43
Returning without writing to 'dim->ids', which participates in a condition later
85
Calling 'n'
89
Returning from 'n'
90
Returning without writing to 'dim->ids', which participates in a condition later
91
Returning without writing to 'dim->ids'
95
Calling 'n'
98
Returning from 'n'
99
Returning without writing to 'dim->ids', which participates in a condition later
139
Calling 'n'
143
Returning from 'n'
144
Returning without writing to 'dim->ids', which participates in a condition later
145
Returning without writing to 'dim->ids'
149
Calling 'n'
152
Returning from 'n'
153
Returning without writing to 'dim->ids', which participates in a condition later
213
Calling 'n'
216
Returning from 'n'
217
Returning without writing to 'dim->ids'
262}
263
264unsigned 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
271static __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;
316error:
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 */
372static 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 */
387static 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 */
408isl_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;
447error:
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;
468error:
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);
501error:
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));
535error:
536 isl_space_free(space);
537 return NULL((void*)0);
538}
539
540isl_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);
575error:
576 isl_space_free(dim);
577 return NULL((void*)0);
578}
579
580/* Does the tuple have a name?
581 */
582isl_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);
619error:
620 isl_space_free(dim);
621 return NULL((void*)0);
622}
623
624/* Does the given dimension have a name?
625 */
626isl_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
644int 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
663int 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
743static __isl_keep isl_id *tuple_id(__isl_keep isl_space *dim,
744 enum isl_dim_type type)
745{
746 if (!dim
47.1
'dim' is non-null
54.1
'dim' is non-null
103.1
'dim' is non-null
109.1
'dim' is non-null
157.1
'dim' is non-null
164.1
'dim' is non-null
)
48
Taking false branch
55
Taking false branch
104
Taking false branch
110
Taking false branch
158
Taking false branch
165
Taking false branch
747 return NULL((void*)0);
748 if (type
48.1
'type' is not equal to isl_dim_in
55.1
'type' is not equal to isl_dim_in
104.1
'type' is equal to isl_dim_in
110.1
'type' is equal to isl_dim_in
158.1
'type' is not equal to isl_dim_in
165.1
'type' is not equal to isl_dim_in
== isl_dim_in)
49
Taking false branch
56
Taking false branch
105
Taking true branch
111
Taking true branch
159
Taking false branch
166
Taking false branch
749 return dim->tuple_id[0];
106
Returning without writing to 'dim->ids', which participates in a condition later
107
Returning without writing to 'dim->ids'
112
Returning without writing to 'dim->ids', which participates in a condition later
750 if (type
49.1
'type' is not equal to isl_dim_out
56.1
'type' is not equal to isl_dim_out
159.1
'type' is equal to isl_dim_out
166.1
'type' is equal to isl_dim_out
== isl_dim_out)
50
Taking false branch
57
Taking false branch
160
Taking true branch
167
Taking true branch
751 return dim->tuple_id[1];
161
Returning without writing to 'dim->ids', which participates in a condition later
162
Returning without writing to 'dim->ids'
168
Returning without writing to 'dim->ids', which participates in a condition later
752 return NULL((void*)0);
51
Returning without writing to 'dim->ids', which participates in a condition later
52
Returning without writing to 'dim->ids'
58
Returning without writing to 'dim->ids', which participates in a condition later
753}
754
755static __isl_keep isl_space *nested(__isl_keep isl_space *dim,
756 enum isl_dim_type type)
757{
758 if (!dim
5.1
'dim' is non-null
11.1
'dim' is non-null
62.1
'dim' is non-null
69.1
'dim' is non-null
116.1
'dim' is non-null
122.1
'dim' is non-null
172.1
'dim' is non-null
179.1
'dim' is non-null
)
6
Taking false branch
12
Taking false branch
63
Taking false branch
70
Taking false branch
117
Taking false branch
123
Taking false branch
173
Taking false branch
180
Taking false branch
759 return NULL((void*)0);
760 if (type
6.1
'type' is not equal to isl_dim_in
12.1
'type' is not equal to isl_dim_in
63.1
'type' is not equal to isl_dim_in
70.1
'type' is not equal to isl_dim_in
117.1
'type' is equal to isl_dim_in
123.1
'type' is equal to isl_dim_in
173.1
'type' is not equal to isl_dim_in
180.1
'type' is not equal to isl_dim_in
== isl_dim_in)
7
Taking false branch
13
Taking false branch
64
Taking false branch
71
Taking false branch
118
Taking true branch
124
Taking true branch
174
Taking false branch
181
Taking false branch
761 return dim->nested[0];
119
Returning without writing to 'dim->ids', which participates in a condition later
120
Returning without writing to 'dim->ids'
125
Returning without writing to 'dim->ids', which participates in a condition later
762 if (type
7.1
'type' is equal to isl_dim_out
13.1
'type' is equal to isl_dim_out
64.1
'type' is not equal to isl_dim_out
71.1
'type' is not equal to isl_dim_out
174.1
'type' is equal to isl_dim_out
181.1
'type' is equal to isl_dim_out
== isl_dim_out)
8
Taking true branch
14
Taking true branch
65
Taking false branch
72
Taking false branch
175
Taking true branch
182
Taking true branch
763 return dim->nested[1];
9
Returning pointer, which participates in a condition later
15
Returning pointer, which participates in a condition later
176
Returning without writing to 'dim->ids', which participates in a condition later
177
Returning without writing to 'dim->ids'
183
Returning without writing to 'dim->ids', which participates in a condition later
764 return NULL((void*)0);
66
Returning without writing to 'dim->ids', which participates in a condition later
67
Returning without writing to 'dim->ids'
73
Returning without writing to 'dim->ids', which participates in a condition later
765}
766
767/* Are the two spaces the same, apart from positions and names of parameters?
768 */
769isl_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 */
794isl_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
824static 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 */
847isl_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 */
859isl_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
873isl_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
882static 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
891static __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;
933error:
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 }
974error:
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;
1000error:
1001 isl_space_free(space);
1002 isl_id_free(id);
1003 return NULL((void*)0);
1004}
1005
1006static 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;
1099error:
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;
1194error:
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 */
1202isl_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;
1253error:
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);
1292error:
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);
1320error:
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);
1345error:
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;
1384error:
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;
1422error:
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 */
1433static __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;
1460error:
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 */
1482static __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 */
1512static __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;
1538error:
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 */
1560static __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;
1620error:
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);
1637error:
1638 isl_space_free(domain);
1639 isl_space_free(range);
1640 return NULL((void*)0);
1641}
1642
1643static __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;
1699error:
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;
1764error:
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;
1805error:
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);
1827error:
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);
1878error:
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 */
1911isl_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 */
1932isl_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 */
1949isl_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 */
1964isl_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 */
1979isl_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 */
1997isl_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 */
2009static 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 */
2030static 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 */
2055static 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 */
2078uint32_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
2091uint32_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 */
2109uint32_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
2123isl_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 */
2136isl_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 */
2149isl_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 */
2164isl_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;
2200error:
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;
2220error:
2221 isl_space_free(dim);
2222 return NULL((void*)0);
2223}
2224
2225isl_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
2239isl_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;
2344error:
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
2373isl_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)));
2408error:
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 */
2416isl_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)));
2447error:
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 */
2456isl_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 */
2494isl_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
2528isl_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 */
2549isl_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;
2580error:
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;
2618error:
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 */
2628static 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))
1
Assuming the condition is false
2
Taking false branch
27
Calling 'isl_space_dim'
36
Returning from 'isl_space_dim'
37
Calling 'isl_space_dim'
44
Returning from 'isl_space_dim'
45
Assuming the condition is false
46
Taking false branch
83
Calling 'isl_space_dim'
92
Returning from 'isl_space_dim'
93
Calling 'isl_space_dim'
100
Returning from 'isl_space_dim'
101
Assuming the condition is false
102
Taking false branch
137
Calling 'isl_space_dim'
146
Returning from 'isl_space_dim'
147
Calling 'isl_space_dim'
154
Returning from 'isl_space_dim'
155
Assuming the condition is false
156
Taking false branch
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));
47
Calling 'tuple_id'
53
Returning from 'tuple_id'
54
Calling 'tuple_id'
59
Returning from 'tuple_id'
103
Calling 'tuple_id'
108
Returning from 'tuple_id'
109
Calling 'tuple_id'
113
Returning from 'tuple_id'
157
Calling 'tuple_id'
163
Returning from 'tuple_id'
164
Calling 'tuple_id'
169
Returning from 'tuple_id'
2639 if (cmp != 0)
3
Assuming 'cmp' is equal to 0
4
Taking false branch
60
Assuming 'cmp' is equal to 0
61
Taking false branch
114
Assuming 'cmp' is equal to 0
115
Taking false branch
170
Assuming 'cmp' is equal to 0
171
Taking false branch
2640 return cmp;
2641
2642 nested1 = nested(space1, type);
5
Calling 'nested'
10
Returning from 'nested'
62
Calling 'nested'
68
Returning from 'nested'
116
Calling 'nested'
121
Returning from 'nested'
172
Calling 'nested'
178
Returning from 'nested'
2643 nested2 = nested(space2, type);
11
Calling 'nested'
16
Returning from 'nested'
69
Calling 'nested'
74
Returning from 'nested'
122
Calling 'nested'
126
Returning from 'nested'
179
Calling 'nested'
184
Returning from 'nested'
2644 if (!nested1 != !nested2)
17
Assuming 'nested1' is non-null
18
Assuming 'nested2' is non-null
19
Taking false branch
75
Taking false branch
127
Assuming 'nested1' is non-null
128
Assuming 'nested2' is non-null
129
Taking false branch
185
Assuming 'nested1' is non-null
186
Assuming 'nested2' is non-null
187
Taking false branch
2645 return !nested1 - !nested2;
2646
2647 if (nested1
19.1
'nested1' is non-null
75.1
'nested1' is null
129.1
'nested1' is non-null
187.1
'nested1' is non-null
)
20
Taking true branch
76
Taking false branch
130
Taking true branch
188
Taking true branch
2648 return isl_space_cmp(nested1, nested2);
21
Calling 'isl_space_cmp'
131
Returning without writing to 'space1->ids', which participates in a condition later
132
Returning without writing to 'space2->ids', which participates in a condition later
133
Returning without writing to 'space1->ids'
189
Returning without writing to 'space1->ids', which participates in a condition later
190
Returning without writing to 'space2->ids', which participates in a condition later
191
Returning without writing to 'space1->ids'
2649
2650 return 0;
77
Returning without writing to 'space1->ids', which participates in a condition later
78
Returning without writing to 'space2->ids', which participates in a condition later
79
Returning without writing to 'space1->ids'
2651}
2652
2653/* Compare two isl_spaces.
2654 *
2655 * The order is fairly arbitrary.
2656 */
2657int 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)
22
Assuming 'space1' is not equal to 'space2'
23
Taking false branch
2663 return 0;
2664 if (!space1
23.1
'space1' is non-null
)
24
Taking false branch
2665 return -1;
2666 if (!space2
24.1
'space2' is non-null
)
25
Taking false branch
2667 return 1;
2668
2669 cmp = isl_space_cmp_type(space1, space2, isl_dim_param);
26
Calling 'isl_space_cmp_type'
80
Returning from 'isl_space_cmp_type'
2670 if (cmp
80.1
'cmp' is equal to 0
!= 0)
81
Taking false branch
2671 return cmp;
2672 cmp = isl_space_cmp_type(space1, space2, isl_dim_in);
82
Calling 'isl_space_cmp_type'
134
Returning from 'isl_space_cmp_type'
2673 if (cmp
134.1
'cmp' is equal to 0
!= 0)
135
Taking false branch
2674 return cmp;
2675 cmp = isl_space_cmp_type(space1, space2, isl_dim_out);
136
Calling 'isl_space_cmp_type'
192
Returning from 'isl_space_cmp_type'
2676 if (cmp
192.1
'cmp' is equal to 0
!= 0)
193
Taking false branch
2677 return cmp;
2678
2679 if (!space1->ids && !space2->ids)
194
Assuming field 'ids' is null
195
Assuming field 'ids' is non-null
196
Taking false branch
2680 return 0;
2681
2682 for (i = 0; i < n(space1, isl_dim_param); ++i) {
197
Calling 'n'
200
Returning from 'n'
201
Assuming the condition is true
202
Loop condition is true. Entering loop body
2683 cmp = isl_id_cmp(get_id(space1, isl_dim_param, i),
203
Calling 'get_id'
2684 get_id(space2, isl_dim_param, i));
2685 if (cmp != 0)
2686 return cmp;
2687 }
2688
2689 return 0;
2690}