From: Marc Glisse Date: Tue, 1 May 2018 21:41:05 +0000 (+0200) Subject: Generalize a a a PR tree-optimization/85143 gcc/ * match.pd (A + + PR tree-optimization/85143 + * match.pd (A PR lto/85451 diff --git a/gcc/match.pd b/gcc/match.pd index 0de4432d925..703373090a5 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 f5b94c65daf..465b079a366 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-05-01 Marc Glisse + + 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 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 00000000000..a49a3d5b509 --- /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 2e4300c41aa..3a3b280c804 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" } } */