isl_set_from_pw_aff: handle NULL input
[platform/upstream/isl.git] / isl_aff.c
index 813ada7..a6573be 100644 (file)
--- a/isl_aff.c
+++ b/isl_aff.c
@@ -19,6 +19,7 @@
 #include <isl/constraint.h>
 #include <isl/seq.h>
 #include <isl/set.h>
+#include <isl_config.h>
 
 __isl_give isl_aff *isl_aff_alloc_vec(__isl_take isl_local_space *ls,
        __isl_take isl_vec *v)
@@ -543,6 +544,16 @@ __isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff)
        return aff;
 }
 
+__isl_give isl_aff *isl_aff_normalize(__isl_take isl_aff *aff)
+{
+       if (!aff)
+               return NULL;
+       aff->v = isl_vec_normalize(aff->v);
+       if (!aff->v)
+               return isl_aff_free(aff);
+       return aff;
+}
+
 /* Given f, return floor(f).
  * If f is an integer expression, then just return f.
  * Otherwise, if f = g/m, write g = q m + r,
@@ -1411,6 +1422,8 @@ __isl_give isl_map *isl_map_from_pw_aff(__isl_take isl_pw_aff *pwaff)
  */
 __isl_give isl_set *isl_set_from_pw_aff(__isl_take isl_pw_aff *pwaff)
 {
+       if (!pwaff)
+               return NULL;
        if (!isl_space_is_set(pwaff->dim))
                isl_die(isl_pw_aff_get_ctx(pwaff), isl_error_invalid,
                        "space of input is not a set",
@@ -1811,44 +1824,28 @@ error:
        return NULL;
 }
 
-static __isl_give isl_pw_aff *pw_aff_mul(__isl_take isl_pw_aff *pwaff1,
+static __isl_give isl_pw_aff *pw_aff_add(__isl_take isl_pw_aff *pwaff1,
        __isl_take isl_pw_aff *pwaff2)
 {
-       int i, j, n;
-       isl_pw_aff *res;
-
-       if (!pwaff1 || !pwaff2)
-               goto error;
-
-       n = pwaff1->n * pwaff2->n;
-       res = isl_pw_aff_alloc_size(isl_space_copy(pwaff1->dim), n);
-
-       for (i = 0; i < pwaff1->n; ++i) {
-               for (j = 0; j < pwaff2->n; ++j) {
-                       isl_set *common;
-                       isl_aff *prod;
-                       common = isl_set_intersect(
-                                       isl_set_copy(pwaff1->p[i].set),
-                                       isl_set_copy(pwaff2->p[j].set));
-                       if (isl_set_plain_is_empty(common)) {
-                               isl_set_free(common);
-                               continue;
-                       }
+       return isl_pw_aff_on_shared_domain(pwaff1, pwaff2, &isl_aff_add);
+}
 
-                       prod = isl_aff_mul(isl_aff_copy(pwaff1->p[i].aff),
-                                           isl_aff_copy(pwaff2->p[j].aff));
+__isl_give isl_pw_aff *isl_pw_aff_add(__isl_take isl_pw_aff *pwaff1,
+       __isl_take isl_pw_aff *pwaff2)
+{
+       return isl_pw_aff_align_params_pw_pw_and(pwaff1, pwaff2, &pw_aff_add);
+}
 
-                       res = isl_pw_aff_add_piece(res, common, prod);
-               }
-       }
+__isl_give isl_pw_aff *isl_pw_aff_union_add(__isl_take isl_pw_aff *pwaff1,
+       __isl_take isl_pw_aff *pwaff2)
+{
+       return isl_pw_aff_union_add_(pwaff1, pwaff2);
+}
 
-       isl_pw_aff_free(pwaff1);
-       isl_pw_aff_free(pwaff2);
-       return res;
-error:
-       isl_pw_aff_free(pwaff1);
-       isl_pw_aff_free(pwaff2);
-       return NULL;
+static __isl_give isl_pw_aff *pw_aff_mul(__isl_take isl_pw_aff *pwaff1,
+       __isl_take isl_pw_aff *pwaff2)
+{
+       return isl_pw_aff_on_shared_domain(pwaff1, pwaff2, &isl_aff_mul);
 }
 
 __isl_give isl_pw_aff *isl_pw_aff_mul(__isl_take isl_pw_aff *pwaff1,
@@ -2118,6 +2115,26 @@ __isl_give isl_multi_aff *isl_multi_aff_drop_dims(__isl_take isl_multi_aff *maff
 
 #include <isl_pw_templ.c>
 
+static __isl_give isl_pw_multi_aff *pw_multi_aff_add(
+       __isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2)
+{
+       return isl_pw_multi_aff_on_shared_domain(pma1, pma2,
+                                               &isl_multi_aff_add);
+}
+
+__isl_give isl_pw_multi_aff *isl_pw_multi_aff_add(
+       __isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2)
+{
+       return isl_pw_multi_aff_align_params_pw_pw_and(pma1, pma2,
+                                               &pw_multi_aff_add);
+}
+
+__isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_add(
+       __isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2)
+{
+       return isl_pw_multi_aff_union_add_(pma1, pma2);
+}
+
 /* Construct a map mapping the domain the piecewise multi-affine expression
  * to its range, with each dimension in the range equated to the
  * corresponding affine expression on its cell.