add isl_multi_*_range_splice
authorSven Verdoolaege <skimo@kotnet.org>
Sun, 19 Aug 2012 17:59:29 +0000 (19:59 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 18 Sep 2012 13:08:19 +0000 (15:08 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/aff.h
isl_multi_templ.c

index c14fc2e..7e1118d 100644 (file)
@@ -3850,6 +3850,9 @@ Operations include
                __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_splice(
+               __isl_take isl_multi_aff *ma1, unsigned pos,
+               __isl_take isl_multi_aff *ma2);
        __isl_give isl_multi_aff *isl_multi_aff_range_product(
                __isl_take isl_multi_aff *ma1,
                __isl_take isl_multi_aff *ma2);
@@ -3871,6 +3874,10 @@ Operations include
                __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_splice(
+               __isl_take isl_multi_pw_aff *mpa1, unsigned pos,
+               __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);
index 523aa62..529f4df 100644 (file)
@@ -306,6 +306,9 @@ __isl_give isl_multi_aff *isl_multi_aff_add(__isl_take isl_multi_aff *maff1,
 __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_splice(
+       __isl_take isl_multi_aff *ma1, unsigned pos,
+       __isl_take isl_multi_aff *ma2);
 __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(
@@ -518,6 +521,9 @@ __isl_give isl_multi_pw_aff *isl_multi_pw_aff_set_dim_name(
        __isl_take isl_multi_pw_aff *mpa,
        enum isl_dim_type type, unsigned pos, const char *s);
 
+__isl_give isl_multi_pw_aff *isl_multi_pw_aff_range_splice(
+       __isl_take isl_multi_pw_aff *mpa1, unsigned pos,
+       __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_pw_aff *isl_multi_pw_aff_range_product(
index b82dc4b..61c1b27 100644 (file)
@@ -701,3 +701,44 @@ __isl_give MULTI(BASE) *FN(MULTI(BASE),flat_range_product)(
        multi = FN(MULTI(BASE),flatten_range)(multi);
        return multi;
 }
+
+/* Given two multi expressions, "multi1"
+ *
+ *     [A] -> [B1 B2]
+ *
+ * where B2 starts at position "pos", and "multi2"
+ *
+ *     [A] -> [D]
+ *
+ * return the multi expression
+ *
+ *     [A] -> [B1 D B2]
+ */
+__isl_give MULTI(BASE) *FN(MULTI(BASE),range_splice)(
+       __isl_take MULTI(BASE) *multi1, unsigned pos,
+       __isl_take MULTI(BASE) *multi2)
+{
+       MULTI(BASE) *res;
+       unsigned dim;
+
+       if (!multi1 || !multi2)
+               goto error;
+
+       dim = FN(MULTI(BASE),dim)(multi1, isl_dim_out);
+       if (pos > dim)
+               isl_die(FN(MULTI(BASE),get_ctx)(multi1), isl_error_invalid,
+                       "index out of bounds", goto error);
+
+       res = FN(MULTI(BASE),copy)(multi1);
+       res = FN(MULTI(BASE),drop_dims)(res, isl_dim_out, pos, dim - pos);
+       multi1 = FN(MULTI(BASE),drop_dims)(multi1, isl_dim_out, 0, pos);
+
+       res = FN(MULTI(BASE),flat_range_product)(res, multi2);
+       res = FN(MULTI(BASE),flat_range_product)(res, multi1);
+
+       return res;
+error:
+       FN(MULTI(BASE),free)(multi1);
+       FN(MULTI(BASE),free)(multi2);
+       return NULL;
+}