Implement PR1822

llvm-svn: 44318
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
index 85fd2c3..e90d190 100644
--- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -7326,6 +7326,13 @@
         return BinaryOperator::createOr(NotCond, TrueVal);
       }
     }
+    
+    // select a, b, a  -> a&b
+    // select a, a, b  -> a|b
+    if (CondVal == TrueVal)
+      return BinaryOperator::createOr(CondVal, FalseVal);
+    else if (CondVal == FalseVal)
+      return BinaryOperator::createAnd(CondVal, TrueVal);
   }
 
   // Selecting between two integer constants?
diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll
index ccc63c2..aac7603 100644
--- a/llvm/test/Transforms/InstCombine/select.ll
+++ b/llvm/test/Transforms/InstCombine/select.ll
@@ -1,8 +1,7 @@
 ; This test makes sure that these instructions are properly eliminated.
+; PR1822
 
-; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \
-; RUN:    not grep select
-; END.
+; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep select
 
 implementation
 
@@ -180,3 +179,12 @@
         ret short %retval
 }
 
+bool %test23(bool %a, bool %b) {
+	%c = select bool %a, bool %b, bool %a
+	ret bool %c
+}
+
+bool %test24(bool %a, bool %b) {
+	%c = select bool %a, bool %a, bool %b
+	ret bool %c
+}