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
This commit is contained in:
Marc Glisse 2018-05-01 23:41:05 +02:00 committed by Marc Glisse
parent 5052a74c45
commit dac920e8c8
5 changed files with 35 additions and 8 deletions

View File

@ -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> 2018-05-01 Tom de Vries <tom@codesourcery.com>
PR lto/85451 PR lto/85451

View File

@ -4514,10 +4514,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
/* Transform (@0 < @1 and @0 < @2) to use min, /* Transform (@0 < @1 and @0 < @2) to use min,
(@0 > @1 and @0 > @2) to use max */ (@0 > @1 and @0 > @2) to use max */
(for op (lt le gt ge) (for logic (bit_and bit_and bit_and bit_and bit_ior bit_ior bit_ior bit_ior)
ext (min min max max) op (lt le gt ge lt le gt ge )
ext (min min max max max max min min )
(simplify (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)) (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
&& TREE_CODE (@0) != INTEGER_CST) && TREE_CODE (@0) != INTEGER_CST)
(op @0 (ext @1 @2))))) (op @0 (ext @1 @2)))))

View File

@ -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> 2018-05-01 David Malcolm <dmalcolm@redhat.com>
PR c/84258 PR c/84258

View File

@ -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" } } */

View File

@ -1,17 +1,16 @@
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */ /* { 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 cmp1 = a < b;
int cmp2 = a < c; int cmp2 = a < c;
return cmp1 & cmp2; 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 cmp1 = a > b;
int cmp2 = a > c; 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 "MIN_EXPR" 2 "optimized" } } */
/* { dg-final { scan-tree-dump-times "MAX_EXPR" 1 "optimized" } } */