isl_set_product: call isl_map_range_product instead of isl_map_product
[platform/upstream/isl.git] / isl_map.c
index 7d5151c..7496da7 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -161,17 +161,17 @@ unsigned isl_basic_map_total_dim(const struct isl_basic_map *bmap)
 
 unsigned isl_map_n_in(const struct isl_map *map)
 {
-       return map->dim->n_in;
+       return map ? map->dim->n_in : 0;
 }
 
 unsigned isl_map_n_out(const struct isl_map *map)
 {
-       return map->dim->n_out;
+       return map ? map->dim->n_out : 0;
 }
 
 unsigned isl_map_n_param(const struct isl_map *map)
 {
-       return map->dim->nparam;
+       return map ? map->dim->nparam : 0;
 }
 
 int isl_map_compatible_domain(struct isl_map *map, struct isl_set *set)
@@ -1390,6 +1390,8 @@ __isl_give isl_set *isl_set_eliminate_dims(__isl_take isl_set *set,
 __isl_give isl_basic_map *isl_basic_map_remove_divs(
        __isl_take isl_basic_map *bmap)
 {
+       if (!bmap)
+               return NULL;
        bmap = isl_basic_map_eliminate_vars(bmap, isl_dim_total(bmap->dim),
                                                bmap->n_div);
        if (!bmap)
@@ -1441,7 +1443,7 @@ struct isl_basic_map *isl_basic_map_remove_dims(struct isl_basic_map *bmap,
                return NULL;
        isl_assert(bmap->ctx, first + n <= isl_basic_map_dim(bmap, type),
                        goto error);
-       if (n == 0)
+       if (n == 0 && !isl_dim_is_named_or_nested(bmap->dim, type))
                return bmap;
        bmap = isl_basic_map_eliminate_vars(bmap,
                        isl_basic_map_offset(bmap, type) - 1 + first, n);
@@ -2268,11 +2270,13 @@ struct isl_map *isl_map_intersect(struct isl_map *map1, struct isl_map *map2)
        if (!map1 || !map2)
                goto error;
 
-       if (isl_map_plain_is_empty(map1)) {
+       if (isl_map_plain_is_empty(map1) &&
+           isl_dim_equal(map1->dim, map2->dim)) {
                isl_map_free(map2);
                return map1;
        }
-       if (isl_map_plain_is_empty(map2)) {
+       if (isl_map_plain_is_empty(map2) &&
+           isl_dim_equal(map1->dim, map2->dim)) {
                isl_map_free(map1);
                return map2;
        }
@@ -2331,6 +2335,21 @@ struct isl_set *isl_set_intersect(struct isl_set *set1, struct isl_set *set2)
                                  (struct isl_map *)set2);
 }
 
+/* The current implementation of isl_map_intersect accepts intersections
+ * with parameter domains, so we can just call that for now.
+ */
+__isl_give isl_map *isl_map_intersect_params(__isl_take isl_map *map,
+               __isl_take isl_set *params)
+{
+       return isl_map_intersect(map, params);
+}
+
+__isl_give isl_set *isl_set_intersect_params(__isl_take isl_set *set,
+               __isl_take isl_set *params)
+{
+       return isl_map_intersect_params(set, params);
+}
+
 struct isl_basic_map *isl_basic_map_reverse(struct isl_basic_map *bmap)
 {
        struct isl_dim *dim;
@@ -7565,8 +7584,7 @@ __isl_give isl_map *isl_map_flat_product(__isl_take isl_map *map1,
  */
 struct isl_set *isl_set_product(struct isl_set *set1, struct isl_set *set2)
 {
-       return (struct isl_set *)isl_map_product((struct isl_map *)set1,
-                                                (struct isl_map *)set2);
+       return isl_map_range_product(set1, set2);
 }
 
 __isl_give isl_set *isl_set_flat_product(__isl_take isl_set *set1,