diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b69f42b5bee492d1bca411f641a99bee2ee87b1d..99b97caff653d23bd9f79499e85879a46567ac3d 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 0de4432d925623b127b14a192d9fe1f7f9ce0a53..703373090a5ebae80af23f1bb44389936f52ca27 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 f5b94c65dafa4a989992f5a1c957eee14330a6b0..465b079a366dd5ebe82efa10530b1c6a71c20579 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 0000000000000000000000000000000000000000..a49a3d5b509aeec800d7e72a7a57d48c7adfa5d0 --- /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 2e4300c41aa46079995bdd93104f2383a9bfb39e..3a3b280c8042a3a501a28bc08bf4a73f3ecc10ce 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" } } */