From eae1f36ff1fadd9c5aa3d25a4a295423b1602eac Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Tue, 18 Jun 2013 11:35:44 +0200 Subject: [PATCH] add isl_pw_multi_aff_scale_multi_val Signed-off-by: Sven Verdoolaege --- doc/user.pod | 4 ++++ include/isl/aff.h | 2 ++ isl_aff.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index eb284529..b2e2adaf 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -4389,6 +4389,10 @@ C subtracts the second argument from the first. __isl_give isl_multi_aff *isl_multi_aff_scale_multi_val( __isl_take isl_multi_aff *ma, __isl_take isl_multi_val *mv); + __isl_give isl_pw_multi_aff * + isl_pw_multi_aff_scale_multi_val( + __isl_take isl_pw_multi_aff *pma, + __isl_take isl_multi_val *mv); __isl_give isl_multi_pw_aff * isl_multi_pw_aff_scale_multi_val( __isl_take isl_multi_pw_aff *mpa, diff --git a/include/isl/aff.h b/include/isl/aff.h index 2a081982..1f82c96b 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -409,6 +409,8 @@ __isl_give isl_pw_multi_aff *isl_pw_multi_aff_sub( __isl_give isl_pw_multi_aff *isl_pw_multi_aff_scale_val( __isl_take isl_pw_multi_aff *pma, __isl_take isl_val *v); +__isl_give isl_pw_multi_aff *isl_pw_multi_aff_scale_multi_val( + __isl_take isl_pw_multi_aff *pma, __isl_take isl_multi_val *mv); __isl_give isl_pw_multi_aff *isl_pw_multi_aff_scale_vec( __isl_take isl_pw_multi_aff *pma, __isl_take isl_vec *v); diff --git a/isl_aff.c b/isl_aff.c index 0ccab138..15829085 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -5283,3 +5283,42 @@ error: isl_union_pw_multi_aff_free(upma); return NULL; } + +/* Scale the elements of "pma" by the corresponding elements of "mv". + */ +__isl_give isl_pw_multi_aff *isl_pw_multi_aff_scale_multi_val( + __isl_take isl_pw_multi_aff *pma, __isl_take isl_multi_val *mv) +{ + int i; + + pma = isl_pw_multi_aff_cow(pma); + if (!pma || !mv) + goto error; + if (!isl_space_tuple_match(pma->dim, isl_dim_out, + mv->space, isl_dim_set)) + isl_die(isl_pw_multi_aff_get_ctx(pma), isl_error_invalid, + "spaces don't match", goto error); + if (!isl_space_match(pma->dim, isl_dim_param, + mv->space, isl_dim_param)) { + pma = isl_pw_multi_aff_align_params(pma, + isl_multi_val_get_space(mv)); + mv = isl_multi_val_align_params(mv, + isl_pw_multi_aff_get_space(pma)); + if (!pma || !mv) + goto error; + } + + for (i = 0; i < pma->n; ++i) { + pma->p[i].maff = isl_multi_aff_scale_multi_val(pma->p[i].maff, + isl_multi_val_copy(mv)); + if (!pma->p[i].maff) + goto error; + } + + isl_multi_val_free(mv); + return pma; +error: + isl_multi_val_free(mv); + isl_pw_multi_aff_free(pma); + return NULL; +} -- 2.11.4.GIT