Skip to content

Commit 6efa3df

Browse files
committed
[VPlan] Handle interleave groups with trivially narrow operands.
If all operands to an interleave group are already trivially narrow, narrow the interleave group itself as well.
1 parent bc89380 commit 6efa3df

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3131,6 +3131,9 @@ static bool isConsecutiveInterleaveGroup(VPInterleaveRecipe *InterleaveR,
31313131
GroupSize == VectorRegWidth;
31323132
}
31333133

3134+
/// Returns true if \p VPValue is a narrow VPValue.
3135+
static bool isAlreadyNarrow(VPValue *VPV) { return VPV->isLiveIn(); }
3136+
31343137
void VPlanTransforms::narrowInterleaveGroups(VPlan &Plan, ElementCount VF,
31353138
unsigned VectorRegWidth) {
31363139
using namespace llvm::VPlanPatternMatch;
@@ -3182,6 +3185,16 @@ void VPlanTransforms::narrowInterleaveGroups(VPlan &Plan, ElementCount VF,
31823185
if (InterleaveR->getStoredValues().empty())
31833186
continue;
31843187

3188+
// Narrow interleave groups, if all operands are already matching narrow
3189+
// ops.
3190+
auto *Member0 = InterleaveR->getStoredValues()[0];
3191+
if (isAlreadyNarrow(Member0) &&
3192+
all_of(InterleaveR->getStoredValues(),
3193+
[Member0](VPValue *VPV) { return Member0 == VPV; })) {
3194+
StoreGroups.push_back(InterleaveR);
3195+
continue;
3196+
}
3197+
31853198
// For now, we only support full interleave groups storing load interleave
31863199
// groups.
31873200
if (all_of(enumerate(InterleaveR->getStoredValues()), [](auto Op) {
@@ -3252,13 +3265,16 @@ void VPlanTransforms::narrowInterleaveGroups(VPlan &Plan, ElementCount VF,
32523265
// Narrow operation tree rooted at store groups.
32533266
for (auto *StoreGroup : StoreGroups) {
32543267
VPValue *Res = nullptr;
3255-
if (auto *WideMember0 = dyn_cast<VPWidenRecipe>(
3256-
StoreGroup->getStoredValues()[0]->getDefiningRecipe())) {
3268+
VPValue *Member0 = StoreGroup->getStoredValues()[0];
3269+
if (isAlreadyNarrow(Member0)) {
3270+
Res = Member0;
3271+
} else if (auto *WideMember0 =
3272+
dyn_cast<VPWidenRecipe>(Member0->getDefiningRecipe())) {
32573273
for (unsigned Idx = 0, E = WideMember0->getNumOperands(); Idx != E; ++Idx)
32583274
WideMember0->setOperand(Idx, NarrowOp(WideMember0->getOperand(Idx)));
32593275
Res = WideMember0;
32603276
} else {
3261-
Res = NarrowOp(StoreGroup->getStoredValues()[0]);
3277+
Res = NarrowOp(Member0);
32623278
}
32633279

32643280
auto *S = new VPWidenStoreRecipe(

llvm/test/Transforms/LoopVectorize/AArch64/transform-narrow-interleave-to-widen-memory.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ define void @same_constant_store_interleave_group(i64 %x, ptr noalias %dst) {
216216
; VF2-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
217217
; VF2-NEXT: [[TMP0:%.*]] = shl nsw i64 [[INDEX]], 1
218218
; VF2-NEXT: [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[DST]], i64 [[TMP0]]
219-
; VF2-NEXT: store <4 x i64> zeroinitializer, ptr [[TMP1]], align 8
220-
; VF2-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
219+
; VF2-NEXT: store <2 x i64> zeroinitializer, ptr [[TMP1]], align 8
220+
; VF2-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 1
221221
; VF2-NEXT: [[TMP2:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
222222
; VF2-NEXT: br i1 [[TMP2]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
223223
; VF2: [[MIDDLE_BLOCK]]:

0 commit comments

Comments
 (0)