Skip to content

Commit bd17077

Browse files
committed
Fix: Correct the vector pointer when UF>1
1 parent 96d62b3 commit bd17077

File tree

3 files changed

+64
-61
lines changed

3 files changed

+64
-61
lines changed

llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2125,11 +2125,14 @@ void VPVectorPointerRecipe::execute(VPTransformState &State) {
21252125
CurrentPart, Builder);
21262126
Value *Ptr = State.get(getOperand(0), VPLane(0));
21272127

2128+
Value *Increment = createStepForVF(Builder, IndexTy, State.VF, CurrentPart);
21282129
// TODO: Support non-unit-reverse strided accesses.
2129-
int64_t Step = Strided ? -1 * CurrentPart : CurrentPart;
2130-
Value *Increment = createStepForVF(Builder, IndexTy, State.VF, Step);
2130+
Value *Index =
2131+
Strided
2132+
? Builder.CreateMul(Increment, ConstantInt::getSigned(IndexTy, -1))
2133+
: Increment;
21312134
Value *ResultPtr =
2132-
Builder.CreateGEP(IndexedTy, Ptr, Increment, "", getGEPNoWrapFlags());
2135+
Builder.CreateGEP(IndexedTy, Ptr, Index, "", getGEPNoWrapFlags());
21332136

21342137
State.set(this, ResultPtr, /*IsScalar*/ true);
21352138
}

llvm/test/Transforms/LoopVectorize/RISCV/riscv-vector-reverse-output.ll

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ define void @vector_reverse_i64(ptr noalias %A, ptr noalias %B, i32 %n) {
213213
; RV64-UF2-NEXT: [[TMP21:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP20]]
214214
; RV64-UF2-NEXT: [[TMP23:%.*]] = getelementptr inbounds i32, ptr [[TMP21]], i32 0
215215
; RV64-UF2-NEXT: [[TMP22:%.*]] = call i64 @llvm.vscale.i64()
216-
; RV64-UF2-NEXT: [[TMP26:%.*]] = mul i64 [[TMP22]], 4294967292
216+
; RV64-UF2-NEXT: [[TMP24:%.*]] = mul i64 [[TMP22]], 4
217+
; RV64-UF2-NEXT: [[TMP26:%.*]] = mul i64 [[TMP24]], -1
217218
; RV64-UF2-NEXT: [[TMP28:%.*]] = getelementptr inbounds i32, ptr [[TMP21]], i64 [[TMP26]]
218219
; RV64-UF2-NEXT: [[TMP25:%.*]] = call i32 @llvm.vscale.i32()
219220
; RV64-UF2-NEXT: [[TMP29:%.*]] = mul i32 [[TMP25]], 4
@@ -226,7 +227,8 @@ define void @vector_reverse_i64(ptr noalias %A, ptr noalias %B, i32 %n) {
226227
; RV64-UF2-NEXT: [[TMP32:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP20]]
227228
; RV64-UF2-NEXT: [[TMP35:%.*]] = getelementptr inbounds i32, ptr [[TMP32]], i32 0
228229
; RV64-UF2-NEXT: [[TMP33:%.*]] = call i64 @llvm.vscale.i64()
229-
; RV64-UF2-NEXT: [[TMP37:%.*]] = mul i64 [[TMP33]], 4294967292
230+
; RV64-UF2-NEXT: [[TMP44:%.*]] = mul i64 [[TMP33]], 4
231+
; RV64-UF2-NEXT: [[TMP37:%.*]] = mul i64 [[TMP44]], -1
230232
; RV64-UF2-NEXT: [[TMP39:%.*]] = getelementptr inbounds i32, ptr [[TMP32]], i64 [[TMP37]]
231233
; RV64-UF2-NEXT: [[TMP36:%.*]] = call i32 @llvm.vscale.i32()
232234
; RV64-UF2-NEXT: [[TMP40:%.*]] = mul i32 [[TMP36]], 4
@@ -483,7 +485,8 @@ define void @vector_reverse_f32(ptr noalias %A, ptr noalias %B, i32 %n) {
483485
; RV64-UF2-NEXT: [[TMP21:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP20]]
484486
; RV64-UF2-NEXT: [[TMP23:%.*]] = getelementptr inbounds float, ptr [[TMP21]], i32 0
485487
; RV64-UF2-NEXT: [[TMP22:%.*]] = call i64 @llvm.vscale.i64()
486-
; RV64-UF2-NEXT: [[TMP26:%.*]] = mul i64 [[TMP22]], 4294967292
488+
; RV64-UF2-NEXT: [[TMP24:%.*]] = mul i64 [[TMP22]], 4
489+
; RV64-UF2-NEXT: [[TMP26:%.*]] = mul i64 [[TMP24]], -1
487490
; RV64-UF2-NEXT: [[TMP28:%.*]] = getelementptr inbounds float, ptr [[TMP21]], i64 [[TMP26]]
488491
; RV64-UF2-NEXT: [[TMP25:%.*]] = call i32 @llvm.vscale.i32()
489492
; RV64-UF2-NEXT: [[TMP29:%.*]] = mul i32 [[TMP25]], 4
@@ -496,7 +499,8 @@ define void @vector_reverse_f32(ptr noalias %A, ptr noalias %B, i32 %n) {
496499
; RV64-UF2-NEXT: [[TMP32:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP20]]
497500
; RV64-UF2-NEXT: [[TMP35:%.*]] = getelementptr inbounds float, ptr [[TMP32]], i32 0
498501
; RV64-UF2-NEXT: [[TMP33:%.*]] = call i64 @llvm.vscale.i64()
499-
; RV64-UF2-NEXT: [[TMP37:%.*]] = mul i64 [[TMP33]], 4294967292
502+
; RV64-UF2-NEXT: [[TMP44:%.*]] = mul i64 [[TMP33]], 4
503+
; RV64-UF2-NEXT: [[TMP37:%.*]] = mul i64 [[TMP44]], -1
500504
; RV64-UF2-NEXT: [[TMP39:%.*]] = getelementptr inbounds float, ptr [[TMP32]], i64 [[TMP37]]
501505
; RV64-UF2-NEXT: [[TMP36:%.*]] = call i32 @llvm.vscale.i32()
502506
; RV64-UF2-NEXT: [[TMP40:%.*]] = mul i32 [[TMP36]], 4

0 commit comments

Comments
 (0)