[llvm] [VPlan] Replicate VPScalarIVStepsRecipe by VF outside replicate regions. (PR #170053)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 3 03:08:35 PST 2026
================
@@ -594,12 +595,28 @@ cloneForLane(VPlan &Plan, VPBuilder &Builder, Type *IdxTy,
/*IsSingleScalar=*/true, /*Mask=*/nullptr,
*RepR, *RepR, RepR->getDebugLoc());
} else {
- assert(isa<VPInstruction>(DefR) &&
- "DefR must be a VPReplicateRecipe or VPInstruction");
New = DefR->clone();
for (const auto &[Idx, Op] : enumerate(NewOps)) {
New->setOperand(Idx, Op);
}
+ if (auto *Steps = dyn_cast<VPScalarIVStepsRecipe>(New)) {
+ // Skip lane 0: an absent start index is implicitly zero.
+ unsigned KnownLane = Lane.getKnownLane();
+ if (KnownLane != 0) {
+ VPTypeAnalysis TypeInfo(Plan);
+ Type *BaseIVTy = TypeInfo.inferScalarType(DefR->getOperand(0));
+ VPValue *LaneOffset = Plan.getConstantInt(
+ APInt(IdxTy->getScalarSizeInBits(), KnownLane)
+ .zextOrTrunc(BaseIVTy->getScalarSizeInBits()));
+
+ if (VPValue *StartIndex = Steps->getStartIndex()) {
+ // Add lane offset to the existing start index.
+ VPBuilder Builder(DefR);
+ LaneOffset = Builder.createAdd(StartIndex, LaneOffset);
----------------
ayalz wrote:
What if Steps represents floating-point induction rather than integer - is this case tested?
Compare with VPScalarIVStepsRecipe::execute()'s
```StartIdx = Builder.CreateBinOp(AddOp, StartIdx0, LaneValue);```
where `AddOp` is Instruction::Add if base is integer, but an FAdd or FSub otherwise?
https://github.com/llvm/llvm-project/pull/170053
More information about the llvm-commits
mailing list