Skip to content

Commit 588c491

Browse files
nikickrishna2803
authored andcommitted
[InstCombine] Strip trailing zero GEP indices (llvm#151338)
Zero indices at the end do not change the GEP offset and can be removed. (Doing the same at the start requires adjusting the source element type.)
1 parent 5f3a51b commit 588c491

File tree

10 files changed

+74
-73
lines changed

10 files changed

+74
-73
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3205,6 +3205,14 @@ Instruction *InstCombinerImpl::visitGetElementPtrInst(GetElementPtrInst &GEP) {
32053205
return replaceInstUsesWith(GEP, NewGEP);
32063206
}
32073207

3208+
// Strip trailing zero indices.
3209+
auto *LastIdx = dyn_cast<Constant>(Indices.back());
3210+
if (LastIdx && LastIdx->isNullValue() && !LastIdx->getType()->isVectorTy()) {
3211+
return replaceInstUsesWith(
3212+
GEP, Builder.CreateGEP(GEP.getSourceElementType(), PtrOp,
3213+
drop_end(Indices), "", GEP.getNoWrapFlags()));
3214+
}
3215+
32083216
// Scalarize vector operands; prefer splat-of-gep.as canonical form.
32093217
// Note that this looses information about undef lanes; we run it after
32103218
// demanded bits to partially mitigate that loss.

llvm/test/Transforms/InstCombine/load-cmp.ll

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,7 @@ define i1 @test10_struct(i32 %x) {
215215

216216
define i1 @test10_struct_noinbounds(i32 %x) {
217217
; CHECK-LABEL: @test10_struct_noinbounds(
218-
; CHECK-NEXT: [[P:%.*]] = getelementptr [[FOO:%.*]], ptr @GS, i32 [[X:%.*]], i32 0
219-
; CHECK-NEXT: [[Q:%.*]] = load i32, ptr [[P]], align 4
220-
; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[Q]], 9
221-
; CHECK-NEXT: ret i1 [[R]]
218+
; CHECK-NEXT: ret i1 false
222219
;
223220
%p = getelementptr %Foo, ptr @GS, i32 %x, i32 0
224221
%q = load i32, ptr %p
@@ -252,11 +249,7 @@ define i1 @test10_struct_i64(i64 %x){
252249

253250
define i1 @test10_struct_noinbounds_i16(i16 %x) {
254251
; CHECK-LABEL: @test10_struct_noinbounds_i16(
255-
; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[X:%.*]] to i32
256-
; CHECK-NEXT: [[P:%.*]] = getelementptr [[FOO:%.*]], ptr @GS, i32 [[TMP1]], i32 0
257-
; CHECK-NEXT: [[Q:%.*]] = load i32, ptr [[P]], align 4
258-
; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[Q]], 0
259-
; CHECK-NEXT: ret i1 [[R]]
252+
; CHECK-NEXT: ret i1 false
260253
;
261254
%p = getelementptr %Foo, ptr @GS, i16 %x, i32 0
262255
%q = load i32, ptr %p

llvm/test/Transforms/InstCombine/strcmp-3.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ define i32 @fold_strcmp_a5i0_a5i1_to_0() {
2525

2626
define i32 @call_strcmp_a5i0_a5iI(i64 %I) {
2727
; CHECK-LABEL: @call_strcmp_a5i0_a5iI(
28-
; CHECK-NEXT: [[Q:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5, i64 0, i64 [[I:%.*]], i64 0
28+
; CHECK-NEXT: [[Q:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5, i64 0, i64 [[I:%.*]]
2929
; CHECK-NEXT: [[CMP:%.*]] = call i32 @strcmp(ptr noundef nonnull dereferenceable(4) @a5, ptr noundef nonnull dereferenceable(1) [[Q]])
3030
; CHECK-NEXT: ret i32 [[CMP]]
3131
;
@@ -40,7 +40,7 @@ define i32 @call_strcmp_a5i0_a5iI(i64 %I) {
4040

4141
define i32 @call_strcmp_a5iI_a5i0(i64 %I) {
4242
; CHECK-LABEL: @call_strcmp_a5iI_a5i0(
43-
; CHECK-NEXT: [[P:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5, i64 0, i64 [[I:%.*]], i64 0
43+
; CHECK-NEXT: [[P:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5, i64 0, i64 [[I:%.*]]
4444
; CHECK-NEXT: [[CMP:%.*]] = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) [[P]], ptr noundef nonnull dereferenceable(4) @a5)
4545
; CHECK-NEXT: ret i32 [[CMP]]
4646
;

llvm/test/Transforms/InstCombine/vector_gep1-inseltpoison.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ define <2 x i1> @test5(<2 x ptr> %a) {
5555

5656
define <2 x ptr> @test7(<2 x ptr> %a) {
5757
; CHECK-LABEL: @test7(
58-
; CHECK-NEXT: [[W:%.*]] = getelementptr { i32, i32 }, <2 x ptr> [[A:%.*]], <2 x i64> <i64 5, i64 9>, i32 0
58+
; CHECK-NEXT: [[W:%.*]] = getelementptr { i32, i32 }, <2 x ptr> [[A:%.*]], <2 x i64> <i64 5, i64 9>
5959
; CHECK-NEXT: ret <2 x ptr> [[W]]
6060
;
6161
%w = getelementptr {i32, i32}, <2 x ptr> %a, <2 x i32> <i32 5, i32 9>, <2 x i32> zeroinitializer

llvm/test/Transforms/InstCombine/vector_gep1.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ define <2 x i1> @test5(<2 x ptr> %a) {
5555

5656
define <2 x ptr> @test7(<2 x ptr> %a) {
5757
; CHECK-LABEL: @test7(
58-
; CHECK-NEXT: [[W:%.*]] = getelementptr { i32, i32 }, <2 x ptr> [[A:%.*]], <2 x i64> <i64 5, i64 9>, i32 0
58+
; CHECK-NEXT: [[W:%.*]] = getelementptr { i32, i32 }, <2 x ptr> [[A:%.*]], <2 x i64> <i64 5, i64 9>
5959
; CHECK-NEXT: ret <2 x ptr> [[W]]
6060
;
6161
%w = getelementptr {i32, i32}, <2 x ptr> %a, <2 x i32> <i32 5, i32 9>, <2 x i32> zeroinitializer

llvm/test/Transforms/InstCombine/vectorgep-crash.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ define <8 x ptr> @test_vector_gep(ptr %arg1, <8 x i64> %arg2) {
1414
; CHECK-LABEL: define <8 x ptr> @test_vector_gep(
1515
; CHECK-SAME: ptr [[ARG1:%.*]], <8 x i64> [[ARG2:%.*]]) {
1616
; CHECK-NEXT: [[TOP:.*:]]
17-
; CHECK-NEXT: [[VECTORGEP14:%.*]] = getelementptr inbounds [[DUAL:%.*]], ptr [[ARG1]], <8 x i64> [[ARG2]], i32 1, i32 0, i64 0, i32 1, i32 0, i64 0
17+
; CHECK-NEXT: [[VECTORGEP14:%.*]] = getelementptr inbounds [[DUAL:%.*]], ptr [[ARG1]], <8 x i64> [[ARG2]], i32 1, i32 0, i64 0, i32 1
1818
; CHECK-NEXT: ret <8 x ptr> [[VECTORGEP14]]
1919
;
2020
top:

llvm/test/Transforms/LoopVectorize/AArch64/sve-interleaved-accesses.ll

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ define i32 @test_struct_load6(ptr %S) #1 {
267267
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
268268
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <vscale x 4 x i64> [ [[TMP2]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
269269
; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP16:%.*]], [[VECTOR_BODY]] ]
270-
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_ST6:%.*]], ptr [[S:%.*]], <vscale x 4 x i64> [[VEC_IND]], i32 0
270+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_ST6:%.*]], ptr [[S:%.*]], <vscale x 4 x i64> [[VEC_IND]]
271271
; CHECK-NEXT: [[WIDE_MASKED_GATHER:%.*]] = call <vscale x 4 x i32> @llvm.masked.gather.nxv4i32.nxv4p0(<vscale x 4 x ptr> [[TMP5]], i32 4, <vscale x 4 x i1> splat (i1 true), <vscale x 4 x i32> poison)
272272
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_ST6]], ptr [[S]], <vscale x 4 x i64> [[VEC_IND]], i32 1
273273
; CHECK-NEXT: [[WIDE_MASKED_GATHER1:%.*]] = call <vscale x 4 x i32> @llvm.masked.gather.nxv4i32.nxv4p0(<vscale x 4 x ptr> [[TMP6]], i32 4, <vscale x 4 x i1> splat (i1 true), <vscale x 4 x i32> poison)
@@ -366,7 +366,7 @@ define void @test_reversed_load2_store2(ptr noalias nocapture readonly %A, ptr n
366366
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
367367
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <vscale x 4 x i32> [ [[INDUCTION]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
368368
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]
369-
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_ST2:%.*]], ptr [[A:%.*]], i64 [[OFFSET_IDX]], i32 0
369+
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_ST2:%.*]], ptr [[A:%.*]], i64 [[OFFSET_IDX]]
370370
; CHECK-NEXT: [[TMP6:%.*]] = shl nuw nsw i64 [[TMP0]], 3
371371
; CHECK-NEXT: [[TMP8:%.*]] = sub nsw i64 2, [[TMP6]]
372372
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP4]], i64 [[TMP8]]
@@ -378,7 +378,7 @@ define void @test_reversed_load2_store2(ptr noalias nocapture readonly %A, ptr n
378378
; CHECK-NEXT: [[REVERSE1:%.*]] = call <vscale x 4 x i32> @llvm.vector.reverse.nxv4i32(<vscale x 4 x i32> [[TMP11]])
379379
; CHECK-NEXT: [[TMP12:%.*]] = add nsw <vscale x 4 x i32> [[REVERSE]], [[VEC_IND]]
380380
; CHECK-NEXT: [[TMP13:%.*]] = sub nsw <vscale x 4 x i32> [[REVERSE1]], [[VEC_IND]]
381-
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds [[STRUCT_ST2]], ptr [[B:%.*]], i64 [[OFFSET_IDX]], i32 0
381+
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds [[STRUCT_ST2]], ptr [[B:%.*]], i64 [[OFFSET_IDX]]
382382
; CHECK-NEXT: [[TMP15:%.*]] = shl nuw nsw i64 [[TMP0]], 3
383383
; CHECK-NEXT: [[TMP18:%.*]] = sub nsw i64 2, [[TMP15]]
384384
; CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds i32, ptr [[TMP14]], i64 [[TMP18]]
@@ -587,7 +587,7 @@ define void @load_gap_reverse(ptr noalias nocapture readonly %P1, ptr noalias no
587587
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
588588
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <vscale x 4 x i64> [ [[INDUCTION]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
589589
; CHECK-NEXT: [[TMP4:%.*]] = add nsw <vscale x 4 x i64> [[BROADCAST_SPLAT1]], [[VEC_IND]]
590-
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[PAIR:%.*]], ptr [[P1:%.*]], <vscale x 4 x i64> [[VEC_IND]], i32 0
590+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[PAIR:%.*]], ptr [[P1:%.*]], <vscale x 4 x i64> [[VEC_IND]]
591591
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[PAIR]], ptr [[P2:%.*]], <vscale x 4 x i64> [[VEC_IND]], i32 1
592592
; CHECK-NEXT: [[WIDE_MASKED_GATHER:%.*]] = call <vscale x 4 x i64> @llvm.masked.gather.nxv4i64.nxv4p0(<vscale x 4 x ptr> [[TMP6]], i32 8, <vscale x 4 x i1> splat (i1 true), <vscale x 4 x i64> poison)
593593
; CHECK-NEXT: [[TMP7:%.*]] = sub nsw <vscale x 4 x i64> [[WIDE_MASKED_GATHER]], [[VEC_IND]]
@@ -729,7 +729,7 @@ define void @int_float_struct(ptr nocapture readonly %p) #0 {
729729
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
730730
; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x float> [ insertelement (<vscale x 4 x float> zeroinitializer, float undef, i32 0), [[VECTOR_PH]] ], [ [[TMP7:%.*]], [[VECTOR_BODY]] ]
731731
; CHECK-NEXT: [[VEC_PHI1:%.*]] = phi <vscale x 4 x i32> [ insertelement (<vscale x 4 x i32> zeroinitializer, i32 undef, i32 0), [[VECTOR_PH]] ], [ [[TMP6:%.*]], [[VECTOR_BODY]] ]
732-
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[STRUCT_INTFLOAT:%.*]], ptr [[P:%.*]], i64 [[INDEX]], i32 0
732+
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[STRUCT_INTFLOAT:%.*]], ptr [[P:%.*]], i64 [[INDEX]]
733733
; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <vscale x 8 x i32>, ptr [[TMP2]], align 4
734734
; CHECK-NEXT: [[STRIDED_VEC:%.*]] = call { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.vector.deinterleave2.nxv8i32(<vscale x 8 x i32> [[WIDE_VEC]])
735735
; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[STRIDED_VEC]], 0
@@ -814,7 +814,7 @@ define void @PR27626_0(ptr %p, i32 %z, i64 %n) #1 {
814814
; CHECK: vector.body:
815815
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
816816
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <vscale x 4 x i64> [ [[TMP9]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
817-
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[PAIR_I32:%.*]], ptr [[P:%.*]], <vscale x 4 x i64> [[VEC_IND]], i32 0
817+
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[PAIR_I32:%.*]], ptr [[P:%.*]], <vscale x 4 x i64> [[VEC_IND]]
818818
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds [[PAIR_I32]], ptr [[P]], <vscale x 4 x i64> [[VEC_IND]], i32 1
819819
; CHECK-NEXT: call void @llvm.masked.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32> [[BROADCAST_SPLAT]], <vscale x 4 x ptr> [[TMP12]], i32 4, <vscale x 4 x i1> splat (i1 true))
820820
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <vscale x 4 x ptr> [[TMP12]], i64 0
@@ -885,7 +885,7 @@ define i32 @PR27626_1(ptr %p, i64 %n) #1 {
885885
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
886886
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <vscale x 4 x i64> [ [[TMP9]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
887887
; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP17:%.*]], [[VECTOR_BODY]] ]
888-
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[PAIR_I32:%.*]], ptr [[P:%.*]], i64 [[INDEX]], i32 0
888+
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[PAIR_I32:%.*]], ptr [[P:%.*]], i64 [[INDEX]]
889889
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds [[PAIR_I32]], ptr [[P]], <vscale x 4 x i64> [[VEC_IND]], i32 1
890890
; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <vscale x 8 x i32>, ptr [[TMP12]], align 4
891891
; CHECK-NEXT: [[STRIDED_VEC:%.*]] = call { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.vector.deinterleave2.nxv8i32(<vscale x 8 x i32> [[WIDE_VEC]])
@@ -963,7 +963,7 @@ define void @PR27626_2(ptr %p, i64 %n, i32 %z) #1 {
963963
; CHECK: vector.body:
964964
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
965965
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <vscale x 4 x i64> [ [[TMP9]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
966-
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[PAIR_I32:%.*]], ptr [[P:%.*]], <vscale x 4 x i64> [[VEC_IND]], i32 0
966+
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[PAIR_I32:%.*]], ptr [[P:%.*]], <vscale x 4 x i64> [[VEC_IND]]
967967
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 -8
968968
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds [[PAIR_I32]], ptr [[P]], <vscale x 4 x i64> [[VEC_IND]], i32 1
969969
; CHECK-NEXT: call void @llvm.masked.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32> [[BROADCAST_SPLAT]], <vscale x 4 x ptr> [[TMP12]], i32 4, <vscale x 4 x i1> splat (i1 true))
@@ -1036,7 +1036,7 @@ define i32 @PR27626_3(ptr %p, i64 %n, i32 %z) #1 {
10361036
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <vscale x 4 x i64> [ [[TMP9]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
10371037
; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP18:%.*]], [[VECTOR_BODY]] ]
10381038
; CHECK-NEXT: [[TMP12:%.*]] = add nuw nsw <vscale x 4 x i64> [[VEC_IND]], splat (i64 1)
1039-
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds [[PAIR_I32:%.*]], ptr [[P:%.*]], i64 [[INDEX]], i32 0
1039+
; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds [[PAIR_I32:%.*]], ptr [[P:%.*]], i64 [[INDEX]]
10401040
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds [[PAIR_I32]], ptr [[P]], i64 [[INDEX]], i32 1
10411041
; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds [[PAIR_I32]], ptr [[P]], <vscale x 4 x i64> [[TMP12]], i32 1
10421042
; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <vscale x 8 x i32>, ptr [[TMP13]], align 4
@@ -1572,7 +1572,7 @@ define void @interleave_deinterleave_reverse(ptr noalias nocapture readonly %A,
15721572
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
15731573
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <vscale x 4 x i32> [ [[INDUCTION]], [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
15741574
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]
1575-
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_XYZT:%.*]], ptr [[A:%.*]], i64 [[OFFSET_IDX]], i32 0
1575+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_XYZT:%.*]], ptr [[A:%.*]], i64 [[OFFSET_IDX]]
15761576
; CHECK-NEXT: [[TMP6:%.*]] = shl nuw nsw i64 [[TMP0]], 4
15771577
; CHECK-NEXT: [[TMP9:%.*]] = sub nsw i64 4, [[TMP6]]
15781578
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i64 [[TMP9]]
@@ -1590,7 +1590,7 @@ define void @interleave_deinterleave_reverse(ptr noalias nocapture readonly %A,
15901590
; CHECK-NEXT: [[TMP18:%.*]] = sub nsw <vscale x 4 x i32> [[REVERSE3]], [[VEC_IND]]
15911591
; CHECK-NEXT: [[TMP19:%.*]] = mul nsw <vscale x 4 x i32> [[REVERSE4]], [[VEC_IND]]
15921592
; CHECK-NEXT: [[TMP20:%.*]] = shl nuw nsw <vscale x 4 x i32> [[REVERSE5]], [[VEC_IND]]
1593-
; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds [[STRUCT_XYZT]], ptr [[B:%.*]], i64 [[OFFSET_IDX]], i32 0
1593+
; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds [[STRUCT_XYZT]], ptr [[B:%.*]], i64 [[OFFSET_IDX]]
15941594
; CHECK-NEXT: [[TMP22:%.*]] = shl nuw nsw i64 [[TMP0]], 4
15951595
; CHECK-NEXT: [[TMP25:%.*]] = sub nsw i64 4, [[TMP22]]
15961596
; CHECK-NEXT: [[TMP26:%.*]] = getelementptr inbounds i32, ptr [[TMP21]], i64 [[TMP25]]

llvm/test/Transforms/LoopVectorize/consecutive-ptr-uniforms.ll

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ for.end:
8787
; CHECK: %[[I1:.+]] = or disjoint i64 %index, 1
8888
; CHECK: %[[I2:.+]] = or disjoint i64 %index, 2
8989
; CHECK: %[[I3:.+]] = or disjoint i64 %index, 3
90-
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %index, i32 0
91-
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I1]], i32 0
92-
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I2]], i32 0
93-
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I3]], i32 0
90+
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %index
91+
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I1]]
92+
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I2]]
93+
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I3]]
9494
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %index, i32 1
9595
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I1]], i32 1
9696
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I2]], i32 1
@@ -102,7 +102,7 @@ for.end:
102102
; INTER: vector.body
103103
; INTER: %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
104104
; INTER-NOT: getelementptr
105-
; INTER: getelementptr inbounds %pair, ptr %p, i64 %index, i32 0
105+
; INTER: getelementptr inbounds %pair, ptr %p, i64 %index
106106
; INTER-NOT: getelementptr
107107
; INTER: br i1 {{.*}}, label %middle.block, label %vector.body
108108
;
@@ -145,10 +145,10 @@ for.end:
145145
; CHECK: %[[I1:.+]] = add i64 [[OFFSET_IDX]], -1
146146
; CHECK: %[[I2:.+]] = add i64 [[OFFSET_IDX]], -2
147147
; CHECK: %[[I3:.+]] = add i64 [[OFFSET_IDX]], -3
148-
; CHECK: getelementptr inbounds %pair, ptr %p, i64 [[OFFSET_IDX]], i32 0
149-
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I1]], i32 0
150-
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I2]], i32 0
151-
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I3]], i32 0
148+
; CHECK: getelementptr inbounds %pair, ptr %p, i64 [[OFFSET_IDX]]
149+
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I1]]
150+
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I2]]
151+
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I3]]
152152
; CHECK: getelementptr inbounds %pair, ptr %p, i64 [[OFFSET_IDX]], i32 1
153153
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I1]], i32 1
154154
; CHECK: getelementptr inbounds %pair, ptr %p, i64 %[[I2]], i32 1
@@ -161,7 +161,7 @@ for.end:
161161
; INTER: %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
162162
; INTER: [[OFFSET_IDX:%.+]] = sub i64 %n, %index
163163
; INTER-NOT: getelementptr
164-
; INTER: %[[G0:.+]] = getelementptr inbounds %pair, ptr %p, i64 [[OFFSET_IDX]], i32 0
164+
; INTER: %[[G0:.+]] = getelementptr inbounds %pair, ptr %p, i64 [[OFFSET_IDX]]
165165
; INTER: getelementptr inbounds i8, ptr %[[G0]], i64 -24
166166
; INTER-NOT: getelementptr
167167
; INTER: br i1 {{.*}}, label %middle.block, label %vector.body
@@ -200,14 +200,14 @@ for.end:
200200
; INTER-NOT: LV: Found uniform instruction: %tmp0 = getelementptr inbounds %pair, ptr %p, i64 %i, i32 0
201201
; INTER: vector.body
202202
; INTER: %index = phi i64 [ 0, %vector.ph ], [ %index.next, {{.*}} ]
203-
; INTER: %[[G0:.+]] = getelementptr inbounds %pair, ptr %p, i64 %index, i32 0
203+
; INTER: %[[G0:.+]] = getelementptr inbounds %pair, ptr %p, i64 %index
204204
; INTER: %wide.vec = load <8 x i32>, ptr %[[G0]], align 8
205-
; INTER: %[[I1:.+]] = or disjoint i64 %index, 1
206-
; INTER: getelementptr inbounds %pair, ptr %p, i64 %[[I1]], i32 0
207-
; INTER: %[[I2:.+]] = or disjoint i64 %index, 2
208-
; INTER: getelementptr inbounds %pair, ptr %p, i64 %[[I2]], i32 0
209-
; INTER: %[[I3:.+]] = or disjoint i64 %index, 3
210-
; INTER: getelementptr inbounds %pair, ptr %p, i64 %[[I3]], i32 0
205+
; INTER: %[[G1:.+]] = getelementptr %pair, ptr %p, i64 %index
206+
; INTER: getelementptr i8, ptr %[[G1]], i64 8
207+
; INTER: %[[G2:.+]] = getelementptr %pair, ptr %p, i64 %index
208+
; INTER: getelementptr i8, ptr %[[G2]], i64 16
209+
; INTER: %[[G3:.+]] = getelementptr %pair, ptr %p, i64 %index
210+
; INTER: getelementptr i8, ptr %[[G3]], i64 24
211211
; INTER: br i1 {{.*}}, label %middle.block, label %vector.body
212212
;
213213
define void @predicated_store(ptr %p, i32 %x, i64 %n) {

0 commit comments

Comments
 (0)