1*5971e316Smrg #ifndef ISL_SCHEDLUE_TREE_H 2*5971e316Smrg #define ISL_SCHEDLUE_TREE_H 3*5971e316Smrg 4*5971e316Smrg #include <isl_schedule_band.h> 5*5971e316Smrg #include <isl/schedule.h> 6*5971e316Smrg #include <isl/set.h> 7*5971e316Smrg #include <isl/union_set.h> 8*5971e316Smrg 9*5971e316Smrg struct isl_schedule_tree; 10*5971e316Smrg typedef struct isl_schedule_tree isl_schedule_tree; 11*5971e316Smrg 12*5971e316Smrg ISL_DECLARE_LIST(schedule_tree) 13*5971e316Smrg 14*5971e316Smrg /* A schedule (sub)tree. 15*5971e316Smrg * 16*5971e316Smrg * The leaves of a tree are not explicitly represented inside 17*5971e316Smrg * the isl_schedule_tree, except when the tree consists of only a leaf. 18*5971e316Smrg * 19*5971e316Smrg * The "band" field is valid when type is isl_schedule_node_band. 20*5971e316Smrg * The "context" field is valid when type is isl_schedule_node_context 21*5971e316Smrg * and represents constraints on the flat product of the outer band nodes, 22*5971e316Smrg * possibly introducing additional parameters. 23*5971e316Smrg * The "domain" field is valid when type is isl_schedule_node_domain 24*5971e316Smrg * and introduces the statement instances scheduled by the tree. 25*5971e316Smrg * 26*5971e316Smrg * The "contraction" and "expansion" fields are valid when type 27*5971e316Smrg * is isl_schedule_node_expansion. 28*5971e316Smrg * "expansion" expands the reaching domain elements to one or more 29*5971e316Smrg * domain elements for the subtree. 30*5971e316Smrg * "contraction" maps these elements back to the corresponding 31*5971e316Smrg * reaching domain element. It does not involve any domain constraints. 32*5971e316Smrg * 33*5971e316Smrg * The "extension" field is valid when the is isl_schedule_node_extension 34*5971e316Smrg * maps outer schedule dimensions (the flat product of the outer band nodes) 35*5971e316Smrg * to additional iteration domains. 36*5971e316Smrg * 37*5971e316Smrg * The "filter" field is valid when type is isl_schedule_node_filter 38*5971e316Smrg * and represents the statement instances selected by the node. 39*5971e316Smrg * 40*5971e316Smrg * The "guard" field is valid when type is isl_schedule_node_guard 41*5971e316Smrg * and represents constraints on the flat product of the outer band nodes 42*5971e316Smrg * that need to be enforced by the outer nodes in the generated AST. 43*5971e316Smrg * 44*5971e316Smrg * The "mark" field is valid when type is isl_schedule_node_mark and 45*5971e316Smrg * identifies the mark. 46*5971e316Smrg * 47*5971e316Smrg * The "children" field is valid for all types except 48*5971e316Smrg * isl_schedule_node_leaf. This field is NULL if there are 49*5971e316Smrg * no children (except for the implicit leaves). 50*5971e316Smrg * 51*5971e316Smrg * anchored is set if the node or any of its descendants depends 52*5971e316Smrg * on its position in the schedule tree. 53*5971e316Smrg */ 54*5971e316Smrg struct isl_schedule_tree { 55*5971e316Smrg int ref; 56*5971e316Smrg isl_ctx *ctx; 57*5971e316Smrg int anchored; 58*5971e316Smrg enum isl_schedule_node_type type; 59*5971e316Smrg union { 60*5971e316Smrg isl_schedule_band *band; 61*5971e316Smrg isl_set *context; 62*5971e316Smrg isl_union_set *domain; 63*5971e316Smrg struct { 64*5971e316Smrg isl_union_pw_multi_aff *contraction; 65*5971e316Smrg isl_union_map *expansion; 66*5971e316Smrg }; 67*5971e316Smrg isl_union_map *extension; 68*5971e316Smrg isl_union_set *filter; 69*5971e316Smrg isl_set *guard; 70*5971e316Smrg isl_id *mark; 71*5971e316Smrg }; 72*5971e316Smrg isl_schedule_tree_list *children; 73*5971e316Smrg }; 74*5971e316Smrg 75*5971e316Smrg isl_ctx *isl_schedule_tree_get_ctx(__isl_keep isl_schedule_tree *tree); 76*5971e316Smrg enum isl_schedule_node_type isl_schedule_tree_get_type( 77*5971e316Smrg __isl_keep isl_schedule_tree *tree); 78*5971e316Smrg 79*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_leaf(isl_ctx *ctx); 80*5971e316Smrg int isl_schedule_tree_is_leaf(__isl_keep isl_schedule_tree *tree); 81*5971e316Smrg 82*5971e316Smrg isl_bool isl_schedule_tree_plain_is_equal(__isl_keep isl_schedule_tree *tree1, 83*5971e316Smrg __isl_keep isl_schedule_tree *tree2); 84*5971e316Smrg 85*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_copy( 86*5971e316Smrg __isl_keep isl_schedule_tree *tree); 87*5971e316Smrg __isl_null isl_schedule_tree *isl_schedule_tree_free( 88*5971e316Smrg __isl_take isl_schedule_tree *tree); 89*5971e316Smrg 90*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_band( 91*5971e316Smrg __isl_take isl_schedule_band *band); 92*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_context( 93*5971e316Smrg __isl_take isl_set *context); 94*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_domain( 95*5971e316Smrg __isl_take isl_union_set *domain); 96*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_expansion( 97*5971e316Smrg __isl_take isl_union_pw_multi_aff *contraction, 98*5971e316Smrg __isl_take isl_union_map *expansion); 99*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_extension( 100*5971e316Smrg __isl_take isl_union_map *extension); 101*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_filter( 102*5971e316Smrg __isl_take isl_union_set *filter); 103*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_guard( 104*5971e316Smrg __isl_take isl_set *guard); 105*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_children( 106*5971e316Smrg enum isl_schedule_node_type type, 107*5971e316Smrg __isl_take isl_schedule_tree_list *list); 108*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_from_pair( 109*5971e316Smrg enum isl_schedule_node_type type, __isl_take isl_schedule_tree *tree1, 110*5971e316Smrg __isl_take isl_schedule_tree *tree2); 111*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_sequence_pair( 112*5971e316Smrg __isl_take isl_schedule_tree *tree1, 113*5971e316Smrg __isl_take isl_schedule_tree *tree2); 114*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_set_pair( 115*5971e316Smrg __isl_take isl_schedule_tree *tree1, 116*5971e316Smrg __isl_take isl_schedule_tree *tree2); 117*5971e316Smrg 118*5971e316Smrg isl_bool isl_schedule_tree_is_subtree_anchored( 119*5971e316Smrg __isl_keep isl_schedule_tree *tree); 120*5971e316Smrg 121*5971e316Smrg __isl_give isl_space *isl_schedule_tree_band_get_space( 122*5971e316Smrg __isl_keep isl_schedule_tree *tree); 123*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_intersect_domain( 124*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_union_set *domain); 125*5971e316Smrg __isl_give isl_multi_union_pw_aff *isl_schedule_tree_band_get_partial_schedule( 126*5971e316Smrg __isl_keep isl_schedule_tree *tree); 127*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_set_partial_schedule( 128*5971e316Smrg __isl_take isl_schedule_tree *tree, 129*5971e316Smrg __isl_take isl_multi_union_pw_aff *schedule); 130*5971e316Smrg enum isl_ast_loop_type isl_schedule_tree_band_member_get_ast_loop_type( 131*5971e316Smrg __isl_keep isl_schedule_tree *tree, int pos); 132*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_member_set_ast_loop_type( 133*5971e316Smrg __isl_take isl_schedule_tree *tree, int pos, 134*5971e316Smrg enum isl_ast_loop_type type); 135*5971e316Smrg enum isl_ast_loop_type isl_schedule_tree_band_member_get_isolate_ast_loop_type( 136*5971e316Smrg __isl_keep isl_schedule_tree *tree, int pos); 137*5971e316Smrg __isl_give isl_schedule_tree * 138*5971e316Smrg isl_schedule_tree_band_member_set_isolate_ast_loop_type( 139*5971e316Smrg __isl_take isl_schedule_tree *tree, int pos, 140*5971e316Smrg enum isl_ast_loop_type type); 141*5971e316Smrg __isl_give isl_union_set *isl_schedule_tree_band_get_ast_build_options( 142*5971e316Smrg __isl_keep isl_schedule_tree *tree); 143*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_set_ast_build_options( 144*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_union_set *options); 145*5971e316Smrg __isl_give isl_set *isl_schedule_tree_band_get_ast_isolate_option( 146*5971e316Smrg __isl_keep isl_schedule_tree *tree, int depth); 147*5971e316Smrg __isl_give isl_set *isl_schedule_tree_context_get_context( 148*5971e316Smrg __isl_keep isl_schedule_tree *tree); 149*5971e316Smrg __isl_give isl_union_set *isl_schedule_tree_domain_get_domain( 150*5971e316Smrg __isl_keep isl_schedule_tree *tree); 151*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_domain_set_domain( 152*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_union_set *domain); 153*5971e316Smrg __isl_give isl_union_pw_multi_aff *isl_schedule_tree_expansion_get_contraction( 154*5971e316Smrg __isl_keep isl_schedule_tree *tree); 155*5971e316Smrg __isl_give isl_union_map *isl_schedule_tree_expansion_get_expansion( 156*5971e316Smrg __isl_keep isl_schedule_tree *tree); 157*5971e316Smrg __isl_give isl_schedule_tree * 158*5971e316Smrg isl_schedule_tree_expansion_set_contraction_and_expansion( 159*5971e316Smrg __isl_take isl_schedule_tree *tree, 160*5971e316Smrg __isl_take isl_union_pw_multi_aff *contraction, 161*5971e316Smrg __isl_take isl_union_map *expansion); 162*5971e316Smrg __isl_give isl_union_map *isl_schedule_tree_extension_get_extension( 163*5971e316Smrg __isl_keep isl_schedule_tree *tree); 164*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_extension_set_extension( 165*5971e316Smrg __isl_take isl_schedule_tree *tree, 166*5971e316Smrg __isl_take isl_union_map *extension); 167*5971e316Smrg __isl_give isl_union_set *isl_schedule_tree_filter_get_filter( 168*5971e316Smrg __isl_keep isl_schedule_tree *tree); 169*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_filter_set_filter( 170*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_union_set *filter); 171*5971e316Smrg __isl_give isl_set *isl_schedule_tree_guard_get_guard( 172*5971e316Smrg __isl_keep isl_schedule_tree *tree); 173*5971e316Smrg __isl_give isl_id *isl_schedule_tree_mark_get_id( 174*5971e316Smrg __isl_keep isl_schedule_tree *tree); 175*5971e316Smrg 176*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_first_schedule_descendant( 177*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_keep isl_schedule_tree *leaf); 178*5971e316Smrg __isl_give isl_union_map *isl_schedule_tree_get_subtree_schedule_union_map( 179*5971e316Smrg __isl_keep isl_schedule_tree *tree); 180*5971e316Smrg 181*5971e316Smrg isl_size isl_schedule_tree_band_n_member(__isl_keep isl_schedule_tree *tree); 182*5971e316Smrg 183*5971e316Smrg isl_bool isl_schedule_tree_band_member_get_coincident( 184*5971e316Smrg __isl_keep isl_schedule_tree *tree, int pos); 185*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_member_set_coincident( 186*5971e316Smrg __isl_take isl_schedule_tree *tree, int pos, int coincident); 187*5971e316Smrg isl_bool isl_schedule_tree_band_get_permutable( 188*5971e316Smrg __isl_keep isl_schedule_tree *tree); 189*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_set_permutable( 190*5971e316Smrg __isl_take isl_schedule_tree *tree, int permutable); 191*5971e316Smrg 192*5971e316Smrg int isl_schedule_tree_has_children(__isl_keep isl_schedule_tree *tree); 193*5971e316Smrg isl_size isl_schedule_tree_n_children(__isl_keep isl_schedule_tree *tree); 194*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_get_child( 195*5971e316Smrg __isl_keep isl_schedule_tree *tree, int pos); 196*5971e316Smrg 197*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_band( 198*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_schedule_band *band); 199*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_context( 200*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_set *context); 201*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_domain( 202*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_union_set *domain); 203*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_expansion( 204*5971e316Smrg __isl_take isl_schedule_tree *tree, 205*5971e316Smrg __isl_take isl_union_pw_multi_aff *contraction, 206*5971e316Smrg __isl_take isl_union_map *expansion); 207*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_extension( 208*5971e316Smrg __isl_take isl_schedule_tree *tree, 209*5971e316Smrg __isl_take isl_union_map *extension); 210*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_filter( 211*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_union_set *filter); 212*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_children_insert_filter( 213*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_union_set *filter); 214*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_guard( 215*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_set *guard); 216*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_insert_mark( 217*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_id *mark); 218*5971e316Smrg 219*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_append_to_leaves( 220*5971e316Smrg __isl_take isl_schedule_tree *tree1, 221*5971e316Smrg __isl_take isl_schedule_tree *tree2); 222*5971e316Smrg 223*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_scale( 224*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *mv); 225*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_scale_down( 226*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *mv); 227*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_mod( 228*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *mv); 229*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_tile( 230*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_multi_val *sizes); 231*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_shift( 232*5971e316Smrg __isl_take isl_schedule_tree *tree, 233*5971e316Smrg __isl_take isl_multi_union_pw_aff *shift); 234*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_split( 235*5971e316Smrg __isl_take isl_schedule_tree *tree, int pos, int depth); 236*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_band_gist( 237*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_union_set *context); 238*5971e316Smrg 239*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_child( 240*5971e316Smrg __isl_take isl_schedule_tree *tree, int pos); 241*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_reset_children( 242*5971e316Smrg __isl_take isl_schedule_tree *tree); 243*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_drop_child( 244*5971e316Smrg __isl_take isl_schedule_tree *tree, int pos); 245*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_replace_child( 246*5971e316Smrg __isl_take isl_schedule_tree *tree, int pos, 247*5971e316Smrg __isl_take isl_schedule_tree *new_child); 248*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_sequence_splice( 249*5971e316Smrg __isl_take isl_schedule_tree *tree, int pos, 250*5971e316Smrg __isl_take isl_schedule_tree *child); 251*5971e316Smrg 252*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_reset_user( 253*5971e316Smrg __isl_take isl_schedule_tree *tree); 254*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_align_params( 255*5971e316Smrg __isl_take isl_schedule_tree *tree, __isl_take isl_space *space); 256*5971e316Smrg __isl_give isl_schedule_tree *isl_schedule_tree_pullback_union_pw_multi_aff( 257*5971e316Smrg __isl_take isl_schedule_tree *tree, 258*5971e316Smrg __isl_take isl_union_pw_multi_aff *upma); 259*5971e316Smrg 260*5971e316Smrg __isl_give isl_printer *isl_printer_print_schedule_tree( 261*5971e316Smrg __isl_take isl_printer *p, __isl_keep isl_schedule_tree *tree); 262*5971e316Smrg __isl_give isl_printer *isl_printer_print_schedule_tree_mark( 263*5971e316Smrg __isl_take isl_printer *p, __isl_keep isl_schedule_tree *tree, 264*5971e316Smrg int n_ancestor, int *child_pos); 265*5971e316Smrg 266*5971e316Smrg #endif 267