Fix PR/46316
From-SVN: r166469
This commit is contained in:
parent
d5214afa12
commit
b3a50850b1
6 changed files with 56 additions and 4 deletions
|
@ -1,3 +1,11 @@
|
|||
2010-11-08 Xinliang David Li <davidxl@google.com>
|
||||
|
||||
PR/46316
|
||||
* tree-vrp.c (adjust_range_with_scev): Check double_int
|
||||
overflow.
|
||||
* double-int.h (double_int_mul_with_sign): New function.
|
||||
* double-int.c (double_int_mul_with_sign): New function.
|
||||
|
||||
2010-11-08 Paul Koning <ni1d@arrl.net>
|
||||
|
||||
* config/pdp11/pdp11.md (lshrsi3, lshrhi3): Fix wrong code.
|
||||
|
|
|
@ -718,6 +718,19 @@ double_int_mul (double_int a, double_int b)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Returns A * B. If the operation overflows according to UNSIGNED_P,
|
||||
*OVERFLOW is set to nonzero. */
|
||||
|
||||
double_int
|
||||
double_int_mul_with_sign (double_int a, double_int b,
|
||||
bool unsigned_p, int *overflow)
|
||||
{
|
||||
double_int ret;
|
||||
*overflow = mul_double_with_sign (a.low, a.high, b.low, b.high,
|
||||
&ret.low, &ret.high, unsigned_p);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Returns A + B. */
|
||||
|
||||
double_int
|
||||
|
|
|
@ -132,6 +132,7 @@ double_int_fits_in_uhwi_p (double_int cst)
|
|||
2 * HOST_BITS_PER_WIDE_INT bits. */
|
||||
|
||||
double_int double_int_mul (double_int, double_int);
|
||||
double_int double_int_mul_with_sign (double_int, double_int, bool, int *);
|
||||
double_int double_int_add (double_int, double_int);
|
||||
double_int double_int_sub (double_int, double_int);
|
||||
double_int double_int_neg (double_int);
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-11-08 Xinliang David Li <davidxl@google.com>
|
||||
|
||||
PR/46316
|
||||
* gcc.dg/tree-ssa/pr46316.c: New test.
|
||||
|
||||
2010-11-08 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/46344
|
||||
|
|
20
gcc/testsuite/gcc.dg/tree-ssa/pr46316.c
Normal file
20
gcc/testsuite/gcc.dg/tree-ssa/pr46316.c
Normal file
|
@ -0,0 +1,20 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
long long __attribute__((noinline,noclone))
|
||||
foo (long long t)
|
||||
{
|
||||
while (t > -4)
|
||||
t -= 2;
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
if (foo (0) != -4)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
|
@ -3403,13 +3403,18 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop,
|
|||
{
|
||||
value_range_t maxvr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
|
||||
double_int dtmp;
|
||||
dtmp = double_int_mul (tree_to_double_int (step),
|
||||
double_int_sub (loop->nb_iterations_upper_bound,
|
||||
double_int_one));
|
||||
bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (step));
|
||||
int overflow = 0;
|
||||
|
||||
dtmp = double_int_mul_with_sign (tree_to_double_int (step),
|
||||
double_int_sub (
|
||||
loop->nb_iterations_upper_bound,
|
||||
double_int_one),
|
||||
unsigned_p, &overflow);
|
||||
tem = double_int_to_tree (TREE_TYPE (init), dtmp);
|
||||
/* If the multiplication overflowed we can't do a meaningful
|
||||
adjustment. */
|
||||
if (double_int_equal_p (dtmp, tree_to_double_int (tem)))
|
||||
if (!overflow && double_int_equal_p (dtmp, tree_to_double_int (tem)))
|
||||
{
|
||||
extract_range_from_binary_expr (&maxvr, PLUS_EXPR,
|
||||
TREE_TYPE (init), init, tem);
|
||||
|
|
Loading…
Add table
Reference in a new issue