X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_multi_templ.c;h=7080493d3c4e358db7fc45acf127688d651dfd67;hb=acc5df2f96fc0c04495cd237f0b5b5eb8822ed85;hp=61c1b279c804fddf08ee91e7032079072ec6291c;hpb=2ce761740a398202ce9d197365f012a1651d023a;p=platform%2Fupstream%2Fisl.git diff --git a/isl_multi_templ.c b/isl_multi_templ.c index 61c1b27..7080493 100644 --- a/isl_multi_templ.c +++ b/isl_multi_templ.c @@ -345,7 +345,7 @@ __isl_give MULTI(BASE) *FN(MULTI(BASE),realign_domain)( multi = FN(MULTI(BASE),cow)(multi); if (!multi || !exp) - return NULL; + goto error; for (i = 0; i < multi->n; ++i) { multi->p[i] = FN(EL,realign_domain)(multi->p[i], @@ -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; +}