isl_schedule_node_get_tree_depth: return isl_size
authorSven Verdoolaege <sven.verdoolaege@gmail.com>
Tue, 7 Aug 2018 10:09:42 +0000 (7 12:09 +0200)
committerSven Verdoolaege <sven.verdoolaege@gmail.com>
Thu, 6 Sep 2018 15:01:48 +0000 (6 17:01 +0200)
This clarifies what the possible return values are.

Signed-off-by: Sven Verdoolaege <sven.verdoolaege@gmail.com>
doc/user.pod
include/isl/schedule_node.h
isl_ast_codegen.c
isl_schedule_node.c

index 0e4f884..93e9dbf 100644 (file)
@@ -8644,7 +8644,7 @@ shared ancestor can be obtained using
 C<isl_schedule_node_get_shared_ancestor>.
 
        #include <isl/schedule_node.h>
-       int isl_schedule_node_get_tree_depth(
+       isl_size isl_schedule_node_get_tree_depth(
                __isl_keep isl_schedule_node *node);
        int isl_schedule_node_get_child_position(
                __isl_keep isl_schedule_node *node);
index 6fd8a38..131aece 100644 (file)
@@ -49,7 +49,7 @@ __isl_give isl_schedule_node *isl_schedule_node_map_descendant_bottom_up(
        __isl_give isl_schedule_node *(*fn)(__isl_take isl_schedule_node *node,
                void *user), void *user);
 
-int isl_schedule_node_get_tree_depth(__isl_keep isl_schedule_node *node);
+isl_size isl_schedule_node_get_tree_depth(__isl_keep isl_schedule_node *node);
 isl_bool isl_schedule_node_has_parent(__isl_keep isl_schedule_node *node);
 isl_bool isl_schedule_node_has_children(__isl_keep isl_schedule_node *node);
 isl_bool isl_schedule_node_has_previous_sibling(
index 2ca08bb..5f8dd50 100644 (file)
@@ -5316,9 +5316,12 @@ static __isl_give isl_ast_graft_list *build_ast_from_context(
        isl_multi_aff *internal2input;
        isl_ast_build *sub_build;
        isl_ast_graft_list *list;
-       int n, depth;
+       isl_size n;
+       isl_size depth;
 
        depth = isl_schedule_node_get_tree_depth(node);
+       if (depth < 0)
+               build = isl_ast_build_free(build);
        space = isl_ast_build_get_space(build, 1);
        context = isl_schedule_node_context_get_context(node);
        context = isl_set_align_params(context, space);
index 7164248..fc96115 100644 (file)
@@ -248,7 +248,8 @@ __isl_null isl_schedule_node *isl_schedule_node_free(
 isl_bool isl_schedule_node_is_equal(__isl_keep isl_schedule_node *node1,
        __isl_keep isl_schedule_node *node2)
 {
-       int i, n1, n2;
+       int i;
+       isl_size n1, n2;
 
        if (!node1 || !node2)
                return isl_bool_error;
@@ -259,6 +260,8 @@ isl_bool isl_schedule_node_is_equal(__isl_keep isl_schedule_node *node1,
 
        n1 = isl_schedule_node_get_tree_depth(node1);
        n2 = isl_schedule_node_get_tree_depth(node2);
+       if (n1 < 0 || n2 < 0)
+               return isl_bool_error;
        if (n1 != n2)
                return isl_bool_false;
        for (i = 0; i < n1; ++i)
@@ -940,10 +943,10 @@ __isl_give isl_union_map *isl_schedule_node_get_subtree_schedule_union_map(
 
 /* Return the number of ancestors of "node" in its schedule tree.
  */
-int isl_schedule_node_get_tree_depth(__isl_keep isl_schedule_node *node)
+isl_size isl_schedule_node_get_tree_depth(__isl_keep isl_schedule_node *node)
 {
        if (!node)
-               return -1;
+               return isl_size_error;
        return isl_schedule_tree_list_n_schedule_tree(node->ancestors);
 }
 
@@ -953,7 +956,7 @@ int isl_schedule_node_get_tree_depth(__isl_keep isl_schedule_node *node)
  */
 isl_bool isl_schedule_node_has_parent(__isl_keep isl_schedule_node *node)
 {
-       int depth;
+       isl_size depth;
 
        depth = isl_schedule_node_get_tree_depth(node);
        if (depth < 0)
@@ -1079,7 +1082,7 @@ isl_size isl_schedule_node_n_children(__isl_keep isl_schedule_node *node)
 __isl_give isl_schedule_node *isl_schedule_node_ancestor(
        __isl_take isl_schedule_node *node, int generation)
 {
-       int n;
+       isl_size n;
        isl_schedule_tree *tree;
 
        if (!node)
@@ -1128,7 +1131,7 @@ __isl_give isl_schedule_node *isl_schedule_node_parent(
 __isl_give isl_schedule_node *isl_schedule_node_root(
        __isl_take isl_schedule_node *node)
 {
-       int n;
+       isl_size n;
 
        if (!node)
                return NULL;
@@ -1286,23 +1289,27 @@ static __isl_give isl_schedule_node *traverse(
                __isl_take isl_schedule_node *node, void *user),
        void *user)
 {
-       int depth;
-
-       if (!node)
-               return NULL;
+       isl_size depth;
+       isl_size node_depth;
 
        depth = isl_schedule_node_get_tree_depth(node);
+       if (depth < 0)
+               return isl_schedule_node_free(node);
+
        do {
                node = enter(node, user);
                node = leave(node, user);
-               while (node && isl_schedule_node_get_tree_depth(node) > depth &&
+               while ((node_depth = isl_schedule_node_get_tree_depth(node)) >
+                               depth &&
                                !isl_schedule_node_has_next_sibling(node)) {
                        node = isl_schedule_node_parent(node);
                        node = leave(node, user);
                }
-               if (node && isl_schedule_node_get_tree_depth(node) > depth)
+               if (node_depth < 0)
+                       return isl_schedule_node_free(node);
+               if (node_depth > depth)
                        node = isl_schedule_node_next_sibling(node);
-       } while (node && isl_schedule_node_get_tree_depth(node) > depth);
+       } while (node_depth > depth);
 
        return node;
 }
@@ -1504,12 +1511,13 @@ isl_stat isl_schedule_node_foreach_ancestor_top_down(
        isl_stat (*fn)(__isl_keep isl_schedule_node *node, void *user),
        void *user)
 {
-       int i, n;
+       int i;
+       isl_size n;
 
-       if (!node)
+       n = isl_schedule_node_get_tree_depth(node);
+       if (n < 0)
                return isl_stat_error;
 
-       n = isl_schedule_node_get_tree_depth(node);
        for (i = 0; i < n; ++i) {
                isl_schedule_node *ancestor;
                isl_stat r;
@@ -2714,15 +2722,16 @@ __isl_give isl_schedule_node *isl_schedule_node_cut(
 __isl_give isl_schedule_node *isl_schedule_node_delete(
        __isl_take isl_schedule_node *node)
 {
-       isl_size n;
+       isl_size n, depth;
        isl_schedule_tree *tree;
        enum isl_schedule_node_type type;
 
+       depth = isl_schedule_node_get_tree_depth(node);
        n = isl_schedule_node_n_children(node);
-       if (n < 0)
+       if (depth < 0 || n < 0)
                return isl_schedule_node_free(node);
 
-       if (isl_schedule_node_get_tree_depth(node) == 0)
+       if (depth == 0)
                isl_die(isl_schedule_node_get_ctx(node), isl_error_invalid,
                        "cannot delete root node",
                        return isl_schedule_node_free(node));
@@ -2832,7 +2841,8 @@ static __isl_give isl_schedule_tree *group_band(
        isl_multi_aff *ma;
        isl_multi_union_pw_aff *mupa, *partial;
        isl_bool is_covered;
-       int depth, n;
+       isl_size depth;
+       int n;
        isl_bool has_id;
 
        domain = isl_schedule_node_get_domain(pos);
@@ -2848,6 +2858,8 @@ static __isl_give isl_schedule_tree *group_band(
                return isl_schedule_tree_free(tree);
        depth = isl_schedule_node_get_schedule_depth(pos);
        n = isl_schedule_tree_band_n_member(tree);
+       if (depth < 0)
+               return isl_schedule_tree_free(tree);
        ma = isl_multi_aff_copy(data->sched);
        ma = isl_multi_aff_drop_dims(ma, isl_dim_out, 0, depth);
        ma = isl_multi_aff_drop_dims(ma, isl_dim_out, n, data->dim - depth - n);
@@ -2902,8 +2914,12 @@ static __isl_give isl_schedule_tree *group_context(
        isl_union_set *domain;
        isl_size n1, n2;
        isl_bool involves;
+       isl_size depth;
 
-       if (isl_schedule_node_get_tree_depth(pos) == 1)
+       depth = isl_schedule_node_get_tree_depth(pos);
+       if (depth < 0)
+               return isl_schedule_tree_free(tree);
+       if (depth == 1)
                return tree;
 
        domain = isl_schedule_node_get_universe_domain(pos);
@@ -3160,8 +3176,10 @@ __isl_give isl_schedule_node *isl_schedule_node_group(
        isl_union_pw_multi_aff *contraction;
        isl_union_map *expansion;
        isl_bool disjoint;
+       isl_size depth;
 
-       if (!node || !group_id)
+       depth = isl_schedule_node_get_schedule_depth(node);
+       if (depth < 0 || !group_id)
                goto error;
        if (check_insert(node) < 0)
                goto error;
@@ -3171,7 +3189,7 @@ __isl_give isl_schedule_node *isl_schedule_node_group(
        data.domain_universe = isl_union_set_copy(domain);
        data.domain_universe = isl_union_set_universe(data.domain_universe);
 
-       data.dim = isl_schedule_node_get_schedule_depth(node);
+       data.dim = depth;
        if (data.dim == 0) {
                isl_ctx *ctx;
                isl_set *set;
@@ -4744,19 +4762,18 @@ int isl_schedule_node_get_ancestor_child_position(
        __isl_keep isl_schedule_node *node,
        __isl_keep isl_schedule_node *ancestor)
 {
-       int n1, n2;
+       isl_size n1, n2;
        isl_schedule_tree *tree;
 
-       if (!node || !ancestor)
-               return -1;
+       n1 = isl_schedule_node_get_tree_depth(ancestor);
+       n2 = isl_schedule_node_get_tree_depth(node);
+       if (n1 < 0 || n2 < 0)
+               return isl_size_error;
 
        if (node->schedule != ancestor->schedule)
                isl_die(isl_schedule_node_get_ctx(node), isl_error_invalid,
                        "not a descendant", return -1);
 
-       n1 = isl_schedule_node_get_tree_depth(ancestor);
-       n2 = isl_schedule_node_get_tree_depth(node);
-
        if (n1 >= n2)
                isl_die(isl_schedule_node_get_ctx(node), isl_error_invalid,
                        "not a descendant", return -1);
@@ -4784,15 +4801,16 @@ __isl_give isl_schedule_node *isl_schedule_node_get_shared_ancestor(
        __isl_keep isl_schedule_node *node1,
        __isl_keep isl_schedule_node *node2)
 {
-       int i, n1, n2;
+       int i;
+       isl_size n1, n2;
 
-       if (!node1 || !node2)
+       n1 = isl_schedule_node_get_tree_depth(node1);
+       n2 = isl_schedule_node_get_tree_depth(node2);
+       if (n1 < 0 || n2 < 0)
                return NULL;
        if (node1->schedule != node2->schedule)
                isl_die(isl_schedule_node_get_ctx(node1), isl_error_invalid,
                        "not part of same schedule", return NULL);
-       n1 = isl_schedule_node_get_tree_depth(node1);
-       n2 = isl_schedule_node_get_tree_depth(node2);
        if (n2 < n1)
                return isl_schedule_node_get_shared_ancestor(node2, node1);
        if (n1 == 0)