Commit a130fb24 by Richard Guenther Committed by Richard Biener

re PR middle-end/49958 (fold performs invalid association)

2011-08-03  Richard Guenther  <rguenther@suse.de>

	PR middle-end/49958
	* fold-const.c (fold_binary_loc): Only associate
	(+ (+ (* a b) c) (* d e)) as (+ (+ (* a b) (* d e)) c) if
	overflow wraps.

        * gcc.dg/torture/pr49958.c: New testcase.

From-SVN: r177270
parent f77b022b
2011-08-03 Richard Guenther <rguenther@suse.de>
PR middle-end/49958
* fold-const.c (fold_binary_loc): Only associate
(+ (+ (* a b) c) (* d e)) as (+ (+ (* a b) (* d e)) c) if
overflow wraps.
2011-08-03 Alan Modra <amodra@gmail.com>
PR rtl-optimization/49941
......
......@@ -9711,12 +9711,13 @@ fold_binary_loc (location_t loc,
/* Reassociate (plus (plus (mult) (foo)) (mult)) as
(plus (plus (mult) (mult)) (foo)) so that we can
take advantage of the factoring cases below. */
if (((TREE_CODE (arg0) == PLUS_EXPR
|| TREE_CODE (arg0) == MINUS_EXPR)
&& TREE_CODE (arg1) == MULT_EXPR)
|| ((TREE_CODE (arg1) == PLUS_EXPR
|| TREE_CODE (arg1) == MINUS_EXPR)
&& TREE_CODE (arg0) == MULT_EXPR))
if (TYPE_OVERFLOW_WRAPS (type)
&& (((TREE_CODE (arg0) == PLUS_EXPR
|| TREE_CODE (arg0) == MINUS_EXPR)
&& TREE_CODE (arg1) == MULT_EXPR)
|| ((TREE_CODE (arg1) == PLUS_EXPR
|| TREE_CODE (arg1) == MINUS_EXPR)
&& TREE_CODE (arg0) == MULT_EXPR)))
{
tree parg0, parg1, parg, marg;
enum tree_code pcode;
......
2011-08-03 Richard Guenther <rguenther@suse.de>
PR middle-end/49958
* gcc.dg/torture/pr49958.c: New testcase.
2011-08-03 Richard Guenther <rguenther@suse.de>
PR tree-optimization/49938
* g++.dg/torture/pr49938.C: New testcase.
......
/* { dg-do run } */
/* { dg-options "-fstrict-overflow" } */
extern void abort (void);
int foo (int i, int j, int o, int m) { return i*o + 1 + j*m > 1; }
int main()
{
if (foo (- __INT_MAX__ - 1, -1, 1, 1))
abort ();
return 0;
}
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