From 80397ec19aad7ec1529afa600a585801e0a5fc86 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sun, 19 Jan 2014 13:16:10 +0100 Subject: [PATCH] add isl_schedule_node_align_params Signed-off-by: Sven Verdoolaege --- doc/user.pod | 9 +++++++++ include/isl/schedule_node.h | 2 ++ isl_schedule_band.c | 20 ++++++++++++++++++ isl_schedule_band.h | 2 ++ isl_schedule_node.c | 14 +++++++++++++ isl_schedule_tree.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ isl_schedule_tree.h | 2 ++ 7 files changed, 98 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index 9c4208dd..379e30aa 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -7502,6 +7502,15 @@ and tuple identifiers referenced by the given schedule node. __isl_give isl_schedule_node *isl_schedule_node_reset_user( __isl_take isl_schedule_node *node); +The following function aligns the parameters of the given schedule +node to the given space. + + #include + __isl_give isl_schedule_node * + isl_schedule_node_align_params( + __isl_take isl_schedule_node *node, + __isl_take isl_space *space); + Several node types have their own functions for querying (and in some cases setting) some node type specific properties. diff --git a/include/isl/schedule_node.h b/include/isl/schedule_node.h index 77a7f8c1..49e8464b 100644 --- a/include/isl/schedule_node.h +++ b/include/isl/schedule_node.h @@ -114,6 +114,8 @@ __isl_give isl_schedule_node *isl_schedule_node_insert_set( __isl_give isl_schedule_node *isl_schedule_node_reset_user( __isl_take isl_schedule_node *node); +__isl_give isl_schedule_node *isl_schedule_node_align_params( + __isl_take isl_schedule_node *node, __isl_take isl_space *space); __isl_give isl_printer *isl_printer_print_schedule_node( __isl_take isl_printer *p, __isl_keep isl_schedule_node *node); diff --git a/isl_schedule_band.c b/isl_schedule_band.c index e274b372..6e990e84 100644 --- a/isl_schedule_band.c +++ b/isl_schedule_band.c @@ -455,3 +455,23 @@ __isl_give isl_schedule_band *isl_schedule_band_reset_user( return band; } + +/* Align the parameters of "band" to those of "space". + */ +__isl_give isl_schedule_band *isl_schedule_band_align_params( + __isl_take isl_schedule_band *band, __isl_take isl_space *space) +{ + band = isl_schedule_band_cow(band); + if (!band || !space) + goto error; + + band->mupa = isl_multi_union_pw_aff_align_params(band->mupa, space); + if (!band->mupa) + return isl_schedule_band_free(band); + + return band; +error: + isl_space_free(space); + isl_schedule_band_free(band); + return NULL; +} diff --git a/isl_schedule_band.h b/isl_schedule_band.h index 4c36b611..e6e8fb97 100644 --- a/isl_schedule_band.h +++ b/isl_schedule_band.h @@ -65,5 +65,7 @@ __isl_give isl_schedule_band *isl_schedule_band_drop( __isl_give isl_schedule_band *isl_schedule_band_reset_user( __isl_take isl_schedule_band *band); +__isl_give isl_schedule_band *isl_schedule_band_align_params( + __isl_take isl_schedule_band *band, __isl_take isl_space *space); #endif diff --git a/isl_schedule_node.c b/isl_schedule_node.c index 3aca4d06..41496d58 100644 --- a/isl_schedule_node.c +++ b/isl_schedule_node.c @@ -1521,6 +1521,20 @@ __isl_give isl_schedule_node *isl_schedule_node_reset_user( return node; } +/* Align the parameters of the schedule node "node" to those of "space". + */ +__isl_give isl_schedule_node *isl_schedule_node_align_params( + __isl_take isl_schedule_node *node, __isl_take isl_space *space) +{ + isl_schedule_tree *tree; + + tree = isl_schedule_node_get_tree(node); + tree = isl_schedule_tree_align_params(tree, space); + node = isl_schedule_node_graft_tree(node, tree); + + return node; +} + /* Print "node" to "p". */ __isl_give isl_printer *isl_printer_print_schedule_node( diff --git a/isl_schedule_tree.c b/isl_schedule_tree.c index de991f3f..76c00078 100644 --- a/isl_schedule_tree.c +++ b/isl_schedule_tree.c @@ -1401,6 +1401,55 @@ __isl_give isl_schedule_tree *isl_schedule_tree_reset_user( return tree; } +/* Align the parameters of the root of "tree" to those of "space". + */ +__isl_give isl_schedule_tree *isl_schedule_tree_align_params( + __isl_take isl_schedule_tree *tree, __isl_take isl_space *space) +{ + if (!space) + goto error; + + if (isl_schedule_tree_is_leaf(tree)) { + isl_space_free(space); + return tree; + } + + tree = isl_schedule_tree_cow(tree); + if (!tree) + goto error; + + switch (tree->type) { + case isl_schedule_node_error: + goto error; + case isl_schedule_node_band: + tree->band = isl_schedule_band_align_params(tree->band, space); + if (!tree->band) + return isl_schedule_tree_free(tree); + break; + case isl_schedule_node_domain: + tree->domain = isl_union_set_align_params(tree->domain, space); + if (!tree->domain) + return isl_schedule_tree_free(tree); + break; + case isl_schedule_node_filter: + tree->filter = isl_union_set_align_params(tree->filter, space); + if (!tree->filter) + return isl_schedule_tree_free(tree); + break; + case isl_schedule_node_leaf: + case isl_schedule_node_sequence: + case isl_schedule_node_set: + isl_space_free(space); + break; + } + + return tree; +error: + isl_space_free(space); + isl_schedule_tree_free(tree); + return NULL; +} + /* Are any members in "band" marked coincident? */ static int any_coincident(__isl_keep isl_schedule_band *band) diff --git a/isl_schedule_tree.h b/isl_schedule_tree.h index 5737ff4f..62498271 100644 --- a/isl_schedule_tree.h +++ b/isl_schedule_tree.h @@ -135,6 +135,8 @@ __isl_give isl_schedule_tree *isl_schedule_tree_replace_child( __isl_give isl_schedule_tree *isl_schedule_tree_reset_user( __isl_take isl_schedule_tree *tree); +__isl_give isl_schedule_tree *isl_schedule_tree_align_params( + __isl_take isl_schedule_tree *tree, __isl_take isl_space *space); __isl_give isl_printer *isl_printer_print_schedule_tree( __isl_take isl_printer *p, __isl_keep isl_schedule_tree *tree); -- 2.11.4.GIT