[llvm] [LV] Add extra check for signed oveflow for SDiv/SRem (PR #170818)
Shih-Po Hung via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 11 23:09:58 PST 2025
================
@@ -2878,11 +2878,40 @@ bool LoopVectorizationCostModel::isPredicatedInst(Instruction *I) const {
TheLoop->isLoopInvariant(cast<StoreInst>(I)->getValueOperand()));
}
case Instruction::UDiv:
- case Instruction::SDiv:
- case Instruction::SRem:
case Instruction::URem:
// If the divisor is loop-invariant no predication is needed.
return !Legal->isInvariant(I->getOperand(1));
+ case Instruction::SDiv:
+ case Instruction::SRem: {
+ auto *LHS = I->getOperand(0);
+ auto *RHS = I->getOperand(1);
+ ScalarEvolution &SE = *PSE.getSE();
+ auto *LHSSC = SE.getSCEV(LHS);
+ auto *RHSSC = SE.getSCEV(RHS);
+ unsigned Bits = SE.getTypeSizeInBits(LHSSC->getType());
+ APInt MinusOne = APInt::getAllOnes(Bits);
+ bool MayBeNegOne = SE.getSignedRange(RHSSC).contains(MinusOne);
+
+ // No predicate if RHS have no poison in masked-off lanes and not -1.
+ if (isa<SCEVAddRecExpr>(RHSSC) && !MayBeNegOne)
----------------
arcbbb wrote:
Sure, we can revisit this later. For now use isInductionVariable instead.
https://github.com/llvm/llvm-project/pull/170818
More information about the llvm-commits
mailing list