aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index 724243369b..7d308be1f2 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -108,6 +108,7 @@ namespace {
Instruction *visitSetCondInst(BinaryOperator &I);
Instruction *visitShiftInst(ShiftInst &I);
Instruction *visitCastInst(CastInst &CI);
+ Instruction *visitSelectInst(SelectInst &CI);
Instruction *visitCallInst(CallInst &CI);
Instruction *visitInvokeInst(InvokeInst &II);
Instruction *visitPHINode(PHINode &PN);
@@ -1931,6 +1932,20 @@ Instruction *InstCombiner::visitCastInst(CastInst &CI) {
return 0;
}
+Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
+ if (ConstantBool *C = dyn_cast<ConstantBool>(SI.getCondition()))
+ if (C == ConstantBool::True)
+ return ReplaceInstUsesWith(SI, SI.getTrueValue());
+ else {
+ assert(C == ConstantBool::False);
+ return ReplaceInstUsesWith(SI, SI.getFalseValue());
+ }
+ // Other transformations are possible!
+
+ return 0;
+}
+
+
// CallInst simplification
//
Instruction *InstCombiner::visitCallInst(CallInst &CI) {