re PR tree-optimization/27364 (VRP miscompiles some unsigned math)
PR tree-optimization/27364 * tree-vrp.c (vrp_int_const_binop): Fix detection of overflow from multiply expressions. * gcc.c-torture/execute/pr27364.c: New test. From-SVN: r113481
This commit is contained in:
parent
e6cbdf26b4
commit
26ef43017a
4 changed files with 47 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
|||
2006-05-02 Jeff Law <law@redhat.com>
|
||||
|
||||
PR tree-optimization/27364
|
||||
* tree-vrp.c (vrp_int_const_binop): Fix detection of overflow from
|
||||
multiply expressions.
|
||||
|
||||
2006-05-02 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* tree-flow-inline.h (op_iter_init_phiuse): Fixed typo.
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2006-05-02 Jeff Law <law@redhat.com>
|
||||
|
||||
PR tree-optimization/27364
|
||||
* gcc.c-torture/execute/pr27364.c: New test.
|
||||
|
||||
2006-05-02 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/27309
|
||||
|
|
13
gcc/testsuite/gcc.c-torture/execute/pr27364.c
Normal file
13
gcc/testsuite/gcc.c-torture/execute/pr27364.c
Normal file
|
@ -0,0 +1,13 @@
|
|||
int f(unsigned number_of_digits_to_use)
|
||||
{
|
||||
if (number_of_digits_to_use >1294)
|
||||
return 0;
|
||||
return (number_of_digits_to_use * 3321928 / 1000000 + 1) /16;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
if (f(11) != 2)
|
||||
__builtin_abort ();
|
||||
exit (0);
|
||||
}
|
|
@ -1191,17 +1191,39 @@ vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
|
|||
if (TYPE_UNSIGNED (TREE_TYPE (val1)))
|
||||
{
|
||||
int checkz = compare_values (res, val1);
|
||||
bool overflow = false;
|
||||
|
||||
/* Ensure that res = val1 [+*] val2 >= val1
|
||||
or that res = val1 - val2 <= val1. */
|
||||
if (((code == PLUS_EXPR || code == MULT_EXPR)
|
||||
if ((code == PLUS_EXPR
|
||||
&& !(checkz == 1 || checkz == 0))
|
||||
|| (code == MINUS_EXPR
|
||||
&& !(checkz == 0 || checkz == -1)))
|
||||
{
|
||||
overflow = true;
|
||||
}
|
||||
/* Checking for multiplication overflow is done by dividing the
|
||||
output of the multiplication by the first input of the
|
||||
multiplication. If the result of that division operation is
|
||||
not equal to the second input of the multiplication, then the
|
||||
multiplication overflowed. */
|
||||
else if (code == MULT_EXPR && !integer_zerop (val1))
|
||||
{
|
||||
tree tmp = int_const_binop (TRUNC_DIV_EXPR,
|
||||
TYPE_MAX_VALUE (TREE_TYPE (val1)),
|
||||
val1, 0);
|
||||
int check = compare_values (tmp, val2);
|
||||
|
||||
if (check != 0)
|
||||
overflow = true;
|
||||
}
|
||||
|
||||
if (overflow)
|
||||
{
|
||||
res = copy_node (res);
|
||||
TREE_OVERFLOW (res) = 1;
|
||||
}
|
||||
|
||||
}
|
||||
else if (TREE_OVERFLOW (res)
|
||||
&& !TREE_OVERFLOW (val1)
|
||||
|
|
Loading…
Add table
Reference in a new issue