re PR middle-end/36077 (Expressions result is wrong)

2008-04-29  Richard Guenther  <rguenther@suse.de>

	PR middle-end/36077
	* fold-const.c (extract_muldiv_1): In combining division constants
	make sure to never overflow.

	* gcc.c-torture/execute/pr36077.c: New testcase.

From-SVN: r134792
This commit is contained in:
Richard Guenther 2008-04-29 13:52:53 +00:00 committed by Richard Biener
parent a170f0affe
commit 81ad578ea1
4 changed files with 31 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2008-04-29 Richard Guenther <rguenther@suse.de>
PR middle-end/36077
* fold-const.c (extract_muldiv_1): In combining division constants
make sure to never overflow.
2008-04-29 Nick Clifton <nickc@redhat.com>
* doc/tm.texi (RETURN_ADDR_RTX): Fix typo.

View File

@ -5953,8 +5953,13 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
/* If these are the same operation types, we can associate them
assuming no overflow. */
if (tcode == code
&& 0 != (t1 = const_binop (MULT_EXPR, fold_convert (ctype, op1),
fold_convert (ctype, c), 0))
&& 0 != (t1 = int_const_binop (MULT_EXPR, fold_convert (ctype, op1),
fold_convert (ctype, c), 1))
&& 0 != (t1 = force_fit_type_double (ctype, TREE_INT_CST_LOW (t1),
TREE_INT_CST_HIGH (t1),
(TYPE_UNSIGNED (ctype)
&& tcode != MULT_EXPR) ? -1 : 1,
TREE_OVERFLOW (t1)))
&& !TREE_OVERFLOW (t1))
return fold_build2 (tcode, ctype, fold_convert (ctype, op0), t1);

View File

@ -1,3 +1,8 @@
2008-04-29 Richard Guenther <rguenther@suse.de>
PR middle-end/36077
* gcc.c-torture/execute/pr36077.c: New testcase.
2008-04-29 Kai Tietz <kai.tietz@onevision.com>
* testsuite/gcc.dg/sync-2.c: Set dg-options "-ansi".

View File

@ -0,0 +1,13 @@
extern void abort (void);
unsigned int test (unsigned int x)
{
return x / 0x80000001U / 0x00000002U;
}
int main()
{
if (test(2) != 0)
abort ();
return 0;
}