re PR middle-end/49958 (fold performs invalid association)
authorRichard Guenther <rguenther@suse.de>
Wed, 3 Aug 2011 13:33:28 +0000 (13:33 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 3 Aug 2011 13:33:28 +0000 (13:33 +0000)
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

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr49958.c [new file with mode: 0644]

index 72902da53dd8fcb2b840867b1ef720bfa2ad8824..886b360da4f7f78b5dea0be49168503320c0b0ac 100644 (file)
@@ -1,3 +1,10 @@
+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
index 8ad806f9eee82fb45f7f24dff79868faeffd2338..0cdf682ae386518d844f394b7f2c13638345c8c7 100644 (file)
@@ -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;
index e16b1a07d5626aa8cbd2642310c8e9bafc6ff323..1e70bbdfe06b55608a7a24c35ecbfe221db4fef2 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/gcc.dg/torture/pr49958.c b/gcc/testsuite/gcc.dg/torture/pr49958.c
new file mode 100644 (file)
index 0000000..de689bc
--- /dev/null
@@ -0,0 +1,11 @@
+/* { 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;
+}