[InstSimplify] move select undef cond fold with other constant cond folds; NFCI

llvm-svn: 325434
This commit is contained in:
Sanjay Patel 2018-02-17 14:50:13 +00:00
parent a63a5b993e
commit ac3952052b
1 changed files with 21 additions and 20 deletions

View File

@ -3681,37 +3681,38 @@ static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal,
/// Given operands for a SelectInst, see if we can fold the result.
/// If not, this returns null.
static Value *SimplifySelectInst(Value *CondVal, Value *TrueVal,
Value *FalseVal, const SimplifyQuery &Q,
unsigned MaxRecurse) {
// select true, X, Y -> X
// select false, X, Y -> Y
if (Constant *CB = dyn_cast<Constant>(CondVal)) {
if (Constant *CT = dyn_cast<Constant>(TrueVal))
if (Constant *CF = dyn_cast<Constant>(FalseVal))
return ConstantFoldSelectInstruction(CB, CT, CF);
if (CB->isAllOnesValue())
static Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
const SimplifyQuery &Q, unsigned MaxRecurse) {
if (auto *CondC = dyn_cast<Constant>(Cond)) {
if (auto *TrueC = dyn_cast<Constant>(TrueVal))
if (auto *FalseC = dyn_cast<Constant>(FalseVal))
return ConstantFoldSelectInstruction(CondC, TrueC, FalseC);
// select undef, X, Y -> X or Y
if (isa<UndefValue>(CondC))
return isa<Constant>(FalseVal) ? FalseVal : TrueVal;
// TODO: Vector constants with undef elements don't simplify.
// select true, X, Y -> X
if (CondC->isAllOnesValue())
return TrueVal;
if (CB->isNullValue())
// select false, X, Y -> Y
if (CondC->isNullValue())
return FalseVal;
}
// select C, X, X -> X
// select ?, X, X -> X
if (TrueVal == FalseVal)
return TrueVal;
if (isa<UndefValue>(CondVal)) { // select undef, X, Y -> X or Y
if (isa<Constant>(FalseVal))
return FalseVal;
return TrueVal;
}
if (isa<UndefValue>(TrueVal)) // select C, undef, X -> X
if (isa<UndefValue>(TrueVal)) // select ?, undef, X -> X
return FalseVal;
if (isa<UndefValue>(FalseVal)) // select C, X, undef -> X
if (isa<UndefValue>(FalseVal)) // select ?, X, undef -> X
return TrueVal;
if (Value *V =
simplifySelectWithICmpCond(CondVal, TrueVal, FalseVal, Q, MaxRecurse))
simplifySelectWithICmpCond(Cond, TrueVal, FalseVal, Q, MaxRecurse))
return V;
return nullptr;