diff options
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/match.pd | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/assoc-1.c | 31 |
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" } } */ |