Generalize a<b&a<c -> a<min(b,c)
authorMarc Glisse <marc.glisse@inria.fr>
Tue, 1 May 2018 21:41:05 +0000 (23:41 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Tue, 1 May 2018 21:41:05 +0000 (21:41 +0000)
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

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/minmax-loopend.c

index b69f42b5bee492d1bca411f641a99bee2ee87b1d..99b97caff653d23bd9f79499e85879a46567ac3d 100644 (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>
 
        PR lto/85451
index 0de4432d925623b127b14a192d9fe1f7f9ce0a53..703373090a5ebae80af23f1bb44389936f52ca27 100644 (file)
@@ -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)))))
index f5b94c65dafa4a989992f5a1c957eee14330a6b0..465b079a366dd5ebe82efa10530b1c6a71c20579 100644 (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>
 
        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 (file)
index 0000000..a49a3d5
--- /dev/null
@@ -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" } } */
index 2e4300c41aa46079995bdd93104f2383a9bfb39e..3a3b280c8042a3a501a28bc08bf4a73f3ecc10ce 100644 (file)
@@ -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" } } */