X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_fold.c;h=62ad06515d6d948a403da34b07becfa2f440def5;hb=2a76a4d88b65873ed5437c8f16f0b1ebd39e4c35;hp=98a91ae090b5b161c567d3ef19068d95d59f7e51;hpb=44d79a0484a9e0cbb0f40221b8a42dec5fa6c133;p=platform%2Fupstream%2Fisl.git diff --git a/isl_fold.c b/isl_fold.c index 98a91ae..62ad065 100644 --- a/isl_fold.c +++ b/isl_fold.c @@ -1,7 +1,7 @@ /* * Copyright 2010 INRIA Saclay * - * Use of this software is governed by the GNU LGPLv2.1 license + * Use of this software is governed by the MIT license * * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France, * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod, @@ -17,6 +17,7 @@ #include #include #include +#include #include enum isl_fold isl_fold_type_negate(enum isl_fold type) @@ -611,6 +612,15 @@ error: return NULL; } +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist_params( + __isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *context) +{ + isl_space *space = isl_qpolynomial_fold_get_domain_space(fold); + isl_set *dom_context = isl_set_universe(space); + dom_context = isl_set_intersect_params(dom_context, context); + return isl_qpolynomial_fold_gist(fold, dom_context); +} + #define HAS_TYPE #undef PW @@ -625,8 +635,11 @@ error: #define IS_ZERO is_zero #undef FIELD #define FIELD fold +#undef DEFAULT_IS_ZERO +#define DEFAULT_IS_ZERO 1 #define NO_NEG +#define NO_PULLBACK #include @@ -638,6 +651,8 @@ error: #define PARTS pw_qpolynomial_fold #define ALIGN_DOMAIN +#define NO_SUB + #include __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_empty(enum isl_fold type, @@ -959,6 +974,13 @@ __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_from_pw_qpolynomial( return pwf; } +__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add( + __isl_take isl_pw_qpolynomial_fold *pwf1, + __isl_take isl_pw_qpolynomial_fold *pwf2) +{ + return isl_pw_qpolynomial_fold_union_add_(pwf1, pwf2); +} + int isl_qpolynomial_fold_plain_is_equal(__isl_keep isl_qpolynomial_fold *fold1, __isl_keep isl_qpolynomial_fold *fold2) { @@ -1609,3 +1631,50 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale( { return isl_qpolynomial_fold_mul_isl_int(fold, v); } + +/* Multiply "fold" by "v". + */ +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale_val( + __isl_take isl_qpolynomial_fold *fold, __isl_take isl_val *v) +{ + int i; + + if (!fold || !v) + goto error; + + if (isl_val_is_one(v)) { + isl_val_free(v); + return fold; + } + if (isl_val_is_zero(v)) { + isl_qpolynomial_fold *zero; + isl_space *space = isl_qpolynomial_fold_get_domain_space(fold); + zero = isl_qpolynomial_fold_empty(fold->type, space); + isl_qpolynomial_fold_free(fold); + isl_val_free(v); + return zero; + } + if (!isl_val_is_rat(v)) + isl_die(isl_qpolynomial_fold_get_ctx(fold), isl_error_invalid, + "expecting rational factor", goto error); + + fold = isl_qpolynomial_fold_cow(fold); + if (!fold) + goto error; + + if (isl_val_is_neg(v)) + fold->type = isl_fold_type_negate(fold->type); + for (i = 0; i < fold->n; ++i) { + fold->qp[i] = isl_qpolynomial_scale_val(fold->qp[i], + isl_val_copy(v)); + if (!fold->qp[i]) + goto error; + } + + isl_val_free(v); + return fold; +error: + isl_val_free(v); + isl_qpolynomial_fold_free(fold); + return NULL; +}