aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-04-09 18:19:44 +0000
committerChris Lattner <sabre@nondot.org>2004-04-09 18:19:44 +0000
commit82e14fe16825f7f293be3251dcd92f7af47926f0 (patch)
treeba1d5b71c0fcbe8d2895a014a533c9377a0c647c
parentb5ee959e6370ff65355ffdd393a9bac2fadc711b (diff)
Implement select.ll:test11
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12793 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Scalar/InstructionCombining.cpp19
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index 6774419e79..2f2d32ceab 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -2055,11 +2055,20 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
// Selecting between two constants?
if (Constant *TrueValC = dyn_cast<Constant>(TrueVal))
if (Constant *FalseValC = dyn_cast<Constant>(FalseVal)) {
- // If the true constant is a 1 and the false is a zero, turn this into a
- // cast from bool.
- if (FalseValC->isNullValue() && isa<ConstantInt>(TrueValC) &&
- cast<ConstantInt>(TrueValC)->getRawValue() == 1)
- return new CastInst(CondVal, SI.getType());
+ if (SI.getType()->isInteger()) {
+ // select C, 1, 0 -> cast C to int
+ if (FalseValC->isNullValue() && isa<ConstantInt>(TrueValC) &&
+ cast<ConstantInt>(TrueValC)->getRawValue() == 1) {
+ return new CastInst(CondVal, SI.getType());
+ } else if (TrueValC->isNullValue() && isa<ConstantInt>(FalseValC) &&
+ cast<ConstantInt>(FalseValC)->getRawValue() == 1) {
+ // select C, 0, 1 -> cast !C to int
+ Value *NotCond =
+ InsertNewInstBefore(BinaryOperator::createNot(CondVal,
+ "not."+CondVal->getName()), SI);
+ return new CastInst(NotCond, SI.getType());
+ }
+ }
}
return 0;