aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp7
-rw-r--r--test/Transforms/InstCombine/select.ll14
2 files changed, 18 insertions, 3 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index 85fd2c3bdb..e90d1909ae 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -7326,6 +7326,13 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
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/test/Transforms/InstCombine/select.ll b/test/Transforms/InstCombine/select.ll
index ccc63c2553..aac7603e08 100644
--- a/test/Transforms/InstCombine/select.ll
+++ b/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 @@ short %test22(int %x) {
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
+}