@@ -2603,13 +2603,25 @@ void VPWidenLoadRecipe::print(raw_ostream &O, const Twine &Indent,
2603
2603
}
2604
2604
#endif
2605
2605
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
+
2606
2617
void VPWidenLoadEVLRecipe::execute (VPTransformState &State) {
2607
2618
auto *LI = cast<LoadInst>(&Ingredient);
2608
2619
2609
2620
Type *ScalarDataTy = getLoadStoreType (&Ingredient);
2610
2621
auto *DataTy = VectorType::get (ScalarDataTy, State.VF );
2611
2622
const Align Alignment = getLoadStoreAlignment (&Ingredient);
2612
2623
bool CreateGather = !isConsecutive ();
2624
+ bool UseStridedLoadStore = State.TTI ->preferStridedLoadStore ();
2613
2625
2614
2626
auto &Builder = State.Builder ;
2615
2627
State.setDebugLocFrom (getDebugLoc ());
@@ -2619,6 +2631,8 @@ void VPWidenLoadEVLRecipe::execute(VPTransformState &State) {
2619
2631
Value *Mask = nullptr ;
2620
2632
if (VPValue *VPMask = getMask ()) {
2621
2633
Mask = State.get (VPMask);
2634
+ if (isReverse () && !UseStridedLoadStore)
2635
+ Mask = createReverseEVL (Builder, Mask, EVL, " vp.reverse.mask" );
2622
2636
} else {
2623
2637
Mask = Builder.CreateVectorSplat (State.VF , Builder.getTrue ());
2624
2638
}
@@ -2627,7 +2641,7 @@ void VPWidenLoadEVLRecipe::execute(VPTransformState &State) {
2627
2641
NewLI =
2628
2642
Builder.CreateIntrinsic (DataTy, Intrinsic::vp_gather, {Addr, Mask, EVL},
2629
2643
nullptr , " wide.masked.gather" );
2630
- } else if (isReverse ()) {
2644
+ } else if (isReverse () && UseStridedLoadStore ) {
2631
2645
auto *EltTy = DataTy->getElementType ();
2632
2646
auto *PtrTy = Addr->getType ();
2633
2647
Value *Operands[] = {
@@ -2648,6 +2662,8 @@ void VPWidenLoadEVLRecipe::execute(VPTransformState &State) {
2648
2662
0 , Attribute::getWithAlignment (NewLI->getContext (), Alignment));
2649
2663
State.addMetadata (NewLI, LI);
2650
2664
Instruction *Res = NewLI;
2665
+ if (isReverse () && !UseStridedLoadStore)
2666
+ Res = createReverseEVL (Builder, Res, EVL, " vp.reverse" );
2651
2667
State.set (this , Res);
2652
2668
}
2653
2669
@@ -2738,16 +2754,21 @@ void VPWidenStoreEVLRecipe::execute(VPTransformState &State) {
2738
2754
VPValue *StoredValue = getStoredValue ();
2739
2755
bool CreateScatter = !isConsecutive ();
2740
2756
const Align Alignment = getLoadStoreAlignment (&Ingredient);
2757
+ bool UseStridedLoadStore = State.TTI ->preferStridedLoadStore ();
2741
2758
2742
2759
auto &Builder = State.Builder ;
2743
2760
State.setDebugLocFrom (getDebugLoc ());
2744
2761
2745
2762
CallInst *NewSI = nullptr ;
2746
2763
Value *StoredVal = State.get (StoredValue);
2747
2764
Value *EVL = State.get (getEVL (), VPLane (0 ));
2765
+ if (isReverse () && !UseStridedLoadStore)
2766
+ StoredVal = createReverseEVL (Builder, StoredVal, EVL, " vp.reverse" );
2748
2767
Value *Mask = nullptr ;
2749
2768
if (VPValue *VPMask = getMask ()) {
2750
2769
Mask = State.get (VPMask);
2770
+ if (isReverse () && !UseStridedLoadStore)
2771
+ Mask = createReverseEVL (Builder, Mask, EVL, " vp.reverse.mask" );
2751
2772
} else {
2752
2773
Mask = Builder.CreateVectorSplat (State.VF , Builder.getTrue ());
2753
2774
}
@@ -2756,7 +2777,7 @@ void VPWidenStoreEVLRecipe::execute(VPTransformState &State) {
2756
2777
NewSI = Builder.CreateIntrinsic (Type::getVoidTy (EVL->getContext ()),
2757
2778
Intrinsic::vp_scatter,
2758
2779
{StoredVal, Addr, Mask, EVL});
2759
- } else if (isReverse ()) {
2780
+ } else if (isReverse () && UseStridedLoadStore ) {
2760
2781
Type *StoredValTy = StoredVal->getType ();
2761
2782
auto *EltTy = cast<VectorType>(StoredValTy)->getElementType ();
2762
2783
auto *PtrTy = Addr->getType ();
0 commit comments