Add trivial optimizations for select instructions
authorChris Lattner <sabre@nondot.org>
Fri, 12 Mar 2004 05:52:32 +0000 (05:52 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 12 Mar 2004 05:52:32 +0000 (05:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12317 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 724243369b500f19d7ac19e14bdc5eb5da6d7046..7d308be1f2188664ee338d2c5aae2b0eb73fdde5 100644 (file)
@@ -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) {