isl_basic_map_insert: preserve emptiness
[platform/upstream/isl.git] / isl_map.c
index 86b50d2..8c205b0 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -122,6 +122,8 @@ unsigned isl_basic_set_n_param(__isl_keep isl_basic_set *bset)
 
 unsigned isl_basic_set_total_dim(const struct isl_basic_set *bset)
 {
+       if (!bset)
+               return 0;
        return isl_space_dim(bset->dim, isl_dim_all) + bset->n_div;
 }
 
@@ -614,6 +616,12 @@ int isl_map_find_dim_by_name(__isl_keep isl_map *map, enum isl_dim_type type,
        return isl_space_find_dim_by_name(map->dim, type, name);
 }
 
+int isl_set_find_dim_by_name(__isl_keep isl_set *set, enum isl_dim_type type,
+       const char *name)
+{
+       return isl_map_find_dim_by_name(set, type, name);
+}
+
 int isl_basic_map_is_rational(__isl_keep isl_basic_map *bmap)
 {
        if (!bmap)
@@ -1753,6 +1761,12 @@ __isl_give isl_set *isl_set_remove_divs_involving_dims(__isl_take isl_set *set,
                                                              type, first, n);
 }
 
+/* Does the desciption of "bmap" depend on the specified dimensions?
+ * We also check whether the dimensions appear in any of the div definitions.
+ * In principle there is no need for this check.  If the dimensions appear
+ * in a div definition, they also appear in the defining constraints of that
+ * div.
+ */
 int isl_basic_map_involves_dims(__isl_keep isl_basic_map *bmap,
        enum isl_dim_type type, unsigned first, unsigned n)
 {
@@ -1772,6 +1786,12 @@ int isl_basic_map_involves_dims(__isl_keep isl_basic_map *bmap,
        for (i = 0; i < bmap->n_ineq; ++i)
                if (isl_seq_first_non_zero(bmap->ineq[i] + first, n) >= 0)
                        return 1;
+       for (i = 0; i < bmap->n_div; ++i) {
+               if (isl_int_is_zero(bmap->div[i][0]))
+                       continue;
+               if (isl_seq_first_non_zero(bmap->div[i] + 1 + first, n) >= 0)
+                       return 1;
+       }
 
        return 0;
 }
@@ -1845,6 +1865,9 @@ __isl_give isl_basic_map *isl_basic_map_remove_unknown_divs(
                if (!div_is_unknown(bmap, i))
                        continue;
                bmap = isl_basic_map_remove_dims(bmap, isl_dim_div, i, 1);
+               if (!bmap)
+                       return NULL;
+               i = bmap->n_div;
        }
 
        return bmap;
@@ -2673,6 +2696,10 @@ __isl_give isl_basic_map *isl_basic_map_insert(__isl_take isl_basic_map *bmap,
                        bmap->n_div, bmap->n_eq, bmap->n_ineq);
        if (isl_basic_map_is_rational(bmap))
                res = isl_basic_map_set_rational(res);
+       if (isl_basic_map_plain_is_empty(bmap)) {
+               isl_basic_map_free(bmap);
+               return isl_basic_map_set_to_empty(res);
+       }
        res = isl_basic_map_add_constraints_dim_map(res, bmap, dim_map);
        return isl_basic_map_finalize(res);
 }
@@ -2977,7 +3004,7 @@ __isl_give isl_basic_map *isl_basic_map_project_out(
        isl_int *old;
 
        if (n == 0)
-               return bmap;
+               return basic_map_space_reset(bmap, type);
 
        if (!bmap)
                return NULL;
@@ -3047,7 +3074,7 @@ __isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
                return NULL;
 
        if (n == 0)
-               return map;
+               return map_space_reset(map, type);
 
        isl_assert(map->ctx, first + n <= isl_map_dim(map, type), goto error);
 
@@ -6926,7 +6953,7 @@ struct isl_map *isl_basic_map_union(
 {
        struct isl_map *map;
        if (!bmap1 || !bmap2)
-               return NULL;
+               goto error;
 
        isl_assert(bmap1->ctx, isl_space_is_equal(bmap1->dim, bmap2->dim), goto error);
 
@@ -8709,7 +8736,7 @@ int isl_basic_set_vars_get_sign(__isl_keep isl_basic_set *bset,
                return -1;
 
        bound = isl_vec_alloc(bset->ctx, 1 + isl_basic_set_total_dim(bset));
-       tab = isl_tab_from_basic_set(bset);
+       tab = isl_tab_from_basic_set(bset, 0);
        if (!bound || !tab)
                goto error;
 
@@ -9312,14 +9339,21 @@ __isl_give isl_basic_map *isl_basic_map_realign(__isl_take isl_basic_map *bmap,
        __isl_take isl_space *dim, __isl_take struct isl_dim_map *dim_map)
 {
        isl_basic_map *res;
+       unsigned flags;
 
        bmap = isl_basic_map_cow(bmap);
        if (!bmap || !dim || !dim_map)
                goto error;
 
+       flags = bmap->flags;
+       ISL_FL_CLR(flags, ISL_BASIC_MAP_FINAL);
+       ISL_FL_CLR(flags, ISL_BASIC_MAP_NORMALIZED);
+       ISL_FL_CLR(flags, ISL_BASIC_MAP_NORMALIZED_DIVS);
        res = isl_basic_map_alloc_space(dim,
                        bmap->n_div, bmap->n_eq, bmap->n_ineq);
        res = isl_basic_map_add_constraints_dim_map(res, bmap, dim_map);
+       if (res)
+               res->flags = flags;
        res = isl_basic_map_finalize(res);
        return res;
 error: