[llvm] [LV] Use SCEV to compute final value of complex induction variables (PR #195059)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 11 02:45:02 PDT 2026
================
@@ -1098,54 +1098,75 @@ static VPValue *tryToComputeEndValueForInduction(VPWidenInductionRecipe *WideIV,
/// Attempts to optimize the induction variable exit values for users in the
/// exit block coming from the latch in the original scalar loop.
-static VPValue *
-optimizeLatchExitInductionUser(VPlan &Plan, VPValue *Op,
- DenseMap<VPValue *, VPValue *> &EndValues,
- PredicatedScalarEvolution &PSE) {
+static VPValue *optimizeLatchExitInductionUser(
+ VPlan &Plan, VPValue *Op, DenseMap<VPValue *, VPValue *> &EndValues,
+ PredicatedScalarEvolution &PSE, VPValue *ResumeTC, const Loop *L) {
VPValue *Incoming;
if (!match(Op, m_ExtractLastLaneOfLastPart(m_VPValue(Incoming))))
return nullptr;
- VPWidenInductionRecipe *WideIV = getOptimizableIVOf(Incoming, PSE);
- if (!WideIV)
- return nullptr;
+ auto *ExtractR = cast<VPInstruction>(Op);
+ if (VPWidenInductionRecipe *WideIV = getOptimizableIVOf(Incoming, PSE)) {
+ VPValue *EndValue = EndValues.lookup(WideIV);
+ assert(EndValue && "Must have computed the end value up front");
+
+ // `getOptimizableIVOf()` always returns the pre-incremented IV, so if it
+ // changed it means the exit is using the incremented value, so we don't
+ // need to subtract the step.
+ if (Incoming != WideIV)
+ return EndValue;
+
+ // Otherwise, subtract the step from the EndValue.
+ VPBuilder B(ExtractR);
+ VPValue *Step = WideIV->getStepValue();
+ Type *ScalarTy = WideIV->getScalarType();
+ if (ScalarTy->isIntegerTy())
+ return B.createSub(EndValue, Step, DebugLoc::getUnknown(), "ind.escape");
+ if (ScalarTy->isPointerTy()) {
+ Type *StepTy = Step->getScalarType();
+ auto *Zero = Plan.getZero(StepTy);
+ return B.createPtrAdd(EndValue, B.createSub(Zero, Step),
+ DebugLoc::getUnknown(), "ind.escape");
+ }
+ if (ScalarTy->isFloatingPointTy()) {
+ const auto &ID = WideIV->getInductionDescriptor();
+ return B.createNaryOp(
+ ID.getInductionBinOp()->getOpcode() == Instruction::FAdd
+ ? Instruction::FSub
+ : Instruction::FAdd,
+ {EndValue, Step}, {ID.getInductionBinOp()->getFastMathFlags()});
----------------
artagnon wrote:
```suggestion
{EndValue, Step}, ID.getInductionBinOp()->getFastMathFlags());
```
Could also name it ind.escape for uniformity?
https://github.com/llvm/llvm-project/pull/195059
More information about the llvm-commits
mailing list