isl_basic_set_opt: avoid invalid access on error path
[platform/upstream/isl.git] / isl_ast_graft_private.h
1 #ifndef ISL_AST_GRAFT_PRIVATE_H
2 #define ISL_AST_GRAFT_PRIVATE_H
3
4 #include <isl/ast.h>
5 #include <isl/set.h>
6 #include <isl/list.h>
7 #include <isl/printer.h>
8
9 struct isl_ast_graft;
10 typedef struct isl_ast_graft isl_ast_graft;
11
12 /* Representation of part of an AST ("node") with some additional polyhedral
13  * information about the tree.
14  *
15  * "guard" contains conditions that should still be enforced by
16  * some ancestor of the current tree.  In particular, the already
17  * generated tree assumes that these conditions hold, but may not
18  * enforced them itself.
19  * The guard should not contain any unknown divs as it will be used
20  * to generate an if condition.
21  *
22  * "enforced" expresses constraints that are already enforced by the for
23  * nodes in the current tree and that therefore do not need to be enforced
24  * by any ancestor.
25  * The constraints only involve outer loop iterators.
26  */
27 struct isl_ast_graft {
28         int ref;
29
30         isl_ast_node *node;
31
32         isl_set *guard;
33         isl_basic_set *enforced;
34 };
35
36 ISL_DECLARE_LIST(ast_graft)
37
38 #undef EL
39 #define EL isl_ast_graft
40
41 #include <isl_list_templ.h>
42
43 isl_ctx *isl_ast_graft_get_ctx(__isl_keep isl_ast_graft *graft);
44
45 __isl_give isl_ast_graft *isl_ast_graft_alloc(
46         __isl_take isl_ast_node *node, __isl_keep isl_ast_build *build);
47 __isl_give isl_ast_graft *isl_ast_graft_alloc_level(
48         __isl_take isl_ast_graft_list *children,
49         __isl_keep isl_ast_build *build, __isl_keep isl_ast_build *sub_build);
50 __isl_give isl_ast_graft_list *isl_ast_graft_list_fuse(
51         __isl_take isl_ast_graft_list *children,
52         __isl_keep isl_ast_build *build);
53 __isl_give isl_ast_graft *isl_ast_graft_alloc_domain(
54         __isl_take isl_map *schedule, __isl_keep isl_ast_build *build);
55 void *isl_ast_graft_free(__isl_take isl_ast_graft *graft);
56 __isl_give isl_ast_graft_list *isl_ast_graft_list_sort(
57         __isl_take isl_ast_graft_list *list);
58
59 __isl_give isl_ast_graft_list *isl_ast_graft_list_merge(
60         __isl_take isl_ast_graft_list *list1,
61         __isl_take isl_ast_graft_list *list2,
62         __isl_keep isl_ast_build *build);
63
64 __isl_give isl_ast_node *isl_ast_graft_get_node(
65         __isl_keep isl_ast_graft *graft);
66 __isl_give isl_basic_set *isl_ast_graft_get_enforced(
67         __isl_keep isl_ast_graft *graft);
68 __isl_give isl_set *isl_ast_graft_get_guard(__isl_keep isl_ast_graft *graft);
69
70 __isl_give isl_ast_graft *isl_ast_graft_insert_for(
71         __isl_take isl_ast_graft *graft, __isl_take isl_ast_node *node);
72 __isl_give isl_ast_graft *isl_ast_graft_add_guard(
73         __isl_take isl_ast_graft *graft,
74         __isl_take isl_set *guard, __isl_keep isl_ast_build *build);
75 __isl_give isl_ast_graft *isl_ast_graft_enforce(
76         __isl_take isl_ast_graft *graft, __isl_take isl_basic_set *enforced);
77
78 __isl_give isl_ast_graft_list *isl_ast_graft_list_unembed(
79         __isl_take isl_ast_graft_list *list, int product);
80 __isl_give isl_ast_graft_list *isl_ast_graft_list_preimage_multi_aff(
81         __isl_take isl_ast_graft_list *list, __isl_take isl_multi_aff *ma);
82
83 __isl_give isl_ast_node *isl_ast_node_from_graft_list(
84         __isl_take isl_ast_graft_list *list, __isl_keep isl_ast_build *build);
85
86 __isl_give isl_printer *isl_printer_print_ast_graft(__isl_take isl_printer *p,
87         __isl_keep isl_ast_graft *graft);
88
89 #endif