isl_basic_map_simplify: avoid infinite loop on empty input
[platform/upstream/isl.git] / isl_tab_pip.c
index bf5810e..8d16d5c 100644 (file)
@@ -309,6 +309,8 @@ static void sol_pop(struct isl_sol *sol)
                        struct isl_basic_set *bset;
 
                        bset = sol_domain(sol);
+                       if (!bset)
+                               goto error;
 
                        isl_basic_set_free(partial->next->dom);
                        partial->next->dom = bset;
@@ -321,6 +323,9 @@ static void sol_pop(struct isl_sol *sol)
                }
        } else
                sol_pop_one(sol);
+
+       if (0)
+error:         sol->error = 1;
 }
 
 static void sol_dec_level(struct isl_sol *sol)
@@ -4779,11 +4784,13 @@ int isl_basic_map_foreach_lexopt(__isl_keep isl_basic_map *bmap, int max,
        struct isl_sol_for *sol_for = NULL;
 
        bmap = isl_basic_map_copy(bmap);
+       bmap = isl_basic_map_detect_equalities(bmap);
        if (!bmap)
                return -1;
 
-       bmap = isl_basic_map_detect_equalities(bmap);
        sol_for = sol_for_init(bmap, max, fn, user);
+       if (!sol_for)
+               goto error;
 
        if (isl_basic_map_plain_is_empty(bmap))
                /* nothing */;
@@ -4982,13 +4989,19 @@ __isl_give isl_vec *isl_tab_basic_set_non_trivial_lexmin(
 {
        int i, j;
        int r;
-       isl_ctx *ctx = isl_basic_set_get_ctx(bset);
+       isl_ctx *ctx;
        isl_vec *v = NULL;
-       isl_vec *sol = isl_vec_alloc(ctx, 0);
+       isl_vec *sol = NULL;
        struct isl_tab *tab;
        struct isl_trivial *triv = NULL;
        int level, init;
 
+       if (!bset)
+               return NULL;
+
+       ctx = isl_basic_set_get_ctx(bset);
+       sol = isl_vec_alloc(ctx, 0);
+
        tab = tab_for_lexmin(bset, NULL, 0, 0);
        if (!tab)
                goto error;
@@ -5104,6 +5117,9 @@ __isl_give isl_vec *isl_tab_basic_set_non_neg_lexmin(
        isl_ctx *ctx = isl_basic_set_get_ctx(bset);
        isl_vec *sol;
 
+       if (!bset)
+               return NULL;
+
        tab = tab_for_lexmin(bset, NULL, 0, 0);
        if (!tab)
                goto error;