Skip to content

Commit 86ac70a

Browse files
committed
!fixup address remaining comments.
1 parent b45c3aa commit 86ac70a

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed

llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ bool VPRecipeBase::mayWriteToMemory() const {
7272
case VPBranchOnMaskSC:
7373
case VPScalarIVStepsSC:
7474
case VPPredInstPHISC:
75-
case VPVectorPointerSC:
7675
return false;
7776
case VPBlendSC:
7877
case VPReductionEVLSC:
7978
case VPReductionSC:
79+
case VPVectorPointerSC:
8080
case VPWidenCanonicalIVSC:
8181
case VPWidenCastSC:
8282
case VPWidenGEPSC:

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2236,7 +2236,14 @@ void VPlanTransforms::materializeBroadcasts(VPlan &Plan) {
22362236
}
22372237
}
22382238

2239-
static bool supportedLoad(VPWidenRecipe *R0, VPValue *V, unsigned Idx) {
2239+
/// Returns true if \p V used at \p Idx of a wide recipe is defined by a
2240+
/// VPWidenLoadRecipe or VPInterleaveRecipe that can be converted to a narrower
2241+
/// recipe. A VPWidenLoadRecipe can be narrowed to an index independent load if
2242+
/// it feeds all the wide ops at all indices (checked by via the operands of the
2243+
/// wide recipe at lane0, \p R0). A VPInterleaveRecipe can be narrowed to a wide
2244+
/// load, if \p V used at index \p Idx are defined at \p Idx of the interleave
2245+
/// group.
2246+
static bool canNarrowLoad(VPWidenRecipe *R0, VPValue *V, unsigned Idx) {
22402247
auto *DefR = V->getDefiningRecipe();
22412248
if (!DefR)
22422249
return false;
@@ -2312,6 +2319,8 @@ void VPlanTransforms::narrowInterleaveGroups(VPlan &Plan, ElementCount VF,
23122319
if (R.mayWriteToMemory() && !InterleaveR)
23132320
return;
23142321

2322+
// All other ops are allowed, but we reject uses that cannot be converted
2323+
// when checking all allowed consumers (store interleave groups) below.
23152324
if (!InterleaveR)
23162325
continue;
23172326

@@ -2340,20 +2349,22 @@ void VPlanTransforms::narrowInterleaveGroups(VPlan &Plan, ElementCount VF,
23402349
continue;
23412350
}
23422351

2343-
auto *Lane0 = dyn_cast_or_null<VPWidenRecipe>(
2352+
// Check if all values feeding InterleaveR are matching wide recipes, which
2353+
// operands that can be narrowed.
2354+
auto *WideMember0 = dyn_cast_or_null<VPWidenRecipe>(
23442355
InterleaveR->getStoredValues()[0]->getDefiningRecipe());
2345-
if (!Lane0)
2356+
if (!WideMember0)
23462357
return;
23472358
for (const auto &[I, V] : enumerate(InterleaveR->getStoredValues())) {
23482359
auto *R = dyn_cast<VPWidenRecipe>(V->getDefiningRecipe());
2349-
if (!R || R->getOpcode() != Lane0->getOpcode() || R->getNumOperands() > 2)
2360+
if (!R || R->getOpcode() != WideMember0->getOpcode() ||
2361+
R->getNumOperands() > 2)
23502362
return;
2351-
if (any_of(R->operands(), [Lane0, Idx = I](VPValue *V) {
2352-
return !supportedLoad(Lane0, V, Idx);
2363+
if (any_of(R->operands(), [WideMember0, Idx = I](VPValue *V) {
2364+
return !canNarrowLoad(WideMember0, V, Idx);
23532365
}))
23542366
return;
23552367
}
2356-
23572368
StoreGroups.push_back(InterleaveR);
23582369
}
23592370

@@ -2386,12 +2397,12 @@ void VPlanTransforms::narrowInterleaveGroups(VPlan &Plan, ElementCount VF,
23862397
// Narrow operation tree rooted at store groups.
23872398
for (auto *StoreGroup : StoreGroups) {
23882399
VPValue *Res = nullptr;
2389-
if (auto *Lane0 = dyn_cast<VPWidenRecipe>(
2400+
if (auto *WideMember0 = dyn_cast<VPWidenRecipe>(
23902401
StoreGroup->getStoredValues()[0]->getDefiningRecipe())) {
2391-
for (unsigned Idx = 0, E = Lane0->getNumOperands(); Idx != E; ++Idx)
2392-
Lane0->setOperand(
2393-
Idx, NarrowOp(Lane0->getOperand(Idx)->getDefiningRecipe()));
2394-
Res = Lane0;
2402+
for (unsigned Idx = 0, E = WideMember0->getNumOperands(); Idx != E; ++Idx)
2403+
WideMember0->setOperand(
2404+
Idx, NarrowOp(WideMember0->getOperand(Idx)->getDefiningRecipe()));
2405+
Res = WideMember0;
23952406
} else {
23962407
Res = NarrowOp(StoreGroup->getStoredValues()[0]->getDefiningRecipe());
23972408
}

0 commit comments

Comments
 (0)