From 2ce761740a398202ce9d197365f012a1651d023a Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sun, 19 Aug 2012 19:59:29 +0200 Subject: [PATCH] add isl_multi_*_range_splice Signed-off-by: Sven Verdoolaege --- doc/user.pod | 7 +++++++ include/isl/aff.h | 6 ++++++ isl_multi_templ.c | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index c14fc2e7..7e1118db 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -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); diff --git a/include/isl/aff.h b/include/isl/aff.h index 523aa623..529f4df2 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -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( diff --git a/isl_multi_templ.c b/isl_multi_templ.c index b82dc4b8..61c1b279 100644 --- a/isl_multi_templ.c +++ b/isl_multi_templ.c @@ -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; +} -- 2.11.4.GIT