Polly 19.0.0git
isl_schedule_constraints.c
Go to the documentation of this file.
1/*
2 * Copyright 2012 Ecole Normale Superieure
3 * Copyright 2015-2016 Sven Verdoolaege
4 *
5 * Use of this software is governed by the MIT license
6 *
7 * Written by Sven Verdoolaege,
8 * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France
9 */
10
12#include <isl/schedule.h>
13#include <isl/space.h>
14#include <isl/set.h>
15#include <isl/map.h>
16#include <isl/union_set.h>
17#include <isl/union_map.h>
18#include <isl/stream.h>
19
20/* The constraints that need to be satisfied by a schedule on "domain".
21 *
22 * "context" specifies extra constraints on the parameters.
23 *
24 * "validity" constraints map domain elements i to domain elements
25 * that should be scheduled after i. (Hard constraint)
26 * "proximity" constraints map domain elements i to domains elements
27 * that should be scheduled as early as possible after i (or before i).
28 * (Soft constraint)
29 *
30 * "condition" and "conditional_validity" constraints map possibly "tagged"
31 * domain elements i -> s to "tagged" domain elements j -> t.
32 * The elements of the "conditional_validity" constraints, but without the
33 * tags (i.e., the elements i -> j) are treated as validity constraints,
34 * except that during the construction of a tilable band,
35 * the elements of the "conditional_validity" constraints may be violated
36 * provided that all adjacent elements of the "condition" constraints
37 * are local within the band.
38 * A dependence is local within a band if domain and range are mapped
39 * to the same schedule point by the band.
40 */
44
46};
47
50{
51 isl_ctx *ctx;
53 enum isl_edge_type i;
54
55 ctx = isl_union_set_get_ctx(sc->domain);
56 sc_copy = isl_calloc_type(ctx, struct isl_schedule_constraints);
57 if (!sc_copy)
58 return NULL;
59
60 sc_copy->domain = isl_union_set_copy(sc->domain);
61 sc_copy->context = isl_set_copy(sc->context);
62 if (!sc_copy->domain || !sc_copy->context)
63 return isl_schedule_constraints_free(sc_copy);
64
65 for (i = isl_edge_first; i <= isl_edge_last; ++i) {
66 sc_copy->constraint[i] = isl_union_map_copy(sc->constraint[i]);
67 if (!sc_copy->constraint[i])
68 return isl_schedule_constraints_free(sc_copy);
69 }
70
71 return sc_copy;
72}
73
74/* Construct an empty (invalid) isl_schedule_constraints object.
75 * The caller is responsible for setting the domain and initializing
76 * all the other fields, e.g., by calling isl_schedule_constraints_init.
77 */
79 isl_ctx *ctx)
80{
81 return isl_calloc_type(ctx, struct isl_schedule_constraints);
82}
83
84/* Initialize all the fields of "sc", except domain, which is assumed
85 * to have been set by the caller.
86 */
89{
90 isl_space *space;
91 isl_union_map *empty;
92 enum isl_edge_type i;
93
94 if (!sc)
95 return NULL;
96 if (!sc->domain)
98 space = isl_union_set_get_space(sc->domain);
99 if (!sc->context)
100 sc->context = isl_set_universe(isl_space_copy(space));
101 empty = isl_union_map_empty(space);
102 for (i = isl_edge_first; i <= isl_edge_last; ++i) {
103 if (sc->constraint[i])
104 continue;
105 sc->constraint[i] = isl_union_map_copy(empty);
106 if (!sc->constraint[i])
107 sc->domain = isl_union_set_free(sc->domain);
108 }
109 isl_union_map_free(empty);
110
111 if (!sc->domain || !sc->context)
113
114 return sc;
115}
116
117/* Construct an isl_schedule_constraints object for computing a schedule
118 * on "domain". The initial object does not impose any constraints.
119 */
122{
123 isl_ctx *ctx;
125
126 if (!domain)
127 return NULL;
128
131 if (!sc)
132 goto error;
133
134 sc->domain = domain;
136error:
138 return NULL;
139}
140
141/* Replace the domain of "sc" by "domain".
142 */
146{
147 if (!sc || !domain)
148 goto error;
149
150 isl_union_set_free(sc->domain);
151 sc->domain = domain;
152
153 return sc;
154error:
157 return NULL;
158}
159
160/* Replace the context of "sc" by "context".
161 */
164{
165 if (!sc || !context)
166 goto error;
167
168 isl_set_free(sc->context);
169 sc->context = context;
170
171 return sc;
172error:
175 return NULL;
176}
177
178/* Replace the constraints of type "type" in "sc" by "c".
179 *
180 * First detect any equality constraints that may be implicit in "c"
181 * in order to try and improve the accuracy of the input (and therefore
182 * also the output) of the isl_set_coefficients calls
183 * that are eventually performed on (some of) these constraints.
184 */
188{
190 if (!sc || !c)
191 goto error;
192
193 isl_union_map_free(sc->constraint[type]);
194 sc->constraint[type] = c;
195
196 return sc;
197error:
200 return NULL;
201}
202
203/* Replace the validity constraints of "sc" by "validity".
204 */
207 __isl_take isl_union_map *validity)
208{
210}
211
212/* Replace the coincidence constraints of "sc" by "coincidence".
213 */
216 __isl_take isl_union_map *coincidence)
217{
219 coincidence);
220}
221
222/* Replace the proximity constraints of "sc" by "proximity".
223 */
226 __isl_take isl_union_map *proximity)
227{
229}
230
231/* Replace the conditional validity constraints of "sc" by "condition"
232 * and "validity".
233 */
238 __isl_take isl_union_map *validity)
239{
242 validity);
243 return sc;
244}
245
248{
249 enum isl_edge_type i;
250
251 if (!sc)
252 return NULL;
253
254 isl_union_set_free(sc->domain);
255 isl_set_free(sc->context);
256 for (i = isl_edge_first; i <= isl_edge_last; ++i)
257 isl_union_map_free(sc->constraint[i]);
258
259 free(sc);
260
261 return NULL;
262}
263
266{
267 return sc ? isl_union_set_get_ctx(sc->domain) : NULL;
268}
269
270/* Return the domain of "sc".
271 */
274{
275 if (!sc)
276 return NULL;
277
278 return isl_union_set_copy(sc->domain);
279}
280
281/* Return the context of "sc".
282 */
285{
286 if (!sc)
287 return NULL;
288
289 return isl_set_copy(sc->context);
290}
291
292/* Return the constraints of type "type" in "sc".
293 */
296{
297 if (!sc)
298 return NULL;
299
300 return isl_union_map_copy(sc->constraint[type]);
301}
302
303/* Return the validity constraints of "sc".
304 */
307{
309}
310
311/* Return the coincidence constraints of "sc".
312 */
315{
317}
318
319/* Return the proximity constraints of "sc".
320 */
323{
325}
326
327/* Return the conditional validity constraints of "sc".
328 */
331{
333}
334
335/* Return the conditions for the conditional validity constraints of "sc".
336 */
340{
342}
343
344/* Add "c" to the constraints of type "type" in "sc".
345 */
349{
350 if (!sc || !c)
351 goto error;
352
353 c = isl_union_map_union(sc->constraint[type], c);
354 sc->constraint[type] = c;
355 if (!c)
357
358 return sc;
359error:
362 return NULL;
363}
364
365/* Can a schedule constraint of type "type" be tagged?
366 */
368{
370 return 1;
371 return 0;
372}
373
374/* Apply "umap" to the domains of the wrapped relations
375 * inside the domain and range of "c".
376 *
377 * That is, for each map of the form
378 *
379 * [D -> S] -> [E -> T]
380 *
381 * in "c", apply "umap" to D and E.
382 *
383 * D is exposed by currying the relation to
384 *
385 * D -> [S -> [E -> T]]
386 *
387 * E is exposed by doing the same to the inverse of "c".
388 */
391{
392 c = isl_union_map_curry(c);
395
397 c = isl_union_map_curry(c);
401
402 return c;
403}
404
405/* Apply "umap" to domain and range of "c".
406 * If "tag" is set, then "c" may contain tags and then "umap"
407 * needs to be applied to the domains of the wrapped relations
408 * inside the domain and range of "c".
409 */
411 __isl_keep isl_union_map *umap, int tag)
412{
414
415 if (tag)
419 if (!tag)
420 return c;
421 t = apply_factor_domain(t, umap);
422 c = isl_union_map_union(c, t);
423 return c;
424}
425
426/* Apply "umap" to the domain of the schedule constraints "sc".
427 *
428 * The two sides of the various schedule constraints are adjusted
429 * accordingly.
430 */
434{
435 enum isl_edge_type i;
436
437 if (!sc || !umap)
438 goto error;
439
440 for (i = isl_edge_first; i <= isl_edge_last; ++i) {
441 int tag = may_be_tagged(i);
442
443 sc->constraint[i] = apply(sc->constraint[i], umap, tag);
444 if (!sc->constraint[i])
445 goto error;
446 }
447 sc->domain = isl_union_set_apply(sc->domain, umap);
448 if (!sc->domain)
450
451 return sc;
452error:
454 isl_union_map_free(umap);
455 return NULL;
456}
457
458/* An enumeration of the various keys that may appear in a YAML mapping
459 * of an isl_schedule_constraints object.
460 * The keys for the edge types are assumed to have the same values
461 * as the edge types in isl_edge_type.
462 */
474
475/* Textual representations of the YAML keys for an isl_schedule_constraints
476 * object.
477 */
478static char *key_str[] = {
479 [isl_sc_key_validity] = "validity",
480 [isl_sc_key_coincidence] = "coincidence",
481 [isl_sc_key_condition] = "condition",
482 [isl_sc_key_conditional_validity] = "conditional_validity",
483 [isl_sc_key_proximity] = "proximity",
484 [isl_sc_key_domain] = "domain",
485 [isl_sc_key_context] = "context",
486};
487
488#undef BASE
489#define BASE set
491
492#undef BASE
493#define BASE union_set
495
496#undef BASE
497#define BASE union_map
499
500/* Print a key, value pair for the edge of type "type" in "sc" to "p".
501 *
502 * If the edge relation is empty, then it is not printed since
503 * an empty relation is the default value.
504 */
507{
508 isl_bool empty;
509
510 empty = isl_union_map_plain_is_empty(sc->constraint[type]);
511 if (empty < 0)
512 return isl_printer_free(p);
513 if (empty)
514 return p;
515
516 p = print_yaml_field_union_map(p, key_str[type], sc->constraint[type]);
517
518 return p;
519}
520
521/* Print "sc" to "p"
522 *
523 * In particular, print the isl_schedule_constraints object as a YAML document.
524 * Fields with values that are (obviously) equal to their default values
525 * are not printed.
526 */
529{
531
532 if (!sc)
533 return isl_printer_free(p);
534
536 p = print_yaml_field_union_set(p, key_str[isl_sc_key_domain],
537 sc->domain);
538 universe = isl_set_plain_is_universe(sc->context);
539 if (universe < 0)
540 return isl_printer_free(p);
541 if (!universe)
542 p = print_yaml_field_set(p, key_str[isl_sc_key_context],
543 sc->context);
550
551 return p;
552}
553
554#undef BASE
555#define BASE schedule_constraints
556#include <print_templ_yaml.c>
557
558#undef KEY
559#define KEY enum isl_sc_key
560#undef KEY_ERROR
561#define KEY_ERROR isl_sc_key_error
562#undef KEY_END
563#define KEY_END isl_sc_key_end
564#undef KEY_STR
565#define KEY_STR key_str
566#undef KEY_EXTRACT
567#define KEY_EXTRACT extract_key
568#undef KEY_GET
569#define KEY_GET get_key
570#include "extract_key.c"
571
572#undef BASE
573#define BASE set
574#include "read_in_string_templ.c"
575
576#undef BASE
577#define BASE union_set
578#include "read_in_string_templ.c"
579
580#undef BASE
581#define BASE union_map
582#include "read_in_string_templ.c"
583
584/* Read an isl_schedule_constraints object from "s".
585 *
586 * Start off with an empty (invalid) isl_schedule_constraints object and
587 * then fill up the fields based on the input.
588 * The input needs to contain at least a description of the domain.
589 * The other fields are set to defaults by isl_schedule_constraints_init
590 * if they are not specified in the input.
591 */
593 isl_stream *s)
594{
595 isl_ctx *ctx;
597 isl_bool more;
598 int domain_set = 0;
599
601 return NULL;
602
603 ctx = isl_stream_get_ctx(s);
605 while ((more = isl_stream_yaml_next(s)) == isl_bool_true) {
606 enum isl_sc_key key;
607 enum isl_edge_type type;
610 isl_union_map *constraints;
611
612 key = get_key(s);
613 if (isl_stream_yaml_next(s) < 0)
615 switch (key) {
616 case isl_sc_key_end:
617 case isl_sc_key_error:
620 domain_set = 1;
621 domain = read_union_set(s);
623 if (!sc)
624 return NULL;
625 break;
627 context = read_set(s);
629 if (!sc)
630 return NULL;
631 break;
637 type = (enum isl_edge_type) key;
638 constraints = read_union_map(s);
640 constraints);
641 if (!sc)
642 return NULL;
643 break;
644 }
645 }
646 if (more < 0)
648
651
652 if (!domain_set) {
653 isl_stream_error(s, NULL, "no domain specified");
655 }
656
658}
659
660/* Read an isl_schedule_constraints object from the file "input".
661 */
663 isl_ctx *ctx, FILE *input)
664{
665 struct isl_stream *s;
667
668 s = isl_stream_new_file(ctx, input);
669 if (!s)
670 return NULL;
673
674 return sc;
675}
676
677#undef TYPE_BASE
678#define TYPE_BASE schedule_constraints
680
681/* Align the parameters of the fields of "sc".
682 */
685{
686 isl_space *space;
687 enum isl_edge_type i;
688
689 if (!sc)
690 return NULL;
691
692 space = isl_union_set_get_space(sc->domain);
693 space = isl_space_align_params(space, isl_set_get_space(sc->context));
694 for (i = isl_edge_first; i <= isl_edge_last; ++i)
695 space = isl_space_align_params(space,
696 isl_union_map_get_space(sc->constraint[i]));
697
698 for (i = isl_edge_first; i <= isl_edge_last; ++i) {
699 sc->constraint[i] = isl_union_map_align_params(
700 sc->constraint[i], isl_space_copy(space));
701 if (!sc->constraint[i])
702 space = isl_space_free(space);
703 }
704 sc->context = isl_set_align_params(sc->context, isl_space_copy(space));
705 sc->domain = isl_union_set_align_params(sc->domain, space);
706 if (!sc->context || !sc->domain)
708
709 return sc;
710}
711
712/* Add the number of basic maps in "map" to *n.
713 */
715{
716 int *n = user;
717 isl_size n_basic_map;
718
719 n_basic_map = isl_map_n_basic_map(map);
720 *n += n_basic_map;
722
723 return n_basic_map < 0 ? isl_stat_error : isl_stat_ok;
724}
725
726/* Return the total number of isl_basic_maps in the constraints of "sc".
727 * Return -1 on error.
728 */
731{
732 enum isl_edge_type i;
733 int n = 0;
734
735 if (!sc)
736 return -1;
737 for (i = isl_edge_first; i <= isl_edge_last; ++i)
738 if (isl_union_map_foreach_map(sc->constraint[i],
739 &add_n_basic_map, &n) < 0)
740 return -1;
741
742 return n;
743}
744
745/* Return the total number of isl_maps in the constraints of "sc".
746 */
748{
749 enum isl_edge_type i;
750 int n = 0;
751
752 for (i = isl_edge_first; i <= isl_edge_last; ++i) {
753 isl_size n_i;
754
755 n_i = isl_union_map_n_map(sc->constraint[i]);
756 if (n_i < 0)
757 return isl_size_error;
758 n += n_i;
759 }
760
761 return n;
762}
static __isl_give isl_map * tag(__isl_take isl_map *Relation, __isl_take isl_id *TagId)
Tag the Relation domain with TagId.
#define __isl_take
Definition: ctx.h:22
#define isl_calloc_type(ctx, type)
Definition: ctx.h:129
isl_stat
Definition: ctx.h:84
@ isl_stat_error
Definition: ctx.h:85
@ isl_stat_ok
Definition: ctx.h:86
#define __isl_give
Definition: ctx.h:19
#define isl_size_error
Definition: ctx.h:97
#define __isl_null
Definition: ctx.h:28
#define __isl_keep
Definition: ctx.h:25
int isl_size
Definition: ctx.h:96
isl_bool
Definition: ctx.h:89
@ isl_bool_true
Definition: ctx.h:92
isl_bool __isl_keep ISL_KEY * key
Definition: hmap.h:27
isl_stat isl_stat(*) void user)
Definition: hmap.h:39
static __isl_give isl_union_map * apply(__isl_take isl_union_map *c, __isl_keep isl_union_map *umap, int tag)
__isl_give isl_schedule_constraints * isl_schedule_constraints_align_params(__isl_take isl_schedule_constraints *sc)
static int may_be_tagged(enum isl_edge_type type)
__isl_null isl_schedule_constraints * isl_schedule_constraints_free(__isl_take isl_schedule_constraints *sc)
int isl_schedule_constraints_n_basic_map(__isl_keep isl_schedule_constraints *sc)
__isl_give isl_union_map * isl_schedule_constraints_get_conditional_validity(__isl_keep isl_schedule_constraints *sc)
__isl_give isl_schedule_constraints * isl_schedule_constraints_apply(__isl_take isl_schedule_constraints *sc, __isl_take isl_union_map *umap)
static __isl_give isl_schedule_constraints * isl_schedule_constraints_alloc(isl_ctx *ctx)
__isl_give isl_printer * isl_printer_print_schedule_constraints(__isl_take isl_printer *p, __isl_keep isl_schedule_constraints *sc)
static __isl_give isl_schedule_constraints * isl_schedule_constraints_set_domain(__isl_take isl_schedule_constraints *sc, __isl_take isl_union_set *domain)
static char * key_str[]
__isl_give isl_schedule_constraints * isl_schedule_constraints_set_proximity(__isl_take isl_schedule_constraints *sc, __isl_take isl_union_map *proximity)
@ isl_sc_key_context
@ isl_sc_key_coincidence
@ isl_sc_key_validity
@ isl_sc_key_condition
@ isl_sc_key_proximity
@ isl_sc_key_conditional_validity
__isl_give isl_union_map * isl_schedule_constraints_get(__isl_keep isl_schedule_constraints *sc, enum isl_edge_type type)
__isl_give isl_schedule_constraints * isl_schedule_constraints_read_from_file(isl_ctx *ctx, FILE *input)
__isl_give isl_union_map * isl_schedule_constraints_get_coincidence(__isl_keep isl_schedule_constraints *sc)
__isl_give isl_schedule_constraints * isl_schedule_constraints_set_coincidence(__isl_take isl_schedule_constraints *sc, __isl_take isl_union_map *coincidence)
__isl_give isl_schedule_constraints * isl_schedule_constraints_set_validity(__isl_take isl_schedule_constraints *sc, __isl_take isl_union_map *validity)
__isl_give isl_union_set * isl_schedule_constraints_get_domain(__isl_keep isl_schedule_constraints *sc)
static __isl_give isl_schedule_constraints * isl_schedule_constraints_set(__isl_take isl_schedule_constraints *sc, enum isl_edge_type type, __isl_take isl_union_map *c)
__isl_give isl_schedule_constraints * isl_schedule_constraints_set_context(__isl_take isl_schedule_constraints *sc, __isl_take isl_set *context)
static isl_stat add_n_basic_map(__isl_take isl_map *map, void *user)
__isl_give isl_schedule_constraints * isl_schedule_constraints_add(__isl_take isl_schedule_constraints *sc, enum isl_edge_type type, __isl_take isl_union_map *c)
__isl_give isl_schedule_constraints * isl_schedule_constraints_copy(__isl_keep isl_schedule_constraints *sc)
__isl_give isl_schedule_constraints * isl_schedule_constraints_set_conditional_validity(__isl_take isl_schedule_constraints *sc, __isl_take isl_union_map *condition, __isl_take isl_union_map *validity)
__isl_give isl_union_map * isl_schedule_constraints_get_proximity(__isl_keep isl_schedule_constraints *sc)
__isl_give isl_union_map * isl_schedule_constraints_get_validity(__isl_keep isl_schedule_constraints *sc)
__isl_give isl_union_map * isl_schedule_constraints_get_conditional_validity_condition(__isl_keep isl_schedule_constraints *sc)
isl_ctx * isl_schedule_constraints_get_ctx(__isl_keep isl_schedule_constraints *sc)
isl_size isl_schedule_constraints_n_map(__isl_keep isl_schedule_constraints *sc)
static __isl_give isl_union_map * apply_factor_domain(__isl_take isl_union_map *c, __isl_keep isl_union_map *umap)
static __isl_give isl_printer * print_constraint(__isl_take isl_printer *p, __isl_keep isl_schedule_constraints *sc, enum isl_edge_type type)
__isl_give isl_set * isl_schedule_constraints_get_context(__isl_keep isl_schedule_constraints *sc)
__isl_give isl_schedule_constraints * isl_schedule_constraints_on_domain(__isl_take isl_union_set *domain)
__isl_give isl_schedule_constraints * isl_stream_read_schedule_constraints(isl_stream *s)
static __isl_give isl_schedule_constraints * isl_schedule_constraints_init(__isl_take isl_schedule_constraints *sc)
@ isl_edge_condition
@ isl_edge_coincidence
@ isl_edge_conditional_validity
@ isl_edge_proximity
@ isl_edge_first
@ isl_edge_validity
static __isl_give isl_schedule_tree * read_set(isl_stream *s)
enum isl_fold type
Definition: isl_test.c:4017
const char * condition
Definition: isl_test.c:4846
const char * map
Definition: isl_test.c:1783
const char * p
Definition: isl_test.c:8643
const char * context
Definition: isl_test.c:1784
static __isl_give isl_map * universe(__isl_take isl_map *map)
t0 *a *b *t *a *b * t
Definition: jacobi_kernel4.c:2
__isl_export isl_size isl_map_n_basic_map(__isl_keep isl_map *map)
Definition: isl_map.c:11252
__isl_null isl_map * isl_map_free(__isl_take isl_map *map)
Definition: isl_map.c:6421
struct isl_set isl_set
Definition: map_type.h:26
__isl_give isl_printer * isl_printer_yaml_start_mapping(__isl_take isl_printer *p)
Definition: isl_printer.c:707
__isl_null isl_printer * isl_printer_free(__isl_take isl_printer *printer)
Definition: isl_printer.c:269
__isl_give isl_printer * isl_printer_yaml_end_mapping(__isl_take isl_printer *p)
Definition: isl_printer.c:740
__isl_export __isl_give isl_set * isl_set_universe(__isl_take isl_space *space)
Definition: isl_map.c:6366
__isl_export __isl_give isl_space * isl_set_get_space(__isl_keep isl_set *set)
Definition: isl_map.c:603
__isl_null isl_set * isl_set_free(__isl_take isl_set *set)
Definition: isl_map.c:3513
__isl_give isl_set * isl_set_copy(__isl_keep isl_set *set)
Definition: isl_map.c:1470
__isl_give isl_set * isl_set_align_params(__isl_take isl_set *set, __isl_take isl_space *model)
Definition: isl_map.c:12508
isl_bool isl_set_plain_is_universe(__isl_keep isl_set *set)
Definition: isl_map.c:9374
__isl_null isl_space * isl_space_free(__isl_take isl_space *space)
Definition: isl_space.c:445
__isl_give isl_space * isl_space_copy(__isl_keep isl_space *space)
Definition: isl_space.c:436
__isl_give isl_space * isl_space_align_params(__isl_take isl_space *space1, __isl_take isl_space *space2)
Definition: isl_space.c:3262
void isl_stream_error(__isl_keep isl_stream *s, struct isl_token *tok, char *msg)
Definition: isl_stream.c:142
isl_bool isl_stream_yaml_next(__isl_keep isl_stream *s)
Definition: isl_stream.c:966
isl_ctx * isl_stream_get_ctx(__isl_keep isl_stream *s)
Definition: isl_stream.c:800
isl_stat isl_stream_yaml_read_start_mapping(__isl_keep isl_stream *s)
Definition: isl_stream.c:1070
__isl_give isl_stream * isl_stream_new_file(isl_ctx *ctx, FILE *file)
Definition: isl_stream.c:219
isl_stat isl_stream_yaml_read_end_mapping(__isl_keep isl_stream *s)
Definition: isl_stream.c:1102
void isl_stream_free(__isl_take isl_stream *s)
Definition: isl_stream.c:805
isl_union_map * constraint[isl_edge_last+1]
struct isl_ctx * ctx
static Signature domain
__isl_null isl_union_map * isl_union_map_free(__isl_take isl_union_map *umap)
__isl_export __isl_give isl_space * isl_union_map_get_space(__isl_keep isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_map_reverse(__isl_take isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_map_uncurry(__isl_take isl_union_map *umap)
__isl_give isl_union_map * isl_union_map_align_params(__isl_take isl_union_map *umap, __isl_take isl_space *model)
__isl_export isl_stat isl_union_map_foreach_map(__isl_keep isl_union_map *umap, isl_stat(*fn)(__isl_take isl_map *map, void *user), void *user)
__isl_give isl_union_set * isl_union_set_align_params(__isl_take isl_union_set *uset, __isl_take isl_space *model)
__isl_export __isl_give isl_union_map * isl_union_map_apply_range(__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
__isl_give isl_union_map * isl_union_map_copy(__isl_keep isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_map_apply_domain(__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
__isl_give isl_union_map * isl_union_map_empty(__isl_take isl_space *space)
__isl_export __isl_give isl_union_map * isl_union_map_curry(__isl_take isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_map_union(__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
isl_size isl_union_map_n_map(__isl_keep isl_union_map *umap)
__isl_export __isl_give isl_union_map * isl_union_map_detect_equalities(__isl_take isl_union_map *umap)
isl_bool isl_union_map_plain_is_empty(__isl_keep isl_union_map *umap)
struct isl_union_set isl_union_set
__isl_export __isl_give isl_union_set * isl_union_set_apply(__isl_take isl_union_set *uset, __isl_take isl_union_map *umap)
__isl_export __isl_give isl_space * isl_union_set_get_space(__isl_keep isl_union_set *uset)
isl_ctx * isl_union_set_get_ctx(__isl_keep isl_union_set *uset)
__isl_give isl_union_set * isl_union_set_copy(__isl_keep isl_union_set *uset)
__isl_null isl_union_set * isl_union_set_free(__isl_take isl_union_set *uset)
n
Definition: youcefn.c:8