xref: /netbsd-src/external/mit/isl/dist/isl_ast_graft_private.h (revision 5971e316fdea024efff6be8f03536623db06833e)
1 #ifndef ISL_AST_GRAFT_PRIVATE_H
2 #define ISL_AST_GRAFT_PRIVATE_H
3 
4 #include <isl/ast.h>
5 #include <isl/ast_build.h>
6 #include <isl/set.h>
7 #include <isl/list.h>
8 #include <isl/printer.h>
9 #include <isl/stream.h>
10 
11 struct isl_ast_graft;
12 typedef struct isl_ast_graft isl_ast_graft;
13 
14 /* Representation of part of an AST ("node") with some additional polyhedral
15  * information about the tree.
16  *
17  * "guard" contains conditions that should still be enforced by
18  * some ancestor of the current tree.  In particular, the already
19  * generated tree assumes that these conditions hold, but may not
20  * have enforced them itself.
21  * The guard should not contain any unknown divs as it will be used
22  * to generate an if condition.
23  *
24  * "enforced" expresses constraints that are already enforced by the for
25  * nodes in the current tree and that therefore do not need to be enforced
26  * by any ancestor.
27  * The constraints only involve outer loop iterators.
28  */
29 struct isl_ast_graft {
30 	int ref;
31 
32 	isl_ast_node *node;
33 
34 	isl_set *guard;
35 	isl_basic_set *enforced;
36 };
37 
38 ISL_DECLARE_LIST(ast_graft)
39 
40 #undef EL
41 #define EL isl_ast_graft
42 
43 #include <isl_list_templ.h>
44 
45 isl_ctx *isl_ast_graft_get_ctx(__isl_keep isl_ast_graft *graft);
46 
47 __isl_give isl_ast_graft *isl_ast_graft_alloc(
48 	__isl_take isl_ast_node *node, __isl_keep isl_ast_build *build);
49 __isl_give isl_ast_graft *isl_ast_graft_alloc_from_children(
50 	__isl_take isl_ast_graft_list *list, __isl_take isl_set *guard,
51 	__isl_take isl_basic_set *enforced, __isl_keep isl_ast_build *build,
52 	__isl_keep isl_ast_build *sub_build);
53 __isl_give isl_ast_graft_list *isl_ast_graft_list_fuse(
54 	__isl_take isl_ast_graft_list *children,
55 	__isl_keep isl_ast_build *build);
56 __isl_give isl_ast_graft *isl_ast_graft_alloc_domain(
57 	__isl_take isl_map *schedule, __isl_keep isl_ast_build *build);
58 __isl_null isl_ast_graft *isl_ast_graft_free(__isl_take isl_ast_graft *graft);
59 __isl_give isl_ast_graft_list *isl_ast_graft_list_sort_guard(
60 	__isl_take isl_ast_graft_list *list);
61 
62 __isl_give isl_ast_graft_list *isl_ast_graft_list_merge(
63 	__isl_take isl_ast_graft_list *list1,
64 	__isl_take isl_ast_graft_list *list2,
65 	__isl_keep isl_ast_build *build);
66 __isl_give isl_ast_graft_list *isl_ast_graft_list_group_on_guard(
67 	__isl_take isl_ast_graft_list *list, __isl_keep isl_ast_build *build);
68 
69 __isl_give isl_ast_node *isl_ast_graft_get_node(
70 	__isl_keep isl_ast_graft *graft);
71 __isl_give isl_basic_set *isl_ast_graft_get_enforced(
72 	__isl_keep isl_ast_graft *graft);
73 __isl_give isl_set *isl_ast_graft_get_guard(__isl_keep isl_ast_graft *graft);
74 
75 __isl_give isl_ast_graft *isl_ast_graft_insert_for(
76 	__isl_take isl_ast_graft *graft, __isl_take isl_ast_node *node);
77 __isl_give isl_ast_graft *isl_ast_graft_add_guard(
78 	__isl_take isl_ast_graft *graft,
79 	__isl_take isl_set *guard, __isl_keep isl_ast_build *build);
80 __isl_give isl_ast_graft *isl_ast_graft_enforce(
81 	__isl_take isl_ast_graft *graft, __isl_take isl_basic_set *enforced);
82 
83 __isl_give isl_ast_graft *isl_ast_graft_insert_mark(
84 	__isl_take isl_ast_graft *graft, __isl_take isl_id *mark);
85 
86 __isl_give isl_ast_graft_list *isl_ast_graft_list_unembed(
87 	__isl_take isl_ast_graft_list *list, int product);
88 __isl_give isl_ast_graft_list *isl_ast_graft_list_preimage_multi_aff(
89 	__isl_take isl_ast_graft_list *list, __isl_take isl_multi_aff *ma);
90 __isl_give isl_ast_graft_list *isl_ast_graft_list_insert_pending_guard_nodes(
91 	__isl_take isl_ast_graft_list *list, __isl_keep isl_ast_build *build);
92 
93 __isl_give isl_ast_node *isl_ast_node_from_graft_list(
94 	__isl_take isl_ast_graft_list *list, __isl_keep isl_ast_build *build);
95 
96 __isl_give isl_basic_set *isl_ast_graft_list_extract_shared_enforced(
97 	__isl_keep isl_ast_graft_list *list, __isl_keep isl_ast_build *build);
98 __isl_give isl_set *isl_ast_graft_list_extract_hoistable_guard(
99 	__isl_keep isl_ast_graft_list *list, __isl_keep isl_ast_build *build);
100 __isl_give isl_ast_graft_list *isl_ast_graft_list_gist_guards(
101 	__isl_take isl_ast_graft_list *list, __isl_take isl_set *context);
102 
103 __isl_give isl_printer *isl_printer_print_ast_graft(__isl_take isl_printer *p,
104 	__isl_keep isl_ast_graft *graft);
105 
106 __isl_give isl_ast_graft_list *isl_stream_read_ast_graft_list(isl_stream *s);
107 
108 #endif
109