Skip to content

Commit 3b45321

Browse files
committed
[VPlan] Add VPInstruction::StepVector and use it in VPWidenIntOrFpInductionRecipe
Split off from llvm#118638, this adds a new VPInstruction for integer step vectors (0,1,2,...), so that we can eventually model all the separate parts of VPWidenIntOrFpInductionRecipe in VPlan. This is then used by VPWidenIntOrFpInductionRecipe, where we add it just before execution in convertToConcreteRecipes. We need a dummy placeholder operand so we have somewhere to pass it, but this should go away when #llvm#118638 lands.
1 parent b0ddcb9 commit 3b45321

11 files changed

+74
-31
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7700,7 +7700,8 @@ DenseMap<const SCEV *, Value *> LoopVectorizationPlanner::executePlan(
77007700
BestVPlan, BestVF,
77017701
TTI.getRegisterBitWidth(TargetTransformInfo::RGK_FixedWidthVector));
77027702
VPlanTransforms::removeDeadRecipes(BestVPlan);
7703-
VPlanTransforms::convertToConcreteRecipes(BestVPlan);
7703+
VPlanTransforms::convertToConcreteRecipes(BestVPlan,
7704+
Legal->getWidestInductionType());
77047705

77057706
// Perform the actual loop transformation.
77067707
VPTransformState State(&TTI, BestVF, LI, DT, ILV.Builder, &ILV, &BestVPlan,

llvm/lib/Transforms/Vectorize/VPlan.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,8 @@ class VPInstruction : public VPRecipeWithIRFlags,
880880
AnyOf,
881881
// Calculates the first active lane index of the vector predicate operand.
882882
FirstActiveLane,
883+
// Creates a step vector starting from 0 with a step of 1.
884+
StepVector,
883885
};
884886

885887
private:
@@ -1042,7 +1044,11 @@ class VPInstructionWithType : public VPInstruction {
10421044
Type *ResultTy, DebugLoc DL, const Twine &Name = "")
10431045
: VPInstruction(Opcode, Operands, DL, Name), ResultTy(ResultTy) {}
10441046

1045-
static inline bool classof(const VPRecipeBase *R) { return isCast(R); }
1047+
static inline bool classof(const VPRecipeBase *R) {
1048+
return isCast(R) ||
1049+
(isa<VPInstruction>(R) &&
1050+
cast<VPInstruction>(R)->getOpcode() == VPInstruction::StepVector);
1051+
}
10461052

10471053
static inline bool classof(const VPUser *R) {
10481054
return isa<VPInstructionWithType>(cast<VPRecipeBase>(R));
@@ -1804,6 +1810,7 @@ class VPWidenIntOrFpInductionRecipe : public VPWidenInductionRecipe {
18041810
Step, IndDesc, DL),
18051811
Trunc(nullptr) {
18061812
addOperand(VF);
1813+
addOperand(VF); // Dummy StepVector replaced in convertToConcreteRecipes
18071814
}
18081815

18091816
VPWidenIntOrFpInductionRecipe(PHINode *IV, VPValue *Start, VPValue *Step,
@@ -1813,6 +1820,7 @@ class VPWidenIntOrFpInductionRecipe : public VPWidenInductionRecipe {
18131820
Step, IndDesc, DL),
18141821
Trunc(Trunc) {
18151822
addOperand(VF);
1823+
addOperand(VF); // Dummy StepVector replaced in convertToConcreteRecipes
18161824
}
18171825

18181826
~VPWidenIntOrFpInductionRecipe() override = default;
@@ -1838,10 +1846,14 @@ class VPWidenIntOrFpInductionRecipe : public VPWidenInductionRecipe {
18381846
VPValue *getVFValue() { return getOperand(2); }
18391847
const VPValue *getVFValue() const { return getOperand(2); }
18401848

1849+
VPValue *getStepVector() { return getOperand(3); }
1850+
const VPValue *getStepVector() const { return getOperand(3); }
1851+
void setStepVector(VPValue *V) { setOperand(3, V); }
1852+
18411853
VPValue *getSplatVFValue() {
18421854
// If the recipe has been unrolled (4 operands), return the VPValue for the
18431855
// induction increment.
1844-
return getNumOperands() == 5 ? getOperand(3) : nullptr;
1856+
return getNumOperands() == 6 ? getOperand(4) : nullptr;
18451857
}
18461858

18471859
/// Returns the first defined value as TruncInst, if it is one or nullptr
@@ -1863,7 +1875,7 @@ class VPWidenIntOrFpInductionRecipe : public VPWidenInductionRecipe {
18631875
/// the last unrolled part, if it exists. Returns itself if unrolling did not
18641876
/// take place.
18651877
VPValue *getLastUnrolledPartOperand() {
1866-
return getNumOperands() == 5 ? getOperand(4) : this;
1878+
return getNumOperands() == 6 ? getOperand(5) : this;
18671879
}
18681880
};
18691881

llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -923,6 +923,7 @@ bool VPInstruction::opcodeMayReadOrWriteFromMemory() const {
923923
case VPInstruction::LogicalAnd:
924924
case VPInstruction::Not:
925925
case VPInstruction::PtrAdd:
926+
case VPInstruction::StepVector:
926927
return false;
927928
default:
928929
return true;
@@ -1071,8 +1072,6 @@ void VPInstruction::print(raw_ostream &O, const Twine &Indent,
10711072

10721073
void VPInstructionWithType::execute(VPTransformState &State) {
10731074
State.setDebugLocFrom(getDebugLoc());
1074-
assert(vputils::onlyFirstLaneUsed(this) &&
1075-
"Codegen only implemented for first lane.");
10761075
switch (getOpcode()) {
10771076
case Instruction::ZExt:
10781077
case Instruction::Trunc: {
@@ -1082,6 +1081,12 @@ void VPInstructionWithType::execute(VPTransformState &State) {
10821081
State.set(this, Cast, VPLane(0));
10831082
break;
10841083
}
1084+
case VPInstruction::StepVector: {
1085+
Value *StepVector =
1086+
State.Builder.CreateStepVector(VectorType::get(ResultTy, State.VF));
1087+
State.set(this, StepVector);
1088+
break;
1089+
}
10851090
default:
10861091
llvm_unreachable("opcode not implemented yet");
10871092
}
@@ -1092,9 +1097,17 @@ void VPInstructionWithType::print(raw_ostream &O, const Twine &Indent,
10921097
VPSlotTracker &SlotTracker) const {
10931098
O << Indent << "EMIT ";
10941099
printAsOperand(O, SlotTracker);
1095-
O << " = " << Instruction::getOpcodeName(getOpcode()) << " ";
1096-
printOperands(O, SlotTracker);
1097-
O << " to " << *ResultTy;
1100+
O << " = ";
1101+
switch (getOpcode()) {
1102+
case VPInstruction::StepVector:
1103+
O << "step-vector " << *ResultTy;
1104+
break;
1105+
default:
1106+
O << Instruction::getOpcodeName(getOpcode()) << " ";
1107+
printOperands(O, SlotTracker);
1108+
O << " to " << *ResultTy;
1109+
break;
1110+
}
10981111
}
10991112
#endif
11001113

@@ -1858,7 +1871,8 @@ InstructionCost VPHeaderPHIRecipe::computeCost(ElementCount VF,
18581871
/// (0 * Step, 1 * Step, 2 * Step, ...)
18591872
/// to each vector element of Val.
18601873
/// \p Opcode is relevant for FP induction variable.
1861-
static Value *getStepVector(Value *Val, Value *Step,
1874+
/// \p InitVec is an integer step vector from 0 with a step of 1.
1875+
static Value *getStepVector(Value *Val, Value *Step, Value *InitVec,
18621876
Instruction::BinaryOps BinOp, ElementCount VF,
18631877
IRBuilderBase &Builder) {
18641878
assert(VF.isVector() && "only vector VFs are supported");
@@ -1874,15 +1888,6 @@ static Value *getStepVector(Value *Val, Value *Step,
18741888

18751889
SmallVector<Constant *, 8> Indices;
18761890

1877-
// Create a vector of consecutive numbers from zero to VF.
1878-
VectorType *InitVecValVTy = ValVTy;
1879-
if (STy->isFloatingPointTy()) {
1880-
Type *InitVecValSTy =
1881-
IntegerType::get(STy->getContext(), STy->getScalarSizeInBits());
1882-
InitVecValVTy = VectorType::get(InitVecValSTy, VLen);
1883-
}
1884-
Value *InitVec = Builder.CreateStepVector(InitVecValVTy);
1885-
18861891
if (STy->isIntegerTy()) {
18871892
Step = Builder.CreateVectorSplat(VLen, Step);
18881893
assert(Step->getType() == Val->getType() && "Invalid step vec");
@@ -1948,8 +1953,11 @@ void VPWidenIntOrFpInductionRecipe::execute(VPTransformState &State) {
19481953
}
19491954

19501955
Value *SplatStart = Builder.CreateVectorSplat(State.VF, Start);
1951-
Value *SteppedStart = getStepVector(SplatStart, Step, ID.getInductionOpcode(),
1952-
State.VF, State.Builder);
1956+
assert(cast<VPInstruction>(getStepVector())->getOpcode() ==
1957+
VPInstruction::StepVector);
1958+
Value *SteppedStart =
1959+
::getStepVector(SplatStart, Step, State.get(getStepVector()),
1960+
ID.getInductionOpcode(), State.VF, State.Builder);
19531961

19541962
// We create vector phi nodes for both integer and floating-point induction
19551963
// variables. Here, we determine the kind of arithmetic we will perform.

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2347,10 +2347,28 @@ void VPlanTransforms::createInterleaveGroups(
23472347
}
23482348
}
23492349

2350-
void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan) {
2350+
void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan,
2351+
Type *CanonicalIVTy) {
2352+
VPTypeAnalysis TypeInfo(CanonicalIVTy);
2353+
SmallVector<VPRecipeBase *> ToDelete;
23512354
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
23522355
vp_depth_first_deep(Plan.getEntry()))) {
23532356
for (VPRecipeBase &R : make_early_inc_range(VPBB->phis())) {
2357+
if (auto *IVR = dyn_cast<VPWidenIntOrFpInductionRecipe>(&R)) {
2358+
// Infer an up-to-date type since
2359+
// optimizeVectorInductionWidthForTCAndVFUF may have truncated the start
2360+
// and step values.
2361+
Type *Ty = TypeInfo.inferScalarType(IVR->getStartValue());
2362+
if (TruncInst *Trunc = IVR->getTruncInst())
2363+
Ty = Trunc->getType();
2364+
if (Ty->isFloatingPointTy())
2365+
Ty = IntegerType::get(Ty->getContext(), Ty->getScalarSizeInBits());
2366+
VPInstruction *StepVector = new VPInstructionWithType(
2367+
VPInstruction::StepVector, {}, Ty, R.getDebugLoc());
2368+
2369+
Plan.getVectorPreheader()->appendRecipe(StepVector);
2370+
IVR->setStepVector(StepVector);
2371+
}
23542372
if (!isa<VPCanonicalIVPHIRecipe, VPEVLBasedIVPHIRecipe>(&R))
23552373
continue;
23562374
auto *PhiR = cast<VPHeaderPHIRecipe>(&R);
@@ -2361,9 +2379,13 @@ void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan) {
23612379
PhiR->getDebugLoc(), Name);
23622380
ScalarR->insertBefore(PhiR);
23632381
PhiR->replaceAllUsesWith(ScalarR);
2364-
PhiR->eraseFromParent();
2382+
// Defer erasing recipes till the end so that we don't invalidate the
2383+
// VPTypeAnalysis cache.
2384+
ToDelete.push_back(PhiR);
23652385
}
23662386
}
2387+
for (auto *R : ToDelete)
2388+
R->eraseFromParent();
23672389
}
23682390

23692391
void VPlanTransforms::handleUncountableEarlyExit(

llvm/lib/Transforms/Vectorize/VPlanTransforms.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ struct VPlanTransforms {
177177
VPRecipeBuilder &RecipeBuilder);
178178

179179
/// Lower abstract recipes to concrete ones, that can be codegen'd.
180-
static void convertToConcreteRecipes(VPlan &Plan);
180+
static void convertToConcreteRecipes(VPlan &Plan, Type *CanonicalIVTy);
181181

182182
/// Perform instcombine-like simplifications on recipes in \p Plan. Use \p
183183
/// CanonicalIVTy as type for all un-typed live-ins in VPTypeAnalysis.

llvm/test/Transforms/LoopVectorize/AArch64/scalable-avoid-scalarization.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ define void @test_no_scalarization(ptr %a, ptr noalias %b, i32 %idx, i32 %n) #0
2626
; CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.vscale.i32()
2727
; CHECK-NEXT: [[TMP7:%.*]] = mul i32 [[TMP6]], 2
2828
; CHECK-NEXT: [[IND_END:%.*]] = add i32 [[IDX]], [[N_VEC]]
29+
; CHECK-NEXT: [[TMP8:%.*]] = call <vscale x 2 x i32> @llvm.stepvector.nxv2i32()
2930
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <vscale x 2 x i32> poison, i32 [[IDX]], i64 0
3031
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <vscale x 2 x i32> [[DOTSPLATINSERT]], <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
31-
; CHECK-NEXT: [[TMP8:%.*]] = call <vscale x 2 x i32> @llvm.stepvector.nxv2i32()
3232
; CHECK-NEXT: [[TMP10:%.*]] = mul <vscale x 2 x i32> [[TMP8]], splat (i32 1)
3333
; CHECK-NEXT: [[INDUCTION:%.*]] = add <vscale x 2 x i32> [[DOTSPLAT]], [[TMP10]]
3434
; CHECK-NEXT: [[TMP13:%.*]] = mul i32 1, [[TMP7]]

llvm/test/Transforms/LoopVectorize/AArch64/sve-interleaved-accesses.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1283,11 +1283,11 @@ define void @PR34743(ptr %a, ptr %b, i64 %n) #1 {
12831283
; CHECK-NEXT: [[TMP9:%.*]] = call i64 @llvm.vscale.i64()
12841284
; CHECK-NEXT: [[TMP10:%.*]] = shl nuw nsw i64 [[TMP9]], 2
12851285
; CHECK-NEXT: [[IND_END:%.*]] = shl i64 [[N_VEC]], 1
1286+
; CHECK-NEXT: [[TMP14:%.*]] = call <vscale x 4 x i64> @llvm.stepvector.nxv4i64()
12861287
; CHECK-NEXT: [[TMP11:%.*]] = call i32 @llvm.vscale.i32()
12871288
; CHECK-NEXT: [[TMP12:%.*]] = shl nuw nsw i32 [[TMP11]], 2
12881289
; CHECK-NEXT: [[TMP13:%.*]] = add nsw i32 [[TMP12]], -1
12891290
; CHECK-NEXT: [[VECTOR_RECUR_INIT:%.*]] = insertelement <vscale x 4 x i16> poison, i16 [[DOTPRE]], i32 [[TMP13]]
1290-
; CHECK-NEXT: [[TMP14:%.*]] = call <vscale x 4 x i64> @llvm.stepvector.nxv4i64()
12911291
; CHECK-NEXT: [[TMP15:%.*]] = shl <vscale x 4 x i64> [[TMP14]], splat (i64 1)
12921292
; CHECK-NEXT: [[TMP17:%.*]] = shl nuw nsw i64 [[TMP9]], 3
12931293
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <vscale x 4 x i64> poison, i64 [[TMP17]], i64 0

llvm/test/Transforms/LoopVectorize/RISCV/dead-ops-cost.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ define void @dead_load(ptr %p, i16 %start) {
3333
; CHECK-NEXT: [[TMP14:%.*]] = mul i64 [[TMP13]], 8
3434
; CHECK-NEXT: [[TMP18:%.*]] = mul i64 [[N_VEC]], 3
3535
; CHECK-NEXT: [[IND_END:%.*]] = add i64 [[START_EXT]], [[TMP18]]
36+
; CHECK-NEXT: [[TMP15:%.*]] = call <vscale x 8 x i64> @llvm.stepvector.nxv8i64()
3637
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <vscale x 8 x i64> poison, i64 [[START_EXT]], i64 0
3738
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <vscale x 8 x i64> [[DOTSPLATINSERT]], <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
38-
; CHECK-NEXT: [[TMP15:%.*]] = call <vscale x 8 x i64> @llvm.stepvector.nxv8i64()
3939
; CHECK-NEXT: [[TMP17:%.*]] = mul <vscale x 8 x i64> [[TMP15]], splat (i64 3)
4040
; CHECK-NEXT: [[INDUCTION:%.*]] = add <vscale x 8 x i64> [[DOTSPLAT]], [[TMP17]]
4141
; CHECK-NEXT: [[TMP20:%.*]] = mul i64 3, [[TMP14]]

llvm/test/Transforms/LoopVectorize/RISCV/induction-costs.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ define void @skip_free_iv_truncate(i16 %x, ptr %A) #0 {
7070
; CHECK-NEXT: [[DOTCAST:%.*]] = trunc i64 [[N_VEC]] to i32
7171
; CHECK-NEXT: [[TMP50:%.*]] = mul i32 [[DOTCAST]], 3
7272
; CHECK-NEXT: [[IND_END22:%.*]] = add i32 [[X_I32]], [[TMP50]]
73+
; CHECK-NEXT: [[TMP53:%.*]] = call <vscale x 8 x i64> @llvm.stepvector.nxv8i64()
7374
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <vscale x 8 x i64> poison, i64 [[X_I64]], i64 0
7475
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <vscale x 8 x i64> [[DOTSPLATINSERT]], <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
75-
; CHECK-NEXT: [[TMP53:%.*]] = call <vscale x 8 x i64> @llvm.stepvector.nxv8i64()
7676
; CHECK-NEXT: [[TMP55:%.*]] = mul <vscale x 8 x i64> [[TMP53]], splat (i64 3)
7777
; CHECK-NEXT: [[INDUCTION:%.*]] = add <vscale x 8 x i64> [[DOTSPLAT]], [[TMP55]]
7878
; CHECK-NEXT: [[TMP58:%.*]] = mul i64 3, [[TMP52]]

llvm/test/Transforms/LoopVectorize/RISCV/vectorize-force-tail-with-evl-cond-reduction.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,8 @@ define i32 @step_cond_add(ptr %a, i64 %n, i32 %start) {
582582
; NO-VP-OUTLOOP-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
583583
; NO-VP-OUTLOOP-NEXT: [[TMP9:%.*]] = call i64 @llvm.vscale.i64()
584584
; NO-VP-OUTLOOP-NEXT: [[TMP10:%.*]] = mul i64 [[TMP9]], 4
585-
; NO-VP-OUTLOOP-NEXT: [[TMP11:%.*]] = insertelement <vscale x 4 x i32> zeroinitializer, i32 [[START]], i32 0
586585
; NO-VP-OUTLOOP-NEXT: [[TMP12:%.*]] = call <vscale x 4 x i32> @llvm.stepvector.nxv4i32()
586+
; NO-VP-OUTLOOP-NEXT: [[TMP11:%.*]] = insertelement <vscale x 4 x i32> zeroinitializer, i32 [[START]], i32 0
587587
; NO-VP-OUTLOOP-NEXT: [[TMP14:%.*]] = mul <vscale x 4 x i32> [[TMP12]], splat (i32 1)
588588
; NO-VP-OUTLOOP-NEXT: [[INDUCTION:%.*]] = add <vscale x 4 x i32> zeroinitializer, [[TMP14]]
589589
; NO-VP-OUTLOOP-NEXT: [[TMP16:%.*]] = trunc i64 [[TMP10]] to i32
@@ -772,8 +772,8 @@ define i32 @step_cond_add_pred(ptr %a, i64 %n, i32 %start) {
772772
; NO-VP-OUTLOOP-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
773773
; NO-VP-OUTLOOP-NEXT: [[TMP9:%.*]] = call i64 @llvm.vscale.i64()
774774
; NO-VP-OUTLOOP-NEXT: [[TMP10:%.*]] = mul i64 [[TMP9]], 4
775-
; NO-VP-OUTLOOP-NEXT: [[TMP11:%.*]] = insertelement <vscale x 4 x i32> zeroinitializer, i32 [[START]], i32 0
776775
; NO-VP-OUTLOOP-NEXT: [[TMP12:%.*]] = call <vscale x 4 x i32> @llvm.stepvector.nxv4i32()
776+
; NO-VP-OUTLOOP-NEXT: [[TMP11:%.*]] = insertelement <vscale x 4 x i32> zeroinitializer, i32 [[START]], i32 0
777777
; NO-VP-OUTLOOP-NEXT: [[TMP14:%.*]] = mul <vscale x 4 x i32> [[TMP12]], splat (i32 1)
778778
; NO-VP-OUTLOOP-NEXT: [[INDUCTION:%.*]] = add <vscale x 4 x i32> zeroinitializer, [[TMP14]]
779779
; NO-VP-OUTLOOP-NEXT: [[TMP16:%.*]] = trunc i64 [[TMP10]] to i32

llvm/test/Transforms/LoopVectorize/vplan-printing.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ define void @print_expand_scev(i64 %y, ptr %ptr) {
457457
; CHECK-NEXT: <x1> vector loop: {
458458
; CHECK-NEXT: vector.body:
459459
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION ir<0>, vp<[[CAN_IV_NEXT:%.+]]>
460-
; CHECK-NEXT: ir<%iv> = WIDEN-INDUCTION ir<0>, vp<[[EXP_SCEV]]>, vp<[[VF]]> (truncated to i8)
460+
; CHECK-NEXT: ir<%iv> = WIDEN-INDUCTION ir<0>, vp<[[EXP_SCEV]]>, vp<[[VF]]>, vp<[[VF]]> (truncated to i8)
461461
; CHECK-NEXT: vp<[[DERIVED_IV:%.+]]> = DERIVED-IV ir<0> + vp<[[CAN_IV]]> * vp<[[EXP_SCEV]]>
462462
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[DERIVED_IV]]>, vp<[[EXP_SCEV]]>
463463
; CHECK-NEXT: WIDEN ir<%v3> = add nuw ir<%iv>, ir<1>

0 commit comments

Comments
 (0)