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

index 7e1118d..cd30cc8 100644 (file)
@@ -3853,6 +3853,10 @@ Operations include
        __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_splice(
+               __isl_take isl_multi_aff *ma1,
+               unsigned in_pos, unsigned out_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);
@@ -3877,6 +3881,10 @@ Operations include
        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_splice(
+               __isl_take isl_multi_pw_aff *mpa1,
+               unsigned in_pos, unsigned out_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,
index 529f4df..e34ae50 100644 (file)
@@ -309,6 +309,9 @@ __isl_give isl_multi_aff *isl_multi_aff_scale(__isl_take isl_multi_aff *maff,
 __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_splice(
+       __isl_take isl_multi_aff *ma1, unsigned in_pos, unsigned out_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(
@@ -524,6 +527,9 @@ __isl_give isl_multi_pw_aff *isl_multi_pw_aff_set_dim_name(
 __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_splice(
+       __isl_take isl_multi_pw_aff *mpa1, unsigned in_pos, unsigned out_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 61c1b27..338d915 100644 (file)
@@ -742,3 +742,55 @@ error:
        FN(MULTI(BASE),free)(multi2);
        return NULL;
 }
+
+/* Given two multi expressions, "multi1"
+ *
+ *     [A1 A2] -> [B1 B2]
+ *
+ * where A2 starts at position "in_pos" and B2 starts at position "out_pos",
+ * and "multi2"
+ *
+ *     [C] -> [D]
+ *
+ * return the multi expression
+ *
+ *     [A1 C A2] -> [B1 D B2]
+ *
+ * We first insert input dimensions to obtain
+ *
+ *     [A1 C A2] -> [B1 B2]
+ *
+ * and
+ *
+ *     [A1 C A2] -> [D]
+ *
+ * and then apply range_splice.
+ */
+__isl_give MULTI(BASE) *FN(MULTI(BASE),splice)(
+       __isl_take MULTI(BASE) *multi1, unsigned in_pos, unsigned out_pos,
+       __isl_take MULTI(BASE) *multi2)
+{
+       unsigned n_in1;
+       unsigned n_in2;
+
+       if (!multi1 || !multi2)
+               goto error;
+
+       n_in1 = FN(MULTI(BASE),dim)(multi1, isl_dim_in);
+       if (in_pos > n_in1)
+               isl_die(FN(MULTI(BASE),get_ctx)(multi1), isl_error_invalid,
+                       "index out of bounds", goto error);
+
+       n_in2 = FN(MULTI(BASE),dim)(multi2, isl_dim_in);
+
+       multi1 = FN(MULTI(BASE),insert_dims)(multi1, isl_dim_in, in_pos, n_in2);
+       multi2 = FN(MULTI(BASE),insert_dims)(multi2, isl_dim_in, n_in2,
+                                               n_in1 - in_pos);
+       multi2 = FN(MULTI(BASE),insert_dims)(multi2, isl_dim_in, 0, in_pos);
+
+       return FN(MULTI(BASE),range_splice)(multi1, out_pos, multi2);
+error:
+       FN(MULTI(BASE),free)(multi1);
+       FN(MULTI(BASE),free)(multi2);
+       return NULL;
+}