Implement select.ll:test11

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12793 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2004-04-09 18:19:44 +00:00
parent b5ee959e63
commit 82e14fe168

View File

@ -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;