#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)
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,
*/
__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",
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,
#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.