diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2018-05-01 23:41:05 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2018-05-01 21:41:05 +0000 |
commit | dac920e8c8c4720237b2c63c50e57e6738d3f688 (patch) | |
tree | d561270abf6d2a858e411489e11c747839dd0236 | |
parent | 5052a74c45ff7b7d165c51afa1c689e9a7e2e73c (diff) | |
download | gcc-dac920e8c8c4720237b2c63c50e57e6738d3f688.zip gcc-dac920e8c8c4720237b2c63c50e57e6738d3f688.tar.gz gcc-dac920e8c8c4720237b2c63c50e57e6738d3f688.tar.bz2 |
Generalize a<b&a<c -> a<min(b,c)
2018-05-01 Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/85143
gcc/
* match.pd (A<B&A<C): Extend to BIT_IOR_EXPR.
gcc/testsuite/
* gcc.dg/tree-ssa/minmax-loopend.c: Extend and split...
* gcc.dg/tree-ssa/minmax-loopend-2.c: ... here.
From-SVN: r259812
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/match.pd | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend-2.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend.c | 9 |
5 files changed, 35 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b69f42b..99b97ca 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2018-05-01 Marc Glisse <marc.glisse@inria.fr> + + PR tree-optimization/85143 + * match.pd (A<B&A<C): Extend to BIT_IOR_EXPR. + 2018-05-01 Tom de Vries <tom@codesourcery.com> PR lto/85451 diff --git a/gcc/match.pd b/gcc/match.pd index 0de4432..7033730 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -4514,10 +4514,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* Transform (@0 < @1 and @0 < @2) to use min, (@0 > @1 and @0 > @2) to use max */ -(for op (lt le gt ge) - ext (min min max max) +(for logic (bit_and bit_and bit_and bit_and bit_ior bit_ior bit_ior bit_ior) + op (lt le gt ge lt le gt ge ) + ext (min min max max max max min min ) (simplify - (bit_and (op:cs @0 @1) (op:cs @0 @2)) + (logic (op:cs @0 @1) (op:cs @0 @2)) (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) && TREE_CODE (@0) != INTEGER_CST) (op @0 (ext @1 @2))))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f5b94c6..465b079 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-05-01 Marc Glisse <marc.glisse@inria.fr> + + PR tree-optimization/85143 + * gcc.dg/tree-ssa/minmax-loopend.c: Extend and split... + * gcc.dg/tree-ssa/minmax-loopend-2.c: ... here. + 2018-05-01 David Malcolm <dmalcolm@redhat.com> PR c/84258 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend-2.c b/gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend-2.c new file mode 100644 index 0000000..a49a3d5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend-2.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +int and_test(long a, long b, long c) { + int cmp1 = a > b; + int cmp2 = a > c; + return cmp1 & cmp2; +} + +int ior_test (long a, long b, long c) { + int cmp1 = a < b; + int cmp2 = a < c; + return cmp1 | cmp2; +} + +/* { dg-final { scan-tree-dump-times "MAX_EXPR" 2 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend.c b/gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend.c index 2e4300c..3a3b280 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend.c @@ -1,17 +1,16 @@ /* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-optimized" } */ -int min_test(long a, long b, long c) { +int and_test(long a, long b, long c) { int cmp1 = a < b; int cmp2 = a < c; return cmp1 & cmp2; } -int max_test (long a, long b, long c) { +int ior_test (long a, long b, long c) { int cmp1 = a > b; int cmp2 = a > c; - return cmp1 & cmp2; + return cmp1 | cmp2; } -/* { dg-final { scan-tree-dump-times "MIN_EXPR" 1 "optimized" } } */ -/* { dg-final { scan-tree-dump-times "MAX_EXPR" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "MIN_EXPR" 2 "optimized" } } */ |