@@ -5625,10 +5625,13 @@ static bool isAlreadyNarrow(VPValue *VPV) {
56255625 return RepR && RepR->isSingleScalar ();
56265626}
56275627
5628- // Convert a wide recipe defining a VPValue \p V feeding an interleave group to
5629- // a narrow variant.
5628+ // Convert the wide recipes defining the VPValues in \p Members feeding an
5629+ // interleave group to a single narrow variant. The first member is reused as
5630+ // the narrowed recipe.
56305631static VPValue *
5631- narrowInterleaveGroupOp (VPValue *V, SmallPtrSetImpl<VPValue *> &NarrowedOps) {
5632+ narrowInterleaveGroupOp (ArrayRef<VPValue *> Members,
5633+ SmallPtrSetImpl<VPValue *> &NarrowedOps) {
5634+ VPValue *V = Members.front ();
56325635 auto *R = V->getDefiningRecipe ();
56335636 if (!R || NarrowedOps.contains (V))
56345637 return V;
@@ -5637,11 +5640,15 @@ narrowInterleaveGroupOp(VPValue *V, SmallPtrSetImpl<VPValue *> &NarrowedOps) {
56375640 return V;
56385641
56395642 if (isa<VPWidenRecipe, VPWidenCastRecipe>(R)) {
5640- auto *WideMember0 = cast<VPSingleDefRecipe>(R);
5641- for (unsigned Idx = 0 , E = WideMember0->getNumOperands (); Idx != E; ++Idx)
5642- WideMember0->setOperand (
5643- Idx,
5644- narrowInterleaveGroupOp (WideMember0->getOperand (Idx), NarrowedOps));
5643+ auto *WideMember0 = cast<VPRecipeWithIRFlags>(R);
5644+ for (VPValue *Member : Members.drop_front ())
5645+ WideMember0->intersectFlags (*cast<VPRecipeWithIRFlags>(Member));
5646+ for (unsigned Idx = 0 , E = WideMember0->getNumOperands (); Idx != E; ++Idx) {
5647+ SmallVector<VPValue *> OpsI;
5648+ for (VPValue *Member : Members)
5649+ OpsI.push_back (Member->getDefiningRecipe ()->getOperand (Idx));
5650+ WideMember0->setOperand (Idx, narrowInterleaveGroupOp (OpsI, NarrowedOps));
5651+ }
56455652 return V;
56465653 }
56475654
@@ -5808,7 +5815,7 @@ VPlanTransforms::narrowInterleaveGroups(VPlan &Plan,
58085815 // Narrow operation tree rooted at store groups.
58095816 for (auto *StoreGroup : StoreGroups) {
58105817 VPValue *Res =
5811- narrowInterleaveGroupOp (StoreGroup->getStoredValues ()[ 0 ] , NarrowedOps);
5818+ narrowInterleaveGroupOp (StoreGroup->getStoredValues (), NarrowedOps);
58125819 auto *SI =
58135820 cast<StoreInst>(StoreGroup->getInterleaveGroup ()->getInsertPos ());
58145821 auto *S = new VPWidenStoreRecipe (*SI, StoreGroup->getAddr (), Res, nullptr ,
0 commit comments