aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/match.pd12
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/assoc-1.c31
4 files changed, 51 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3fd4629..665e0b5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
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,
BT_FEXCEPT_T_PTR, BT_CONST_FEXCEPT_T_PTR): New primitive types.
(BT_FN_INT_FENV_T_PTR, BT_FN_INT_CONST_FENV_T_PTR,
diff --git a/gcc/match.pd b/gcc/match.pd
index a4cae11..083a574 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 901d4a5..7364606 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..f982191
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/assoc-1.c
@@ -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" } } */