Commit 26ef4301 by Jeff Law Committed by Jeff Law

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
parent e6cbdf26
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.
......
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
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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment