aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/simplify.c
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2014-04-27 10:48:56 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2014-04-27 10:48:56 +0000
commitd01b2c21cf2d72c552afda7ed796c5584d11d9f3 (patch)
treedf8990f63d71efb8bb9c81ebabcbf81b51cbef68 /gcc/fortran/simplify.c
parent0a8dbb046ca7ee236301af33d742caf85d6611b9 (diff)
downloadgcc-d01b2c21cf2d72c552afda7ed796c5584d11d9f3.zip
gcc-d01b2c21cf2d72c552afda7ed796c5584d11d9f3.tar.gz
gcc-d01b2c21cf2d72c552afda7ed796c5584d11d9f3.tar.bz2
re PR fortran/59604 (Constant comparisons with -fno-range-check and int(z'...'))
2014-03-27 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/59604 PR fortran/58003 * gfortran.h (gfc_convert_mpz_to_signed): Add prototype. * arith.c (gfc_int2int): Convert number to signed if arithmetic overflow is not checked. * simplify.c (convert_mpz_to_unsigned): Only trigger assert for size if range checking is in force. (convert_mpz_to_signed): Make non-static, rename to (gfc_convert_mpz_to_signed). (simplify_dshift): Use gfc_convert_mpz_to_signed. (gfc_simplify_ibclr): Likewise. (gfc_simplify_ibits): Likewise. (gfc_simplify_ibset): Likewise. (simplify_shift): Likewise. (gfc_simplify_ishiftc): Likewise. (gfc_simplify_maskr): Likewise. (gfc_simplify_maskl): Likewise. 2014-03-27 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/59604 PR fortran/58003 * gfortran.dg/no_range_check_3.f90: New test. From-SVN: r209836
Diffstat (limited to 'gcc/fortran/simplify.c')
-rw-r--r--gcc/fortran/simplify.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 96d0f21..1b6cd5b 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -151,8 +151,10 @@ convert_mpz_to_unsigned (mpz_t x, int bitsize)
if (mpz_sgn (x) < 0)
{
- /* Confirm that no bits above the signed range are unset. */
- gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
+ /* Confirm that no bits above the signed range are unset if we
+ are doing range checking. */
+ if (gfc_option.flag_range_check != 0)
+ gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
mpz_init_set_ui (mask, 1);
mpz_mul_2exp (mask, mask, bitsize);
@@ -175,13 +177,15 @@ convert_mpz_to_unsigned (mpz_t x, int bitsize)
If the bitsize-1 bit is set, this is taken as a sign bit and
the number is converted to the corresponding negative number. */
-static void
-convert_mpz_to_signed (mpz_t x, int bitsize)
+void
+gfc_convert_mpz_to_signed (mpz_t x, int bitsize)
{
mpz_t mask;
- /* Confirm that no bits above the unsigned range are set. */
- gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
+ /* Confirm that no bits above the unsigned range are set if we are
+ doing range checking. */
+ if (gfc_option.flag_range_check != 0)
+ gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
if (mpz_tstbit (x, bitsize - 1) == 1)
{
@@ -1943,7 +1947,7 @@ simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg,
mpz_setbit (result->value.integer, shift + i);
/* Convert to a signed value. */
- convert_mpz_to_signed (result->value.integer, size);
+ gfc_convert_mpz_to_signed (result->value.integer, size);
return result;
}
@@ -2561,7 +2565,7 @@ gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
mpz_clrbit (result->value.integer, pos);
- convert_mpz_to_signed (result->value.integer,
+ gfc_convert_mpz_to_signed (result->value.integer,
gfc_integer_kinds[k].bit_size);
return result;
@@ -2619,7 +2623,7 @@ gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
free (bits);
- convert_mpz_to_signed (result->value.integer,
+ gfc_convert_mpz_to_signed (result->value.integer,
gfc_integer_kinds[k].bit_size);
return result;
@@ -2646,7 +2650,7 @@ gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
mpz_setbit (result->value.integer, pos);
- convert_mpz_to_signed (result->value.integer,
+ gfc_convert_mpz_to_signed (result->value.integer,
gfc_integer_kinds[k].bit_size);
return result;
@@ -3093,7 +3097,7 @@ simplify_shift (gfc_expr *e, gfc_expr *s, const char *name,
}
}
- convert_mpz_to_signed (result->value.integer, bitsize);
+ gfc_convert_mpz_to_signed (result->value.integer, bitsize);
free (bits);
return result;
@@ -3234,7 +3238,7 @@ gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
}
}
- convert_mpz_to_signed (result->value.integer, isize);
+ gfc_convert_mpz_to_signed (result->value.integer, isize);
free (bits);
return result;
@@ -3954,7 +3958,7 @@ gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
mpz_mul_2exp (result->value.integer, result->value.integer, arg);
mpz_sub_ui (result->value.integer, result->value.integer, 1);
- convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
+ gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
return result;
}
@@ -3990,7 +3994,7 @@ gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
mpz_sub (result->value.integer, z, result->value.integer);
mpz_clear (z);
- convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
+ gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
return result;
}