From 187ec0eb39d8b1b744a0661fcfeff35974c434bc Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 28 Jun 2013 12:57:46 +0200 Subject: [PATCH] generalize isl_multi_aff_product Signed-off-by: Sven Verdoolaege --- doc/user.pod | 6 ++++++ include/isl/multi.h | 3 +++ isl_aff.c | 41 ----------------------------------------- isl_multi_templ.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 41 deletions(-) diff --git a/doc/user.pod b/doc/user.pod index 4e9684c4..7c977843 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -3370,6 +3370,9 @@ Operations include __isl_give isl_multi_val *isl_multi_val_flat_range_product( __isl_take isl_multi_val *mv1, __isl_take isl_multi_aff *mv2); + __isl_give isl_multi_val *isl_multi_val_product( + __isl_take isl_multi_val *mv1, + __isl_take isl_multi_val *mv2); __isl_give isl_multi_val *isl_multi_val_add_val( __isl_take isl_multi_val *mv, __isl_take isl_val *v); @@ -4371,6 +4374,9 @@ by the corresponding elements of C. __isl_give isl_multi_aff *isl_multi_aff_product( __isl_take isl_multi_aff *ma1, __isl_take isl_multi_aff *ma2); + __isl_give isl_multi_pw_aff *isl_multi_pw_aff_product( + __isl_take isl_multi_pw_aff *mpa1, + __isl_take isl_multi_pw_aff *mpa2); __isl_give isl_pw_multi_aff * isl_pw_multi_aff_range_product( __isl_take isl_pw_multi_aff *pma1, diff --git a/include/isl/multi.h b/include/isl/multi.h index 11141bca..d3da9436 100644 --- a/include/isl/multi.h +++ b/include/isl/multi.h @@ -77,6 +77,9 @@ __isl_give isl_multi_##BASE *isl_multi_##BASE##_flat_range_product( \ __isl_give isl_multi_##BASE *isl_multi_##BASE##_range_product( \ __isl_take isl_multi_##BASE *multi1, \ __isl_take isl_multi_##BASE *multi2); \ +__isl_give isl_multi_##BASE *isl_multi_##BASE##_product( \ + __isl_take isl_multi_##BASE *multi1, \ + __isl_take isl_multi_##BASE *multi2); \ __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_val( \ __isl_take isl_multi_##BASE *multi, __isl_take isl_val *v); \ __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_multi_val( \ diff --git a/isl_aff.c b/isl_aff.c index 7ad353f8..0076cf96 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -3454,47 +3454,6 @@ __isl_give isl_multi_aff *isl_multi_aff_sub(__isl_take isl_multi_aff *ma1, &isl_multi_aff_sub_aligned); } -/* Given two multi-affine expressions A -> B and C -> D, - * construct a multi-affine expression [A -> C] -> [B -> D]. - */ -__isl_give isl_multi_aff *isl_multi_aff_product( - __isl_take isl_multi_aff *ma1, __isl_take isl_multi_aff *ma2) -{ - int i; - isl_aff *aff; - isl_space *space; - isl_multi_aff *res; - int in1, in2, out1, out2; - - in1 = isl_multi_aff_dim(ma1, isl_dim_in); - in2 = isl_multi_aff_dim(ma2, isl_dim_in); - out1 = isl_multi_aff_dim(ma1, isl_dim_out); - out2 = isl_multi_aff_dim(ma2, isl_dim_out); - space = isl_space_product(isl_multi_aff_get_space(ma1), - isl_multi_aff_get_space(ma2)); - res = isl_multi_aff_alloc(isl_space_copy(space)); - space = isl_space_domain(space); - - for (i = 0; i < out1; ++i) { - aff = isl_multi_aff_get_aff(ma1, i); - aff = isl_aff_insert_dims(aff, isl_dim_in, in1, in2); - aff = isl_aff_reset_domain_space(aff, isl_space_copy(space)); - res = isl_multi_aff_set_aff(res, i, aff); - } - - for (i = 0; i < out2; ++i) { - aff = isl_multi_aff_get_aff(ma2, i); - aff = isl_aff_insert_dims(aff, isl_dim_in, 0, in1); - aff = isl_aff_reset_domain_space(aff, isl_space_copy(space)); - res = isl_multi_aff_set_aff(res, out1 + i, aff); - } - - isl_space_free(space); - isl_multi_aff_free(ma1); - isl_multi_aff_free(ma2); - return res; -} - /* Exploit the equalities in "eq" to simplify the affine expressions. */ static __isl_give isl_multi_aff *isl_multi_aff_substitute_equalities( diff --git a/isl_multi_templ.c b/isl_multi_templ.c index 020983e0..3105b815 100644 --- a/isl_multi_templ.c +++ b/isl_multi_templ.c @@ -804,6 +804,59 @@ __isl_give MULTI(BASE) *FN(MULTI(BASE),range_product)( &FN(MULTI(BASE),range_product_aligned)); } +/* Given two MULTI(BASE)s A -> B and C -> D, + * construct a MULTI(BASE) [A -> C] -> [B -> D]. + * + * The parameters are assumed to have been aligned. + */ +__isl_give MULTI(BASE) *FN(MULTI(BASE),product_aligned)( + __isl_take MULTI(BASE) *multi1, __isl_take MULTI(BASE) *multi2) +{ + int i; + EL *el; + isl_space *space; + MULTI(BASE) *res; + int in1, in2, out1, out2; + + in1 = FN(MULTI(BASE),dim)(multi1, isl_dim_in); + in2 = FN(MULTI(BASE),dim)(multi2, isl_dim_in); + out1 = FN(MULTI(BASE),dim)(multi1, isl_dim_out); + out2 = FN(MULTI(BASE),dim)(multi2, isl_dim_out); + space = isl_space_product(FN(MULTI(BASE),get_space)(multi1), + FN(MULTI(BASE),get_space)(multi2)); + res = FN(MULTI(BASE),alloc)(isl_space_copy(space)); + space = isl_space_domain(space); + + for (i = 0; i < out1; ++i) { + el = FN(FN(MULTI(BASE),get),BASE)(multi1, i); + el = FN(EL,insert_dims)(el, isl_dim_in, in1, in2); + el = FN(EL,reset_domain_space)(el, isl_space_copy(space)); + res = FN(FN(MULTI(BASE),set),BASE)(res, i, el); + } + + for (i = 0; i < out2; ++i) { + el = FN(FN(MULTI(BASE),get),BASE)(multi2, i); + el = FN(EL,insert_dims)(el, isl_dim_in, 0, in1); + el = FN(EL,reset_domain_space)(el, isl_space_copy(space)); + res = FN(FN(MULTI(BASE),set),BASE)(res, out1 + i, el); + } + + isl_space_free(space); + FN(MULTI(BASE),free)(multi1); + FN(MULTI(BASE),free)(multi2); + return res; +} + +/* 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),product)( + __isl_take MULTI(BASE) *multi1, __isl_take MULTI(BASE) *multi2) +{ + return FN(MULTI(BASE),align_params_multi_multi_and)(multi1, multi2, + &FN(MULTI(BASE),product_aligned)); +} + __isl_give MULTI(BASE) *FN(MULTI(BASE),flatten_range)( __isl_take MULTI(BASE) *multi) { -- 2.11.4.GIT