@@ -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+
31343137void 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 (
0 commit comments