diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index c5fe5561c0b..78de6dfe7f4 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -1260,13 +1260,15 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, break; } case Instruction::Select: { + SelectInst *Sel = cast<SelectInst>(I); + Value *Cond = Sel->getCondition(); + APInt DemandedLHS(DemandedElts), DemandedRHS(DemandedElts); - if (auto *CV = dyn_cast<ConstantVector>(I->getOperand(0))) { + if (auto *CV = dyn_cast<ConstantVector>(Cond)) { for (unsigned i = 0; i < VWidth; i++) { + // isNullValue() always returns false when called on a ConstantExpr. + // Skip constant expressions to avoid propagating incorrect information. Constant *CElt = CV->getAggregateElement(i); - // Method isNullValue always returns false when called on a - // ConstantExpr. If CElt is a ConstantExpr then skip it in order to - // to avoid propagating incorrect information. if (isa<ConstantExpr>(CElt)) continue; if (CElt->isNullValue()) @@ -1276,15 +1278,15 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, } } - if (Value *V = SimplifyDemandedVectorElts(I->getOperand(1), DemandedLHS, + if (Value *V = SimplifyDemandedVectorElts(Sel->getTrueValue(), DemandedLHS, UndefElts2, Depth + 1)) { - I->setOperand(1, V); + Sel->setTrueValue(V); MadeChange = true; } - if (Value *V = SimplifyDemandedVectorElts(I->getOperand(2), DemandedRHS, + if (Value *V = SimplifyDemandedVectorElts(Sel->getFalseValue(), DemandedRHS, UndefElts3, Depth + 1)) { - I->setOperand(2, V); + Sel->setFalseValue(V); MadeChange = true; } |