Implement select.ll:test11

llvm-svn: 12793
This commit is contained in:
Chris Lattner 2004-04-09 18:19:44 +00:00
parent 755cab25ae
commit cf7baf3519
1 changed files with 14 additions and 5 deletions

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;