[llvm] r325434 - [InstSimplify] move select undef cond fold with other constant cond folds; NFCI
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Sat Feb 17 06:50:13 PST 2018
Author: spatel
Date: Sat Feb 17 06:50:13 2018
New Revision: 325434
URL: http://llvm.org/viewvc/llvm-project?rev=325434&view=rev
Log:
[InstSimplify] move select undef cond fold with other constant cond folds; NFCI
Modified:
llvm/trunk/lib/Analysis/InstructionSimplify.cpp
Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=325434&r1=325433&r2=325434&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Sat Feb 17 06:50:13 2018
@@ -3681,37 +3681,38 @@ static Value *simplifySelectWithICmpCond
/// 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;
More information about the llvm-commits
mailing list