@@ -2603,13 +2603,25 @@ void VPWidenLoadRecipe::print(raw_ostream &O, const Twine &Indent,
26032603}
26042604#endif
26052605
2606+ // / Use all-true mask for reverse rather than actual mask, as it avoids a
2607+ // / dependence w/o affecting the result.
2608+ static Instruction *createReverseEVL (IRBuilderBase &Builder, Value *Operand,
2609+ Value *EVL, const Twine &Name) {
2610+ VectorType *ValTy = cast<VectorType>(Operand->getType ());
2611+ Value *AllTrueMask =
2612+ Builder.CreateVectorSplat (ValTy->getElementCount (), Builder.getTrue ());
2613+ return Builder.CreateIntrinsic (ValTy, Intrinsic::experimental_vp_reverse,
2614+ {Operand, AllTrueMask, EVL}, nullptr , Name);
2615+ }
2616+
26062617void VPWidenLoadEVLRecipe::execute (VPTransformState &State) {
26072618 auto *LI = cast<LoadInst>(&Ingredient);
26082619
26092620 Type *ScalarDataTy = getLoadStoreType (&Ingredient);
26102621 auto *DataTy = VectorType::get (ScalarDataTy, State.VF );
26112622 const Align Alignment = getLoadStoreAlignment (&Ingredient);
26122623 bool CreateGather = !isConsecutive ();
2624+ bool UseStridedLoadStore = State.TTI ->preferStridedLoadStore ();
26132625
26142626 auto &Builder = State.Builder ;
26152627 State.setDebugLocFrom (getDebugLoc ());
@@ -2619,6 +2631,8 @@ void VPWidenLoadEVLRecipe::execute(VPTransformState &State) {
26192631 Value *Mask = nullptr ;
26202632 if (VPValue *VPMask = getMask ()) {
26212633 Mask = State.get (VPMask);
2634+ if (isReverse () && !UseStridedLoadStore)
2635+ Mask = createReverseEVL (Builder, Mask, EVL, " vp.reverse.mask" );
26222636 } else {
26232637 Mask = Builder.CreateVectorSplat (State.VF , Builder.getTrue ());
26242638 }
@@ -2627,7 +2641,7 @@ void VPWidenLoadEVLRecipe::execute(VPTransformState &State) {
26272641 NewLI =
26282642 Builder.CreateIntrinsic (DataTy, Intrinsic::vp_gather, {Addr, Mask, EVL},
26292643 nullptr , " wide.masked.gather" );
2630- } else if (isReverse ()) {
2644+ } else if (isReverse () && UseStridedLoadStore ) {
26312645 auto *EltTy = DataTy->getElementType ();
26322646 auto *PtrTy = Addr->getType ();
26332647 Value *Operands[] = {
@@ -2648,6 +2662,8 @@ void VPWidenLoadEVLRecipe::execute(VPTransformState &State) {
26482662 0 , Attribute::getWithAlignment (NewLI->getContext (), Alignment));
26492663 State.addMetadata (NewLI, LI);
26502664 Instruction *Res = NewLI;
2665+ if (isReverse () && !UseStridedLoadStore)
2666+ Res = createReverseEVL (Builder, Res, EVL, " vp.reverse" );
26512667 State.set (this , Res);
26522668}
26532669
@@ -2738,16 +2754,21 @@ void VPWidenStoreEVLRecipe::execute(VPTransformState &State) {
27382754 VPValue *StoredValue = getStoredValue ();
27392755 bool CreateScatter = !isConsecutive ();
27402756 const Align Alignment = getLoadStoreAlignment (&Ingredient);
2757+ bool UseStridedLoadStore = State.TTI ->preferStridedLoadStore ();
27412758
27422759 auto &Builder = State.Builder ;
27432760 State.setDebugLocFrom (getDebugLoc ());
27442761
27452762 CallInst *NewSI = nullptr ;
27462763 Value *StoredVal = State.get (StoredValue);
27472764 Value *EVL = State.get (getEVL (), VPLane (0 ));
2765+ if (isReverse () && !UseStridedLoadStore)
2766+ StoredVal = createReverseEVL (Builder, StoredVal, EVL, " vp.reverse" );
27482767 Value *Mask = nullptr ;
27492768 if (VPValue *VPMask = getMask ()) {
27502769 Mask = State.get (VPMask);
2770+ if (isReverse () && !UseStridedLoadStore)
2771+ Mask = createReverseEVL (Builder, Mask, EVL, " vp.reverse.mask" );
27512772 } else {
27522773 Mask = Builder.CreateVectorSplat (State.VF , Builder.getTrue ());
27532774 }
@@ -2756,7 +2777,7 @@ void VPWidenStoreEVLRecipe::execute(VPTransformState &State) {
27562777 NewSI = Builder.CreateIntrinsic (Type::getVoidTy (EVL->getContext ()),
27572778 Intrinsic::vp_scatter,
27582779 {StoredVal, Addr, Mask, EVL});
2759- } else if (isReverse ()) {
2780+ } else if (isReverse () && UseStridedLoadStore ) {
27602781 Type *StoredValTy = StoredVal->getType ();
27612782 auto *EltTy = cast<VectorType>(StoredValTy)->getElementType ();
27622783 auto *PtrTy = Addr->getType ();
0 commit comments