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