Home | History | Annotate | Line # | Download | only in dist
      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