Simple reassoc transforms in match.pd
authorMarc Glisse <marc.glisse@inria.fr>
Tue, 27 Jun 2017 09:42:38 +0000 (11:42 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Tue, 27 Jun 2017 09:42:38 +0000 (09:42 +0000)
2017-06-27  Marc Glisse  <marc.glisse@inria.fr>

gcc/
* match.pd ((A+-B)+(C-A), (A+B)-(A-C)): New transformations.

gcc/testsuite/
* gcc.dg/tree-ssa/assoc-1.c: New file.

From-SVN: r249686

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/assoc-1.c [new file with mode: 0644]

index 3fd4629607ad76b48e4ae2441cc6ca1e0d92e27b..665e0b5b085a0406945cf503c08a9c2b7acc4296 100644 (file)
@@ -1,3 +1,7 @@
+2017-06-27  Marc Glisse  <marc.glisse@inria.fr>
+
+       * match.pd ((A+-B)+(C-A), (A+B)-(A-C)): New transformations.
+
 2017-06-27  Marc Glisse  <marc.glisse@inria.fr>
 
        * builtin-types.def (BT_FENV_T_PTR, BT_CONST_FENV_T_PTR,
index a4cae113bc84d4ccde88396f46699ca9b4962f9c..083a5742bc37b6bdd5cc81d1616dd98efa0e1d4c 100644 (file)
@@ -1321,6 +1321,18 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (simplify
    (minus @0 (minus @0 @1))
    @1)
+  /* (A +- B) + (C - A)   -> C +- B */
+  /* (A +  B) - (A - C)   -> B + C */
+  /* More cases are handled with comparisons.  */
+  (simplify
+   (plus:c (plus:c @0 @1) (minus @2 @0))
+   (plus @2 @1))
+  (simplify
+   (plus:c (minus @0 @1) (minus @2 @0))
+   (minus @2 @1))
+  (simplify
+   (minus (plus:c @0 @1) (minus @0 @2))
+   (plus @1 @2))
 
   /* (A +- CST1) +- CST2 -> A + CST3
      Use view_convert because it is safe for vectors and equivalent for
index 901d4a53d85213f7756031f91a69428b1d64e876..7364606164cac74f4e93f217ca0a519f241eaa84 100644 (file)
@@ -1,3 +1,7 @@
+2017-06-27  Marc Glisse  <marc.glisse@inria.fr>
+
+       * gcc.dg/tree-ssa/assoc-1.c: New file.
+
 2017-06-27  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/62046
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/assoc-1.c b/gcc/testsuite/gcc.dg/tree-ssa/assoc-1.c
new file mode 100644 (file)
index 0000000..f982191
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized-raw -fno-tree-reassoc" } */
+
+int f0(int a,int b,int c){
+  int d = a + b;
+  int e = c + b;
+  return d - e;
+}
+int f1(int a,int b,int c){
+  int d = a + b;
+  int e = b - c;
+  return d - e;
+}
+int f2(int a,int b,int c){
+  int d = a + b;
+  int e = c - b;
+  return e + d;
+}
+int f3(int a,int b,int c){
+  int d = a - b;
+  int e = c - b;
+  return d - e;
+}
+int f4(int a,int b,int c){
+  int d = b - a;
+  int e = c - b;
+  return e + d;
+}
+
+/* { dg-final { scan-tree-dump-times "plus_expr" 2 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "minus_expr" 3 "optimized" } } */