From e73ca1032f9945f9598b980e4a4fd4aa7ad48d58 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Tue, 1 Oct 2013 15:11:34 +0200 Subject: [PATCH] add isl_multi_union_pw_aff_multi_aff_on_domain Signed-off-by: Sven Verdoolaege --- doc/user.pod | 9 +++++++-- include/isl/aff.h | 2 ++ isl_aff.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/doc/user.pod b/doc/user.pod index 5c2932f0..a04716c7 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -2674,14 +2674,19 @@ function. Similarly, a multiple union piecewise affine expression can be created from -a multiple value with a given domain using the following -function. +a multiple value with a given domain or +a multiple affine expression with a given domain +using the following functions. #include __isl_give isl_multi_union_pw_aff * isl_multi_union_pw_aff_multi_val_on_domain( __isl_take isl_union_set *domain, __isl_take isl_multi_val *mv); + __isl_give isl_multi_union_pw_aff * + isl_multi_union_pw_aff_multi_aff_on_domain( + __isl_take isl_union_set *domain, + __isl_take isl_multi_aff *ma); Multiple expressions can be copied and freed using the following functions. diff --git a/include/isl/aff.h b/include/isl/aff.h index 1832052d..c9a4cfaa 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -820,6 +820,8 @@ __isl_give isl_multi_union_pw_aff *isl_multi_union_pw_aff_from_multi_pw_aff( __isl_take isl_multi_pw_aff *mpa); __isl_give isl_multi_union_pw_aff *isl_multi_union_pw_aff_multi_val_on_domain( __isl_take isl_union_set *domain, __isl_take isl_multi_val *mv); +__isl_give isl_multi_union_pw_aff *isl_multi_union_pw_aff_multi_aff_on_domain( + __isl_take isl_union_set *domain, __isl_take isl_multi_aff *ma); __isl_give isl_multi_union_pw_aff *isl_multi_union_pw_aff_intersect_domain( __isl_take isl_multi_union_pw_aff *mupa, diff --git a/isl_aff.c b/isl_aff.c index 25760a96..6726cd27 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -7720,3 +7720,62 @@ error: isl_multi_val_free(mv); return NULL; } + +/* Return a multiple union piecewise affine expression + * that is equal to "ma" on "domain", assuming "domain" and "ma" + * have been aligned. + */ +static __isl_give isl_multi_union_pw_aff * +isl_multi_union_pw_aff_multi_aff_on_domain_aligned( + __isl_take isl_union_set *domain, __isl_take isl_multi_aff *ma) +{ + int i, n; + isl_space *space; + isl_multi_union_pw_aff *mupa; + + if (!domain || !ma) + goto error; + + n = isl_multi_aff_dim(ma, isl_dim_set); + space = isl_multi_aff_get_space(ma); + mupa = isl_multi_union_pw_aff_alloc(space); + for (i = 0; i < n; ++i) { + isl_aff *aff; + isl_union_pw_aff *upa; + + aff = isl_multi_aff_get_aff(ma, i); + upa = isl_union_pw_aff_aff_on_domain(isl_union_set_copy(domain), + aff); + mupa = isl_multi_union_pw_aff_set_union_pw_aff(mupa, i, upa); + } + + isl_union_set_free(domain); + isl_multi_aff_free(ma); + return mupa; +error: + isl_union_set_free(domain); + isl_multi_aff_free(ma); + return NULL; +} + +/* Return a multiple union piecewise affine expression + * that is equal to "ma" on "domain". + */ +__isl_give isl_multi_union_pw_aff *isl_multi_union_pw_aff_multi_aff_on_domain( + __isl_take isl_union_set *domain, __isl_take isl_multi_aff *ma) +{ + if (!domain || !ma) + goto error; + if (isl_space_match(domain->dim, isl_dim_param, + ma->space, isl_dim_param)) + return isl_multi_union_pw_aff_multi_aff_on_domain_aligned( + domain, ma); + domain = isl_union_set_align_params(domain, + isl_multi_aff_get_space(ma)); + ma = isl_multi_aff_align_params(ma, isl_union_set_get_space(domain)); + return isl_multi_union_pw_aff_multi_aff_on_domain_aligned(domain, ma); +error: + isl_union_set_free(domain); + isl_multi_aff_free(ma); + return NULL; +} -- 2.11.4.GIT