tree-ssa-reassoc.c (should_break_up_subtract): Also break up if the use is in USE...
authorRichard Biener <rguenther@suse.de>
Thu, 3 Aug 2017 14:08:15 +0000 (14:08 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 3 Aug 2017 14:08:15 +0000 (14:08 +0000)
2017-08-03  Richard Biener  <rguenther@suse.de>

* tree-ssa-reassoc.c (should_break_up_subtract): Also break
up if the use is in USE - X.

* gcc.dg/tree-ssa/reassoc-23.c: Adjust to fool early folding
and CSE.

From-SVN: r250855

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/reassoc-23.c
gcc/tree-ssa-reassoc.c

index 9e3a8aac28d1e3f4e306ee42bfbf55c40beedb85..3febddcc051ee596978bb41c7612d345a642b8c1 100644 (file)
@@ -1,3 +1,8 @@
+2017-08-03  Richard Biener  <rguenther@suse.de>
+
+       * tree-ssa-reassoc.c (should_break_up_subtract): Also break
+       up if the use is in USE - X.
+
 2017-08-03 Alexander Monakov  <amonakov@ispras.ru>
 
        * toplev.c (dumpfile.h): New include.
index 3613d165232a2ea17243113d58f145dfae87695a..03b66265855f32ba9f46d7e7ac43a73825dec14d 100644 (file)
@@ -1,3 +1,8 @@
+2017-08-03  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/tree-ssa/reassoc-23.c: Adjust to fool early folding
+       and CSE.
+
 2017-08-03 Richard Biener  <rguenther@suse.de>
 
        PR middle-end/81148
index 0ab967d20abeed886b6937c23ae8d2a350e42ade..a5451ade6ef37fafdfe99d33bd50da13c75b5dbb 100644 (file)
@@ -6,9 +6,10 @@ foo(unsigned int a, unsigned int b, unsigned int c, unsigned int d,
     unsigned int e, unsigned int f, unsigned int g, unsigned int h)
 {
   /* Should be transformed into e = 20 */
-  unsigned int i = (a + 9) + (c + 8);
-  unsigned int j = (-c + 1) + (-a + 2);
-
+  unsigned int i = (a + 9);
+  unsigned int j = (-c + 1);
+  i += (c + 8);
+  j += (-a + 2);
   e = i + j;
   return e;
 }
index 6ecba809199cabe143138311cfcfd83cf444d9f4..561acea4dcc14d6bc25e0c6812ffdefdd630aa14 100644 (file)
@@ -4729,7 +4729,9 @@ should_break_up_subtract (gimple *stmt)
       && (immusestmt = get_single_immediate_use (lhs))
       && is_gimple_assign (immusestmt)
       && (gimple_assign_rhs_code (immusestmt) == PLUS_EXPR
-         ||  gimple_assign_rhs_code (immusestmt) == MULT_EXPR))
+         || (gimple_assign_rhs_code (immusestmt) == MINUS_EXPR
+             && gimple_assign_rhs1 (immusestmt) == lhs)
+         || gimple_assign_rhs_code (immusestmt) == MULT_EXPR))
     return true;
   return false;
 }