forked from OSchip/llvm-project
[InstCombine] fix use of base VectorType; NFC
SimplifyDemandedVectorElts() bails out on ScalableVectorType anyway, but we can exit faster with the external check. Move this to a helper function because there are likely other vector folds that we can try here.
This commit is contained in:
parent
89d48ccabe
commit
26ebe936f3
|
@ -879,6 +879,7 @@ private:
|
|||
|
||||
/// Canonicalize the position of binops relative to shufflevector.
|
||||
Instruction *foldVectorBinop(BinaryOperator &Inst);
|
||||
Instruction *foldVectorSelect(SelectInst &Sel);
|
||||
|
||||
/// Given a binary operator, cast instruction, or select which has a PHI node
|
||||
/// as operand #0, see if we can fold the instruction into the PHI (which is
|
||||
|
|
|
@ -2389,6 +2389,23 @@ static Instruction *foldSelectToCopysign(SelectInst &Sel,
|
|||
return CopySign;
|
||||
}
|
||||
|
||||
Instruction *InstCombiner::foldVectorSelect(SelectInst &Sel) {
|
||||
auto *VecTy = dyn_cast<FixedVectorType>(Sel.getType());
|
||||
if (!VecTy)
|
||||
return nullptr;
|
||||
|
||||
unsigned NumElts = VecTy->getNumElements();
|
||||
APInt UndefElts(NumElts, 0);
|
||||
APInt AllOnesEltMask(APInt::getAllOnesValue(NumElts));
|
||||
if (Value *V = SimplifyDemandedVectorElts(&Sel, AllOnesEltMask, UndefElts)) {
|
||||
if (V != &Sel)
|
||||
return replaceInstUsesWith(Sel, V);
|
||||
return &Sel;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
|
||||
Value *CondVal = SI.getCondition();
|
||||
Value *TrueVal = SI.getTrueValue();
|
||||
|
@ -2817,16 +2834,8 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
|
|||
return &SI;
|
||||
}
|
||||
|
||||
if (VectorType *VecTy = dyn_cast<VectorType>(SelType)) {
|
||||
unsigned VWidth = VecTy->getNumElements();
|
||||
APInt UndefElts(VWidth, 0);
|
||||
APInt AllOnesEltMask(APInt::getAllOnesValue(VWidth));
|
||||
if (Value *V = SimplifyDemandedVectorElts(&SI, AllOnesEltMask, UndefElts)) {
|
||||
if (V != &SI)
|
||||
return replaceInstUsesWith(SI, V);
|
||||
return &SI;
|
||||
}
|
||||
}
|
||||
if (Instruction *I = foldVectorSelect(SI))
|
||||
return I;
|
||||
|
||||
// If we can compute the condition, there's no need for a select.
|
||||
// Like the above fold, we are attempting to reduce compile-time cost by
|
||||
|
|
Loading…
Reference in New Issue