aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2018-05-01 23:41:05 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2018-05-01 21:41:05 +0000
commitdac920e8c8c4720237b2c63c50e57e6738d3f688 (patch)
treed561270abf6d2a858e411489e11c747839dd0236 /gcc
parent5052a74c45ff7b7d165c51afa1c689e9a7e2e73c (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/match.pd7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend-2.c16
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend.c9
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" } } */