llvm-project/polly/lib/External/isl/isl_val.c

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

1633 lines
33 KiB
C
Raw Normal View History

/*
* Copyright 2013 Ecole Normale Superieure
*
* Use of this software is governed by the MIT license
*
* Written by Sven Verdoolaege,
* Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France
*/
#include <isl_int.h>
#include <isl_ctx_private.h>
#include <isl_val_private.h>
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
#undef EL_BASE
#define EL_BASE val
#include <isl_list_templ.c>
/* Allocate an isl_val object with indeterminate value.
*/
__isl_give isl_val *isl_val_alloc(isl_ctx *ctx)
{
isl_val *v;
v = isl_alloc_type(ctx, struct isl_val);
if (!v)
return NULL;
v->ctx = ctx;
isl_ctx_ref(ctx);
v->ref = 1;
isl_int_init(v->n);
isl_int_init(v->d);
return v;
}
/* Return a reference to an isl_val representing zero.
*/
__isl_give isl_val *isl_val_zero(isl_ctx *ctx)
{
return isl_val_int_from_si(ctx, 0);
}
/* Return a reference to an isl_val representing one.
*/
__isl_give isl_val *isl_val_one(isl_ctx *ctx)
{
return isl_val_int_from_si(ctx, 1);
}
/* Return a reference to an isl_val representing negative one.
*/
__isl_give isl_val *isl_val_negone(isl_ctx *ctx)
{
return isl_val_int_from_si(ctx, -1);
}
/* Return a reference to an isl_val representing NaN.
*/
__isl_give isl_val *isl_val_nan(isl_ctx *ctx)
{
isl_val *v;
v = isl_val_alloc(ctx);
if (!v)
return NULL;
isl_int_set_si(v->n, 0);
isl_int_set_si(v->d, 0);
return v;
}
/* Change "v" into a NaN.
*/
__isl_give isl_val *isl_val_set_nan(__isl_take isl_val *v)
{
if (!v)
return NULL;
if (isl_val_is_nan(v))
return v;
v = isl_val_cow(v);
if (!v)
return NULL;
isl_int_set_si(v->n, 0);
isl_int_set_si(v->d, 0);
return v;
}
/* Return a reference to an isl_val representing +infinity.
*/
__isl_give isl_val *isl_val_infty(isl_ctx *ctx)
{
isl_val *v;
v = isl_val_alloc(ctx);
if (!v)
return NULL;
isl_int_set_si(v->n, 1);
isl_int_set_si(v->d, 0);
return v;
}
/* Return a reference to an isl_val representing -infinity.
*/
__isl_give isl_val *isl_val_neginfty(isl_ctx *ctx)
{
isl_val *v;
v = isl_val_alloc(ctx);
if (!v)
return NULL;
isl_int_set_si(v->n, -1);
isl_int_set_si(v->d, 0);
return v;
}
/* Return a reference to an isl_val representing the integer "i".
*/
__isl_give isl_val *isl_val_int_from_si(isl_ctx *ctx, long i)
{
isl_val *v;
v = isl_val_alloc(ctx);
if (!v)
return NULL;
isl_int_set_si(v->n, i);
isl_int_set_si(v->d, 1);
return v;
}
/* Change the value of "v" to be equal to the integer "i".
*/
__isl_give isl_val *isl_val_set_si(__isl_take isl_val *v, long i)
{
if (!v)
return NULL;
if (isl_val_is_int(v) && isl_int_cmp_si(v->n, i) == 0)
return v;
v = isl_val_cow(v);
if (!v)
return NULL;
isl_int_set_si(v->n, i);
isl_int_set_si(v->d, 1);
return v;
}
/* Change the value of "v" to be equal to zero.
*/
__isl_give isl_val *isl_val_set_zero(__isl_take isl_val *v)
{
return isl_val_set_si(v, 0);
}
/* Return a reference to an isl_val representing the unsigned integer "u".
*/
__isl_give isl_val *isl_val_int_from_ui(isl_ctx *ctx, unsigned long u)
{
isl_val *v;
v = isl_val_alloc(ctx);
if (!v)
return NULL;
isl_int_set_ui(v->n, u);
isl_int_set_si(v->d, 1);
return v;
}
/* Return a reference to an isl_val representing the integer "n".
*/
__isl_give isl_val *isl_val_int_from_isl_int(isl_ctx *ctx, isl_int n)
{
isl_val *v;
v = isl_val_alloc(ctx);
if (!v)
return NULL;
isl_int_set(v->n, n);
isl_int_set_si(v->d, 1);
return v;
}
/* Return a reference to an isl_val representing the rational value "n"/"d".
* Normalizing the isl_val (if needed) is left to the caller.
*/
__isl_give isl_val *isl_val_rat_from_isl_int(isl_ctx *ctx,
isl_int n, isl_int d)
{
isl_val *v;
v = isl_val_alloc(ctx);
if (!v)
return NULL;
isl_int_set(v->n, n);
isl_int_set(v->d, d);
return v;
}
/* Return a new reference to "v".
*/
__isl_give isl_val *isl_val_copy(__isl_keep isl_val *v)
{
if (!v)
return NULL;
v->ref++;
return v;
}
/* Return a fresh copy of "val".
*/
__isl_give isl_val *isl_val_dup(__isl_keep isl_val *val)
{
isl_val *dup;
if (!val)
return NULL;
dup = isl_val_alloc(isl_val_get_ctx(val));
if (!dup)
return NULL;
isl_int_set(dup->n, val->n);
isl_int_set(dup->d, val->d);
return dup;
}
/* Return an isl_val that is equal to "val" and that has only
* a single reference.
*/
__isl_give isl_val *isl_val_cow(__isl_take isl_val *val)
{
if (!val)
return NULL;
if (val->ref == 1)
return val;
val->ref--;
return isl_val_dup(val);
}
/* Free "v" and return NULL.
*/
__isl_null isl_val *isl_val_free(__isl_take isl_val *v)
{
if (!v)
return NULL;
if (--v->ref > 0)
return NULL;
isl_ctx_deref(v->ctx);
isl_int_clear(v->n);
isl_int_clear(v->d);
free(v);
return NULL;
}
/* Extract the numerator of a rational value "v" as an integer.
*
* If "v" is not a rational value, then the result is undefined.
*/
long isl_val_get_num_si(__isl_keep isl_val *v)
{
if (!v)
return 0;
if (!isl_val_is_rat(v))
isl_die(isl_val_get_ctx(v), isl_error_invalid,
"expecting rational value", return 0);
if (!isl_int_fits_slong(v->n))
isl_die(isl_val_get_ctx(v), isl_error_invalid,
"numerator too large", return 0);
return isl_int_get_si(v->n);
}
/* Extract the numerator of a rational value "v" as an isl_int.
*
* If "v" is not a rational value, then the result is undefined.
*/
isl_stat isl_val_get_num_isl_int(__isl_keep isl_val *v, isl_int *n)
{
if (!v)
return isl_stat_error;
if (!isl_val_is_rat(v))
isl_die(isl_val_get_ctx(v), isl_error_invalid,
"expecting rational value", return isl_stat_error);
isl_int_set(*n, v->n);
return isl_stat_ok;
}
/* Extract the denominator of a rational value "v" as an integer.
*
* If "v" is not a rational value, then the result is undefined.
*/
long isl_val_get_den_si(__isl_keep isl_val *v)
{
if (!v)
return 0;
if (!isl_val_is_rat(v))
isl_die(isl_val_get_ctx(v), isl_error_invalid,
"expecting rational value", return 0);
if (!isl_int_fits_slong(v->d))
isl_die(isl_val_get_ctx(v), isl_error_invalid,
"denominator too large", return 0);
return isl_int_get_si(v->d);
}
/* Extract the denominator of a rational value "v" as an isl_val.
*
* If "v" is not a rational value, then the result is undefined.
*/
__isl_give isl_val *isl_val_get_den_val(__isl_keep isl_val *v)
{
if (!v)
return NULL;
if (!isl_val_is_rat(v))
isl_die(isl_val_get_ctx(v), isl_error_invalid,
"expecting rational value", return NULL);
return isl_val_int_from_isl_int(isl_val_get_ctx(v), v->d);
}
/* Return an approximation of "v" as a double.
*/
double isl_val_get_d(__isl_keep isl_val *v)
{
if (!v)
return 0;
if (!isl_val_is_rat(v))
isl_die(isl_val_get_ctx(v), isl_error_invalid,
"expecting rational value", return 0);
return isl_int_get_d(v->n) / isl_int_get_d(v->d);
}
/* Return the isl_ctx to which "val" belongs.
*/
isl_ctx *isl_val_get_ctx(__isl_keep isl_val *val)
{
return val ? val->ctx : NULL;
}
/* Return a hash value that digests "val".
*/
uint32_t isl_val_get_hash(__isl_keep isl_val *val)
{
uint32_t hash;
if (!val)
return 0;
hash = isl_hash_init();
hash = isl_int_hash(val->n, hash);
hash = isl_int_hash(val->d, hash);
return hash;
}
/* Normalize "v".
*
* In particular, make sure that the denominator of a rational value
* is positive and the numerator and denominator do not have any
* common divisors.
*
* This function should not be called by an external user
* since it will only be given normalized values.
*/
__isl_give isl_val *isl_val_normalize(__isl_take isl_val *v)
{
isl_ctx *ctx;
if (!v)
return NULL;
if (isl_val_is_int(v))
return v;
if (!isl_val_is_rat(v))
return v;
if (isl_int_is_neg(v->d)) {
isl_int_neg(v->d, v->d);
isl_int_neg(v->n, v->n);
}
ctx = isl_val_get_ctx(v);
isl_int_gcd(ctx->normalize_gcd, v->n, v->d);
if (isl_int_is_one(ctx->normalize_gcd))
return v;
isl_int_divexact(v->n, v->n, ctx->normalize_gcd);
isl_int_divexact(v->d, v->d, ctx->normalize_gcd);
return v;
}
/* Return the opposite of "v".
*/
__isl_give isl_val *isl_val_neg(__isl_take isl_val *v)
{
if (!v)
return NULL;
if (isl_val_is_nan(v))
return v;
if (isl_val_is_zero(v))
return v;
v = isl_val_cow(v);
if (!v)
return NULL;
isl_int_neg(v->n, v->n);
return v;
}
/* Return the inverse of "v".
*/
__isl_give isl_val *isl_val_inv(__isl_take isl_val *v)
{
if (!v)
return NULL;
if (isl_val_is_nan(v))
return v;
if (isl_val_is_zero(v)) {
isl_ctx *ctx = isl_val_get_ctx(v);
isl_val_free(v);
return isl_val_nan(ctx);
}
if (isl_val_is_infty(v) || isl_val_is_neginfty(v)) {
isl_ctx *ctx = isl_val_get_ctx(v);
isl_val_free(v);
return isl_val_zero(ctx);
}
v = isl_val_cow(v);
if (!v)
return NULL;
isl_int_swap(v->n, v->d);
return isl_val_normalize(v);
}
/* Return the absolute value of "v".
*/
__isl_give isl_val *isl_val_abs(__isl_take isl_val *v)
{
if (!v)
return NULL;
if (isl_val_is_nan(v))
return v;
if (isl_val_is_nonneg(v))
return v;
return isl_val_neg(v);
}
/* Return the "floor" (greatest integer part) of "v".
* That is, return the result of rounding towards -infinity.
*/
__isl_give isl_val *isl_val_floor(__isl_take isl_val *v)
{
if (!v)
return NULL;
if (isl_val_is_int(v))
return v;
if (!isl_val_is_rat(v))
return v;
v = isl_val_cow(v);
if (!v)
return NULL;
isl_int_fdiv_q(v->n, v->n, v->d);
isl_int_set_si(v->d, 1);
return v;
}
/* Return the "ceiling" of "v".
* That is, return the result of rounding towards +infinity.
*/
__isl_give isl_val *isl_val_ceil(__isl_take isl_val *v)
{
if (!v)
return NULL;
if (isl_val_is_int(v))
return v;
if (!isl_val_is_rat(v))
return v;
v = isl_val_cow(v);
if (!v)
return NULL;
isl_int_cdiv_q(v->n, v->n, v->d);
isl_int_set_si(v->d, 1);
return v;
}
/* Truncate "v".
* That is, return the result of rounding towards zero.
*/
__isl_give isl_val *isl_val_trunc(__isl_take isl_val *v)
{
if (!v)
return NULL;
if (isl_val_is_int(v))
return v;
if (!isl_val_is_rat(v))
return v;
v = isl_val_cow(v);
if (!v)
return NULL;
isl_int_tdiv_q(v->n, v->n, v->d);
isl_int_set_si(v->d, 1);
return v;
}
/* Return 2^v, where v is an integer (that is not too large).
*/
__isl_give isl_val *isl_val_pow2(__isl_take isl_val *v)
{
unsigned long exp;
int neg;
v = isl_val_cow(v);
if (!v)
return NULL;
if (!isl_val_is_int(v))
isl_die(isl_val_get_ctx(v), isl_error_invalid,
"can only compute integer powers",
return isl_val_free(v));
neg = isl_val_is_neg(v);
if (neg)
isl_int_neg(v->n, v->n);
if (!isl_int_fits_ulong(v->n))
isl_die(isl_val_get_ctx(v), isl_error_invalid,
"exponent too large", return isl_val_free(v));
exp = isl_int_get_ui(v->n);
if (neg) {
isl_int_mul_2exp(v->d, v->d, exp);
isl_int_set_si(v->n, 1);
} else {
isl_int_mul_2exp(v->n, v->d, exp);
}
return v;
}
/* This is an alternative name for the function above.
*/
__isl_give isl_val *isl_val_2exp(__isl_take isl_val *v)
{
return isl_val_pow2(v);
}
/* Return the minimum of "v1" and "v2".
*/
__isl_give isl_val *isl_val_min(__isl_take isl_val *v1, __isl_take isl_val *v2)
{
if (!v1 || !v2)
goto error;
if (isl_val_is_nan(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_nan(v2)) {
isl_val_free(v1);
return v2;
}
if (isl_val_le(v1, v2)) {
isl_val_free(v2);
return v1;
} else {
isl_val_free(v1);
return v2;
}
error:
isl_val_free(v1);
isl_val_free(v2);
return NULL;
}
/* Return the maximum of "v1" and "v2".
*/
__isl_give isl_val *isl_val_max(__isl_take isl_val *v1, __isl_take isl_val *v2)
{
if (!v1 || !v2)
goto error;
if (isl_val_is_nan(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_nan(v2)) {
isl_val_free(v1);
return v2;
}
if (isl_val_ge(v1, v2)) {
isl_val_free(v2);
return v1;
} else {
isl_val_free(v1);
return v2;
}
error:
isl_val_free(v1);
isl_val_free(v2);
return NULL;
}
/* Return the sum of "v1" and "v2".
*/
__isl_give isl_val *isl_val_add(__isl_take isl_val *v1, __isl_take isl_val *v2)
{
if (!v1 || !v2)
goto error;
if (isl_val_is_nan(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_nan(v2)) {
isl_val_free(v1);
return v2;
}
if ((isl_val_is_infty(v1) && isl_val_is_neginfty(v2)) ||
(isl_val_is_neginfty(v1) && isl_val_is_infty(v2))) {
isl_val_free(v2);
return isl_val_set_nan(v1);
}
if (isl_val_is_infty(v1) || isl_val_is_neginfty(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_infty(v2) || isl_val_is_neginfty(v2)) {
isl_val_free(v1);
return v2;
}
if (isl_val_is_zero(v1)) {
isl_val_free(v1);
return v2;
}
if (isl_val_is_zero(v2)) {
isl_val_free(v2);
return v1;
}
v1 = isl_val_cow(v1);
if (!v1)
goto error;
if (isl_val_is_int(v1) && isl_val_is_int(v2))
isl_int_add(v1->n, v1->n, v2->n);
else {
if (isl_int_eq(v1->d, v2->d))
isl_int_add(v1->n, v1->n, v2->n);
else {
isl_int_mul(v1->n, v1->n, v2->d);
isl_int_addmul(v1->n, v2->n, v1->d);
isl_int_mul(v1->d, v1->d, v2->d);
}
v1 = isl_val_normalize(v1);
}
isl_val_free(v2);
return v1;
error:
isl_val_free(v1);
isl_val_free(v2);
return NULL;
}
/* Return the sum of "v1" and "v2".
*/
__isl_give isl_val *isl_val_add_ui(__isl_take isl_val *v1, unsigned long v2)
{
if (!v1)
return NULL;
if (!isl_val_is_rat(v1))
return v1;
if (v2 == 0)
return v1;
v1 = isl_val_cow(v1);
if (!v1)
return NULL;
isl_int_addmul_ui(v1->n, v1->d, v2);
return v1;
}
/* Subtract "v2" from "v1".
*/
__isl_give isl_val *isl_val_sub(__isl_take isl_val *v1, __isl_take isl_val *v2)
{
if (!v1 || !v2)
goto error;
if (isl_val_is_nan(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_nan(v2)) {
isl_val_free(v1);
return v2;
}
if ((isl_val_is_infty(v1) && isl_val_is_infty(v2)) ||
(isl_val_is_neginfty(v1) && isl_val_is_neginfty(v2))) {
isl_val_free(v2);
return isl_val_set_nan(v1);
}
if (isl_val_is_infty(v1) || isl_val_is_neginfty(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_infty(v2) || isl_val_is_neginfty(v2)) {
isl_val_free(v1);
return isl_val_neg(v2);
}
if (isl_val_is_zero(v2)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_zero(v1)) {
isl_val_free(v1);
return isl_val_neg(v2);
}
v1 = isl_val_cow(v1);
if (!v1)
goto error;
if (isl_val_is_int(v1) && isl_val_is_int(v2))
isl_int_sub(v1->n, v1->n, v2->n);
else {
if (isl_int_eq(v1->d, v2->d))
isl_int_sub(v1->n, v1->n, v2->n);
else {
isl_int_mul(v1->n, v1->n, v2->d);
isl_int_submul(v1->n, v2->n, v1->d);
isl_int_mul(v1->d, v1->d, v2->d);
}
v1 = isl_val_normalize(v1);
}
isl_val_free(v2);
return v1;
error:
isl_val_free(v1);
isl_val_free(v2);
return NULL;
}
/* Subtract "v2" from "v1".
*/
__isl_give isl_val *isl_val_sub_ui(__isl_take isl_val *v1, unsigned long v2)
{
if (!v1)
return NULL;
if (!isl_val_is_rat(v1))
return v1;
if (v2 == 0)
return v1;
v1 = isl_val_cow(v1);
if (!v1)
return NULL;
isl_int_submul_ui(v1->n, v1->d, v2);
return v1;
}
/* Return the product of "v1" and "v2".
*/
__isl_give isl_val *isl_val_mul(__isl_take isl_val *v1, __isl_take isl_val *v2)
{
if (!v1 || !v2)
goto error;
if (isl_val_is_nan(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_nan(v2)) {
isl_val_free(v1);
return v2;
}
if ((!isl_val_is_rat(v1) && isl_val_is_zero(v2)) ||
(isl_val_is_zero(v1) && !isl_val_is_rat(v2))) {
isl_val_free(v2);
return isl_val_set_nan(v1);
}
if (isl_val_is_zero(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_zero(v2)) {
isl_val_free(v1);
return v2;
}
if (isl_val_is_infty(v1) || isl_val_is_neginfty(v1)) {
if (isl_val_is_neg(v2))
v1 = isl_val_neg(v1);
isl_val_free(v2);
return v1;
}
if (isl_val_is_infty(v2) || isl_val_is_neginfty(v2)) {
if (isl_val_is_neg(v1))
v2 = isl_val_neg(v2);
isl_val_free(v1);
return v2;
}
v1 = isl_val_cow(v1);
if (!v1)
goto error;
if (isl_val_is_int(v1) && isl_val_is_int(v2))
isl_int_mul(v1->n, v1->n, v2->n);
else {
isl_int_mul(v1->n, v1->n, v2->n);
isl_int_mul(v1->d, v1->d, v2->d);
v1 = isl_val_normalize(v1);
}
isl_val_free(v2);
return v1;
error:
isl_val_free(v1);
isl_val_free(v2);
return NULL;
}
/* Return the product of "v1" and "v2".
*
* This is a private copy of isl_val_mul for use in the generic
* isl_multi_*_scale_val instantiated for isl_val.
*/
__isl_give isl_val *isl_val_scale_val(__isl_take isl_val *v1,
__isl_take isl_val *v2)
{
return isl_val_mul(v1, v2);
}
/* Return the product of "v1" and "v2".
*/
__isl_give isl_val *isl_val_mul_ui(__isl_take isl_val *v1, unsigned long v2)
{
if (!v1)
return NULL;
if (isl_val_is_nan(v1))
return v1;
if (!isl_val_is_rat(v1)) {
if (v2 == 0)
v1 = isl_val_set_nan(v1);
return v1;
}
if (v2 == 1)
return v1;
v1 = isl_val_cow(v1);
if (!v1)
return NULL;
isl_int_mul_ui(v1->n, v1->n, v2);
return isl_val_normalize(v1);
}
/* Divide "v1" by "v2".
*/
__isl_give isl_val *isl_val_div(__isl_take isl_val *v1, __isl_take isl_val *v2)
{
if (!v1 || !v2)
goto error;
if (isl_val_is_nan(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_nan(v2)) {
isl_val_free(v1);
return v2;
}
if (isl_val_is_zero(v2) ||
(!isl_val_is_rat(v1) && !isl_val_is_rat(v2))) {
isl_val_free(v2);
return isl_val_set_nan(v1);
}
if (isl_val_is_zero(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_infty(v1) || isl_val_is_neginfty(v1)) {
if (isl_val_is_neg(v2))
v1 = isl_val_neg(v1);
isl_val_free(v2);
return v1;
}
if (isl_val_is_infty(v2) || isl_val_is_neginfty(v2)) {
isl_val_free(v2);
return isl_val_set_zero(v1);
}
v1 = isl_val_cow(v1);
if (!v1)
goto error;
if (isl_val_is_int(v2)) {
isl_int_mul(v1->d, v1->d, v2->n);
v1 = isl_val_normalize(v1);
} else {
isl_int_mul(v1->d, v1->d, v2->n);
isl_int_mul(v1->n, v1->n, v2->d);
v1 = isl_val_normalize(v1);
}
isl_val_free(v2);
return v1;
error:
isl_val_free(v1);
isl_val_free(v2);
return NULL;
}
/* Divide "v1" by "v2".
*/
__isl_give isl_val *isl_val_div_ui(__isl_take isl_val *v1, unsigned long v2)
{
if (!v1)
return NULL;
if (isl_val_is_nan(v1))
return v1;
if (v2 == 0)
return isl_val_set_nan(v1);
if (v2 == 1)
return v1;
if (isl_val_is_zero(v1))
return v1;
if (isl_val_is_infty(v1) || isl_val_is_neginfty(v1))
return v1;
v1 = isl_val_cow(v1);
if (!v1)
return NULL;
isl_int_mul_ui(v1->d, v1->d, v2);
return isl_val_normalize(v1);
}
/* Divide "v1" by "v2".
*
* This is a private copy of isl_val_div for use in the generic
* isl_multi_*_scale_down_val instantiated for isl_val.
*/
__isl_give isl_val *isl_val_scale_down_val(__isl_take isl_val *v1,
__isl_take isl_val *v2)
{
return isl_val_div(v1, v2);
}
/* Given two integer values "v1" and "v2", check if "v1" is divisible by "v2".
*/
isl_bool isl_val_is_divisible_by(__isl_keep isl_val *v1, __isl_keep isl_val *v2)
{
if (!v1 || !v2)
return isl_bool_error;
if (!isl_val_is_int(v1) || !isl_val_is_int(v2))
isl_die(isl_val_get_ctx(v1), isl_error_invalid,
"expecting two integers", return isl_bool_error);
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_divisible_by(v1->n, v2->n));
}
/* Given two integer values "v1" and "v2", return the residue of "v1"
* modulo "v2".
*/
__isl_give isl_val *isl_val_mod(__isl_take isl_val *v1, __isl_take isl_val *v2)
{
if (!v1 || !v2)
goto error;
if (!isl_val_is_int(v1) || !isl_val_is_int(v2))
isl_die(isl_val_get_ctx(v1), isl_error_invalid,
"expecting two integers", goto error);
if (isl_val_is_nonneg(v1) && isl_val_lt(v1, v2)) {
isl_val_free(v2);
return v1;
}
v1 = isl_val_cow(v1);
if (!v1)
goto error;
isl_int_fdiv_r(v1->n, v1->n, v2->n);
isl_val_free(v2);
return v1;
error:
isl_val_free(v1);
isl_val_free(v2);
return NULL;
}
/* Given two integer values "v1" and "v2", return the residue of "v1"
* modulo "v2".
*
* This is a private copy of isl_val_mod for use in the generic
* isl_multi_*_mod_multi_val instantiated for isl_val.
*/
__isl_give isl_val *isl_val_mod_val(__isl_take isl_val *v1,
__isl_take isl_val *v2)
{
return isl_val_mod(v1, v2);
}
/* Given two integer values, return their greatest common divisor.
*/
__isl_give isl_val *isl_val_gcd(__isl_take isl_val *v1, __isl_take isl_val *v2)
{
if (!v1 || !v2)
goto error;
if (!isl_val_is_int(v1) || !isl_val_is_int(v2))
isl_die(isl_val_get_ctx(v1), isl_error_invalid,
"expecting two integers", goto error);
if (isl_val_eq(v1, v2)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_one(v1)) {
isl_val_free(v2);
return v1;
}
if (isl_val_is_one(v2)) {
isl_val_free(v1);
return v2;
}
v1 = isl_val_cow(v1);
if (!v1)
goto error;
isl_int_gcd(v1->n, v1->n, v2->n);
isl_val_free(v2);
return v1;
error:
isl_val_free(v1);
isl_val_free(v2);
return NULL;
}
/* Compute x, y and g such that g = gcd(a,b) and a*x+b*y = g.
*/
static void isl_int_gcdext(isl_int *g, isl_int *x, isl_int *y,
isl_int a, isl_int b)
{
isl_int d, tmp;
isl_int a_copy, b_copy;
isl_int_init(a_copy);
isl_int_init(b_copy);
isl_int_init(d);
isl_int_init(tmp);
isl_int_set(a_copy, a);
isl_int_set(b_copy, b);
isl_int_abs(*g, a_copy);
isl_int_abs(d, b_copy);
isl_int_set_si(*x, 1);
isl_int_set_si(*y, 0);
while (isl_int_is_pos(d)) {
isl_int_fdiv_q(tmp, *g, d);
isl_int_submul(*x, tmp, *y);
isl_int_submul(*g, tmp, d);
isl_int_swap(*g, d);
isl_int_swap(*x, *y);
}
if (isl_int_is_zero(a_copy))
isl_int_set_si(*x, 0);
else if (isl_int_is_neg(a_copy))
isl_int_neg(*x, *x);
if (isl_int_is_zero(b_copy))
isl_int_set_si(*y, 0);
else {
isl_int_mul(tmp, a_copy, *x);
isl_int_sub(tmp, *g, tmp);
isl_int_divexact(*y, tmp, b_copy);
}
isl_int_clear(d);
isl_int_clear(tmp);
isl_int_clear(a_copy);
isl_int_clear(b_copy);
}
/* Given two integer values v1 and v2, return their greatest common divisor g,
* as well as two integers x and y such that x * v1 + y * v2 = g.
*/
__isl_give isl_val *isl_val_gcdext(__isl_take isl_val *v1,
__isl_take isl_val *v2, __isl_give isl_val **x, __isl_give isl_val **y)
{
isl_ctx *ctx;
isl_val *a = NULL, *b = NULL;
if (!x && !y)
return isl_val_gcd(v1, v2);
if (!v1 || !v2)
goto error;
ctx = isl_val_get_ctx(v1);
if (!isl_val_is_int(v1) || !isl_val_is_int(v2))
isl_die(ctx, isl_error_invalid,
"expecting two integers", goto error);
v1 = isl_val_cow(v1);
a = isl_val_alloc(ctx);
b = isl_val_alloc(ctx);
if (!v1 || !a || !b)
goto error;
isl_int_gcdext(&v1->n, &a->n, &b->n, v1->n, v2->n);
if (x) {
isl_int_set_si(a->d, 1);
*x = a;
} else
isl_val_free(a);
if (y) {
isl_int_set_si(b->d, 1);
*y = b;
} else
isl_val_free(b);
isl_val_free(v2);
return v1;
error:
isl_val_free(v1);
isl_val_free(v2);
isl_val_free(a);
isl_val_free(b);
if (x)
*x = NULL;
if (y)
*y = NULL;
return NULL;
}
/* Does "v" represent an integer value?
*/
isl_bool isl_val_is_int(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_one(v->d));
}
/* Does "v" represent a rational value?
*/
isl_bool isl_val_is_rat(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(!isl_int_is_zero(v->d));
}
/* Does "v" represent NaN?
*/
isl_bool isl_val_is_nan(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_zero(v->n) && isl_int_is_zero(v->d));
}
/* Does "v" represent +infinity?
*/
isl_bool isl_val_is_infty(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_pos(v->n) && isl_int_is_zero(v->d));
}
/* Does "v" represent -infinity?
*/
isl_bool isl_val_is_neginfty(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_neg(v->n) && isl_int_is_zero(v->d));
}
/* Does "v" represent the integer zero?
*/
isl_bool isl_val_is_zero(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_zero(v->n) && !isl_int_is_zero(v->d));
}
/* Does "v" represent the integer one?
*/
isl_bool isl_val_is_one(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
if (isl_val_is_nan(v))
return isl_bool_false;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_eq(v->n, v->d));
}
/* Does "v" represent the integer negative one?
*/
isl_bool isl_val_is_negone(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_neg(v->n) && isl_int_abs_eq(v->n, v->d));
}
/* Is "v" (strictly) positive?
*/
isl_bool isl_val_is_pos(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_pos(v->n));
}
/* Is "v" (strictly) negative?
*/
isl_bool isl_val_is_neg(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_neg(v->n));
}
/* Is "v" non-negative?
*/
isl_bool isl_val_is_nonneg(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
if (isl_val_is_nan(v))
return isl_bool_false;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_nonneg(v->n));
}
/* Is "v" non-positive?
*/
isl_bool isl_val_is_nonpos(__isl_keep isl_val *v)
{
if (!v)
return isl_bool_error;
if (isl_val_is_nan(v))
return isl_bool_false;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_is_nonpos(v->n));
}
/* Return the sign of "v".
*
* The sign of NaN is undefined.
*/
int isl_val_sgn(__isl_keep isl_val *v)
{
if (!v)
return 0;
if (isl_val_is_zero(v))
return 0;
if (isl_val_is_pos(v))
return 1;
return -1;
}
/* Is "v1" (strictly) less than "v2"?
*/
isl_bool isl_val_lt(__isl_keep isl_val *v1, __isl_keep isl_val *v2)
{
isl_int t;
isl_bool lt;
if (!v1 || !v2)
return isl_bool_error;
if (isl_val_is_int(v1) && isl_val_is_int(v2))
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_lt(v1->n, v2->n));
if (isl_val_is_nan(v1) || isl_val_is_nan(v2))
return isl_bool_false;
if (isl_val_eq(v1, v2))
return isl_bool_false;
if (isl_val_is_infty(v2))
return isl_bool_true;
if (isl_val_is_infty(v1))
return isl_bool_false;
if (isl_val_is_neginfty(v1))
return isl_bool_true;
if (isl_val_is_neginfty(v2))
return isl_bool_false;
isl_int_init(t);
isl_int_mul(t, v1->n, v2->d);
isl_int_submul(t, v2->n, v1->d);
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
lt = isl_bool_ok(isl_int_is_neg(t));
isl_int_clear(t);
return lt;
}
/* Is "v1" (strictly) greater than "v2"?
*/
isl_bool isl_val_gt(__isl_keep isl_val *v1, __isl_keep isl_val *v2)
{
return isl_val_lt(v2, v1);
}
/* Is "v" (strictly) greater than "i"?
*/
isl_bool isl_val_gt_si(__isl_keep isl_val *v, long i)
{
isl_val *vi;
isl_bool res;
if (!v)
return isl_bool_error;
if (isl_val_is_int(v))
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_cmp_si(v->n, i) > 0);
if (isl_val_is_nan(v))
return isl_bool_false;
if (isl_val_is_infty(v))
return isl_bool_true;
if (isl_val_is_neginfty(v))
return isl_bool_false;
vi = isl_val_int_from_si(isl_val_get_ctx(v), i);
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
res = isl_bool_ok(isl_val_gt(v, vi));
isl_val_free(vi);
return res;
}
/* Is "v1" less than or equal to "v2"?
*/
isl_bool isl_val_le(__isl_keep isl_val *v1, __isl_keep isl_val *v2)
{
isl_int t;
isl_bool le;
if (!v1 || !v2)
return isl_bool_error;
if (isl_val_is_int(v1) && isl_val_is_int(v2))
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_le(v1->n, v2->n));
if (isl_val_is_nan(v1) || isl_val_is_nan(v2))
return isl_bool_false;
if (isl_val_eq(v1, v2))
return isl_bool_true;
if (isl_val_is_infty(v2))
return isl_bool_true;
if (isl_val_is_infty(v1))
return isl_bool_false;
if (isl_val_is_neginfty(v1))
return isl_bool_true;
if (isl_val_is_neginfty(v2))
return isl_bool_false;
isl_int_init(t);
isl_int_mul(t, v1->n, v2->d);
isl_int_submul(t, v2->n, v1->d);
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
le = isl_bool_ok(isl_int_is_nonpos(t));
isl_int_clear(t);
return le;
}
/* Is "v1" greater than or equal to "v2"?
*/
isl_bool isl_val_ge(__isl_keep isl_val *v1, __isl_keep isl_val *v2)
{
return isl_val_le(v2, v1);
}
/* How does "v" compare to "i"?
*
* Return 1 if v is greater, -1 if v is smaller and 0 if v is equal to i.
*
* If v is NaN (or NULL), then the result is undefined.
*/
int isl_val_cmp_si(__isl_keep isl_val *v, long i)
{
isl_int t;
int cmp;
if (!v)
return 0;
if (isl_val_is_int(v))
return isl_int_cmp_si(v->n, i);
if (isl_val_is_nan(v))
return 0;
if (isl_val_is_infty(v))
return 1;
if (isl_val_is_neginfty(v))
return -1;
isl_int_init(t);
isl_int_mul_si(t, v->d, i);
isl_int_sub(t, v->n, t);
cmp = isl_int_sgn(t);
isl_int_clear(t);
return cmp;
}
/* Is "v1" equal to "v2"?
*/
isl_bool isl_val_eq(__isl_keep isl_val *v1, __isl_keep isl_val *v2)
{
if (!v1 || !v2)
return isl_bool_error;
if (isl_val_is_nan(v1) || isl_val_is_nan(v2))
return isl_bool_false;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_eq(v1->n, v2->n) &&
isl_int_eq(v1->d, v2->d));
}
/* Is "v1" equal to "v2" in absolute value?
*/
isl_bool isl_val_abs_eq(__isl_keep isl_val *v1, __isl_keep isl_val *v2)
{
if (!v1 || !v2)
return isl_bool_error;
if (isl_val_is_nan(v1) || isl_val_is_nan(v2))
return isl_bool_false;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_abs_eq(v1->n, v2->n) &&
isl_int_eq(v1->d, v2->d));
}
/* Is "v1" different from "v2"?
*/
isl_bool isl_val_ne(__isl_keep isl_val *v1, __isl_keep isl_val *v2)
{
if (!v1 || !v2)
return isl_bool_error;
if (isl_val_is_nan(v1) || isl_val_is_nan(v2))
return isl_bool_false;
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
return isl_bool_ok(isl_int_ne(v1->n, v2->n) ||
isl_int_ne(v1->d, v2->d));
}
/* Print a textual representation of "v" onto "p".
*/
__isl_give isl_printer *isl_printer_print_val(__isl_take isl_printer *p,
__isl_keep isl_val *v)
{
int neg;
if (!p || !v)
return isl_printer_free(p);
neg = isl_int_is_neg(v->n);
if (neg) {
p = isl_printer_print_str(p, "-");
isl_int_neg(v->n, v->n);
}
if (isl_int_is_zero(v->d)) {
int sgn = isl_int_sgn(v->n);
p = isl_printer_print_str(p, sgn < 0 ? "-infty" :
sgn == 0 ? "NaN" : "infty");
} else
p = isl_printer_print_isl_int(p, v->n);
if (neg)
isl_int_neg(v->n, v->n);
if (!isl_int_is_zero(v->d) && !isl_int_is_one(v->d)) {
p = isl_printer_print_str(p, "/");
p = isl_printer_print_isl_int(p, v->d);
}
return p;
}
/* Is "val1" (obviously) equal to "val2"?
*
* This is a private copy of isl_val_eq for use in the generic
* isl_multi_*_plain_is_equal instantiated for isl_val.
*/
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
isl_bool isl_val_plain_is_equal(__isl_keep isl_val *val1,
__isl_keep isl_val *val2)
{
return isl_val_eq(val1, val2);
}
/* Does "v" have any non-zero coefficients
* for any dimension in the given range?
*
* This function is only meant to be used in the generic isl_multi_*
* functions which have to deal with base objects that have an associated
* space. Since an isl_val does not have any coefficients, this function
* always returns isl_bool_false.
*/
isl_bool isl_val_involves_dims(__isl_keep isl_val *v, enum isl_dim_type type,
unsigned first, unsigned n)
{
if (!v)
return isl_bool_error;
return isl_bool_false;
}
/* Insert "n" dimensions of type "type" at position "first".
*
* This function is only meant to be used in the generic isl_multi_*
* functions which have to deal with base objects that have an associated
* space. Since an isl_val does not have an associated space, this function
* does not do anything.
*/
__isl_give isl_val *isl_val_insert_dims(__isl_take isl_val *v,
enum isl_dim_type type, unsigned first, unsigned n)
{
return v;
}
/* Change the name of the dimension of type "type" at position "pos" to "s".
*
* This function is only meant to be used in the generic isl_multi_*
* functions which have to deal with base objects that have an associated
* space. Since an isl_val does not have an associated space, this function
* does not do anything.
*/
__isl_give isl_val *isl_val_set_dim_name(__isl_take isl_val *v,
enum isl_dim_type type, unsigned pos, const char *s)
{
return v;
}
/* Return an isl_val that is zero on "ls".
*
* This function is only meant to be used in the generic isl_multi_*
* functions which have to deal with base objects that have an associated
* space. Since an isl_val does not have an associated space, this function
* simply returns a zero isl_val in the same context as "ls".
*/
__isl_give isl_val *isl_val_zero_on_domain(__isl_take isl_local_space *ls)
{
isl_ctx *ctx;
if (!ls)
return NULL;
ctx = isl_local_space_get_ctx(ls);
isl_local_space_free(ls);
return isl_val_zero(ctx);
}
#define isl_val_involves_nan isl_val_is_nan
#undef BASE
#define BASE val
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
#include <isl_multi_no_domain_templ.c>
#include <isl_multi_no_explicit_domain.c>
#include <isl_multi_templ.c>
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
#include <isl_multi_arith_templ.c>
#include <isl_multi_dim_id_templ.c>
#include <isl_multi_dims.c>
[Polly] Update ISL to isl-0.22.1-87-gfee05a13. The primary motivation is to fix an assertion failure in isl_basic_map_alloc_equality: isl_assert(ctx, room_for_con(bmap, 1), return -1); Although the assertion does not occur anymore, I could not identify which of ISL's commits fixed it. Compared to the previous ISL version, Polly requires some changes for this update * Since ISL commit 20d3574 "perform parameter alignment by modifying both arguments to function" isl_*_gist_* and similar functions do not always align the paramter list anymore. This caused the parameter lists in JScop files to become out-of-sync. Since many regression tests use JScop files with a fixed parameter list and order, we explicitly call align_params to ensure a predictable parameter list. * ISL changed some return types to isl_size, a typedef of (signed) int. This caused some issues where the return type was unsigned int before: - No overload for std::max(unsigned,isl_size) - It cause additional 'mixed signed/unsigned comparison' warnings. Since they do not break compilation, and sizes larger than 2^31 were never supported, I am going to fix it separately. * With the change to isl_size, commit 57d547 "isl_*_list_size: return isl_size" also changed the return value in case of an error from 0 to -1. This caused undefined looping over isl_iterator since the 'end iterator' got index -1, never reached from the 'begin iterator' with index 0. * Some internal changes in ISL caused the number of operations to increase when determining access ranges to determine aliasing overlaps. In one test, this caused exceeding the default limit of 800000. The operations-limit was disabled for this test.
2020-02-11 04:51:33 +08:00
#include <isl_multi_nan_templ.c>
#include <isl_multi_product_templ.c>
#include <isl_multi_splice_templ.c>
#include <isl_multi_tuple_id_templ.c>
#include <isl_multi_zero_templ.c>
/* Does "mv" consist of only zeros?
*/
isl_bool isl_multi_val_is_zero(__isl_keep isl_multi_val *mv)
{
return isl_multi_val_every(mv, &isl_val_is_zero);
}
/* Apply "fn" to each of the elements of "mv" with as second argument "v".
*/
static __isl_give isl_multi_val *isl_multi_val_fn_val(
__isl_take isl_multi_val *mv,
__isl_give isl_val *(*fn)(__isl_take isl_val *v1,
__isl_take isl_val *v2),
__isl_take isl_val *v)
{
int i;
mv = isl_multi_val_cow(mv);
if (!mv || !v)
goto error;
for (i = 0; i < mv->n; ++i) {
mv->u.p[i] = fn(mv->u.p[i], isl_val_copy(v));
if (!mv->u.p[i])
goto error;
}
isl_val_free(v);
return mv;
error:
isl_val_free(v);
isl_multi_val_free(mv);
return NULL;
}
/* Add "v" to each of the elements of "mv".
*/
__isl_give isl_multi_val *isl_multi_val_add_val(__isl_take isl_multi_val *mv,
__isl_take isl_val *v)
{
if (!v)
return isl_multi_val_free(mv);
if (isl_val_is_zero(v)) {
isl_val_free(v);
return mv;
}
return isl_multi_val_fn_val(mv, &isl_val_add, v);
}
/* Reduce the elements of "mv" modulo "v".
*/
__isl_give isl_multi_val *isl_multi_val_mod_val(__isl_take isl_multi_val *mv,
__isl_take isl_val *v)
{
return isl_multi_val_fn_val(mv, &isl_val_mod, v);
}