__isl_take isl_pw_multi_aff *pma);
__isl_give isl_union_set *isl_union_pw_multi_aff_domain(
__isl_take isl_union_pw_multi_aff *upma);
+ __isl_give isl_multi_aff *isl_multi_aff_range_product(
+ __isl_take isl_multi_aff *ma1,
+ __isl_take isl_multi_aff *ma2);
__isl_give isl_multi_aff *isl_multi_aff_flat_range_product(
__isl_take isl_multi_aff *ma1,
__isl_take isl_multi_aff *ma2);
__isl_take isl_union_pw_multi_aff *upma1,
__isl_take isl_union_pw_multi_aff *upma2);
__isl_give isl_multi_pw_aff *
+ isl_multi_pw_aff_range_product(
+ __isl_take isl_multi_pw_aff *mpa1,
+ __isl_take isl_multi_pw_aff *mpa2);
+ __isl_give isl_multi_pw_aff *
isl_multi_pw_aff_flat_range_product(
__isl_take isl_multi_pw_aff *mpa1,
__isl_take isl_multi_pw_aff *mpa2);
__isl_give isl_multi_aff *isl_multi_aff_scale(__isl_take isl_multi_aff *maff,
isl_int f);
+__isl_give isl_multi_aff *isl_multi_aff_range_product(
+ __isl_take isl_multi_aff *ma1, __isl_take isl_multi_aff *ma2);
__isl_give isl_multi_aff *isl_multi_aff_flat_range_product(
__isl_take isl_multi_aff *ma1, __isl_take isl_multi_aff *ma2);
__isl_give isl_multi_aff *isl_multi_aff_product(
__isl_give isl_multi_pw_aff *isl_multi_pw_aff_flat_range_product(
__isl_take isl_multi_pw_aff *mpa1, __isl_take isl_multi_pw_aff *mpa2);
+__isl_give isl_multi_pw_aff *isl_multi_pw_aff_range_product(
+ __isl_take isl_multi_pw_aff *mpa1, __isl_take isl_multi_pw_aff *mpa2);
__isl_give isl_printer *isl_printer_print_multi_pw_aff(
__isl_take isl_printer *p, __isl_keep isl_multi_pw_aff *mpa);
/* Given two MULTI(BASE)s A -> B and C -> D,
* construct a MULTI(BASE) (A * C) -> (B, D).
*/
-__isl_give MULTI(BASE) *FN(MULTI(BASE),flat_range_product)(
+__isl_give MULTI(BASE) *FN(MULTI(BASE),range_product)(
__isl_take MULTI(BASE) *multi1, __isl_take MULTI(BASE) *multi2)
{
int i, n1, n2;
space = isl_space_range_product(FN(MULTI(BASE),get_space)(multi1),
FN(MULTI(BASE),get_space)(multi2));
- space = isl_space_flatten_range(space);
res = FN(MULTI(BASE),alloc)(space);
n1 = FN(MULTI(BASE),dim)(multi1, isl_dim_out);
FN(MULTI(BASE),free)(multi2);
return NULL;
}
+
+__isl_give MULTI(BASE) *FN(MULTI(BASE),flatten_range)(
+ __isl_take MULTI(BASE) *multi)
+{
+ if (!multi)
+ return NULL;
+
+ if (!multi->space->nested[1])
+ return multi;
+
+ multi = FN(MULTI(BASE),cow)(multi);
+ if (!multi)
+ return NULL;
+
+ multi->space = isl_space_flatten_range(multi->space);
+ if (!multi->space)
+ return FN(MULTI(BASE),free)(multi);
+
+ return multi;
+}
+
+/* Given two MULTI(BASE)s A -> B and C -> D,
+ * construct a MULTI(BASE) (A * C) -> [B -> D].
+ */
+__isl_give MULTI(BASE) *FN(MULTI(BASE),flat_range_product)(
+ __isl_take MULTI(BASE) *multi1, __isl_take MULTI(BASE) *multi2)
+{
+ MULTI(BASE) *multi;
+
+ multi = FN(MULTI(BASE),range_product)(multi1, multi2);
+ multi = FN(MULTI(BASE),flatten_range)(multi);
+ return multi;
+}