From a9f0521e8990ca7c6bafc89abb0b8bb42d4094dd Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Tue, 9 Apr 2013 18:33:48 +0200 Subject: [PATCH] add isl_aff_set_constant_val Signed-off-by: Sven Verdoolaege --- doc/user.pod | 6 +++++- include/isl/aff.h | 3 +++ isl_aff.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/doc/user.pod b/doc/user.pod index f4cae685..6410eec3 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -3669,6 +3669,8 @@ It can be modified using __isl_take isl_aff *aff, isl_int v); __isl_give isl_aff *isl_aff_set_constant_si( __isl_take isl_aff *aff, int v); + __isl_give isl_aff *isl_aff_set_constant_val( + __isl_take isl_aff *aff, __isl_take isl_val *v); __isl_give isl_aff *isl_aff_set_coefficient( __isl_take isl_aff *aff, enum isl_dim_type type, int pos, isl_int v); @@ -3712,8 +3714,10 @@ It can be modified using __isl_take isl_pw_aff *pwaff, enum isl_dim_type type, unsigned first, unsigned n); -Note that the C and C functions +Note that C, C, +C and C set the I of the constant or coefficient, while +C sets the constant as a whole. C and C add an integer value to the possibly rational constant or coefficient. The C functions add an integer value to diff --git a/include/isl/aff.h b/include/isl/aff.h index b86b304f..f76bfb46 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #if defined(__cplusplus) @@ -41,6 +42,8 @@ int isl_aff_get_coefficient(__isl_keep isl_aff *aff, int isl_aff_get_denominator(__isl_keep isl_aff *aff, isl_int *v); __isl_give isl_aff *isl_aff_set_constant(__isl_take isl_aff *aff, isl_int v); __isl_give isl_aff *isl_aff_set_constant_si(__isl_take isl_aff *aff, int v); +__isl_give isl_aff *isl_aff_set_constant_val(__isl_take isl_aff *aff, + __isl_take isl_val *v); __isl_give isl_aff *isl_aff_set_coefficient(__isl_take isl_aff *aff, enum isl_dim_type type, int pos, isl_int v); __isl_give isl_aff *isl_aff_set_coefficient_si(__isl_take isl_aff *aff, diff --git a/isl_aff.c b/isl_aff.c index 1156d098..a0b780bc 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #undef BASE @@ -469,6 +470,53 @@ __isl_give isl_aff *isl_aff_set_constant(__isl_take isl_aff *aff, isl_int v) return aff; } +/* Replace the constant term of "aff" by "v". + */ +__isl_give isl_aff *isl_aff_set_constant_val(__isl_take isl_aff *aff, + __isl_take isl_val *v) +{ + if (!aff || !v) + goto error; + + if (!isl_val_is_rat(v)) + isl_die(isl_aff_get_ctx(aff), isl_error_invalid, + "expecting rational value", goto error); + + if (isl_int_eq(aff->v->el[1], v->n) && + isl_int_eq(aff->v->el[0], v->d)) { + isl_val_free(v); + return aff; + } + + aff = isl_aff_cow(aff); + if (!aff) + goto error; + aff->v = isl_vec_cow(aff->v); + if (!aff->v) + goto error; + + if (isl_int_eq(aff->v->el[0], v->d)) { + isl_int_set(aff->v->el[1], v->n); + } else if (isl_int_is_one(v->d)) { + isl_int_mul(aff->v->el[1], aff->v->el[0], v->n); + } else { + isl_seq_scale(aff->v->el + 1, + aff->v->el + 1, v->d, aff->v->size - 1); + isl_int_mul(aff->v->el[1], aff->v->el[0], v->n); + isl_int_mul(aff->v->el[0], aff->v->el[0], v->d); + aff->v = isl_vec_normalize(aff->v); + if (!aff->v) + goto error; + } + + isl_val_free(v); + return aff; +error: + isl_aff_free(aff); + isl_val_free(v); + return NULL; +} + __isl_give isl_aff *isl_aff_add_constant(__isl_take isl_aff *aff, isl_int v) { if (isl_int_is_zero(v)) -- 2.11.4.GIT