Skip to content

Commit 870743f

Browse files
committed
DSE: pre-commit tests for scalable vectors
As AliasAnalysis now has support for scalable sizes, add tests to DeadStoreElimination covering the scalable vectors case, in preparation to extend it.
1 parent 7fa0d05 commit 870743f

File tree

2 files changed

+201
-4
lines changed

2 files changed

+201
-4
lines changed

llvm/test/Transforms/DeadStoreElimination/offsetted-overlapping-stores.ll

Lines changed: 122 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,98 @@ bb:
4747
ret void
4848
}
4949

50+
define void @ScalableVectorTestFullyOverlapping(ptr %arg, i32 %i) vscale_range(1, 2) {
51+
; CHECK-LABEL: @ScalableVectorTestFullyOverlapping(
52+
; CHECK-NEXT: bb:
53+
; CHECK-NEXT: [[I7:%.*]] = add nuw nsw i32 [[I:%.*]], 1
54+
; CHECK-NEXT: [[I8:%.*]] = zext i32 [[I7]] to i64
55+
; CHECK-NEXT: [[I9:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[I8]]
56+
; CHECK-NEXT: store float 0.000000e+00, ptr [[I9]], align 4
57+
; CHECK-NEXT: [[I2:%.*]] = zext i32 [[I]] to i64
58+
; CHECK-NEXT: [[I3:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[I2]]
59+
; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[I3]], align 8
60+
; CHECK-NEXT: ret void
61+
;
62+
bb:
63+
%i7 = add nuw nsw i32 %i, 1
64+
%i8 = zext i32 %i7 to i64
65+
%i9 = getelementptr inbounds float, ptr %arg, i64 %i8
66+
store float 0.0, ptr %i9
67+
%i2 = zext i32 %i to i64
68+
%i3 = getelementptr inbounds float, ptr %arg, i64 %i2
69+
store <vscale x 2 x float> zeroinitializer, ptr %i3
70+
ret void
71+
}
72+
73+
define void @ScalableVectorTestFullyOverlapping2(ptr %arg, i32 %i) {
74+
; CHECK-LABEL: @ScalableVectorTestFullyOverlapping2(
75+
; CHECK-NEXT: bb:
76+
; CHECK-NEXT: [[I7:%.*]] = add nuw nsw i32 [[I:%.*]], 1
77+
; CHECK-NEXT: [[I8:%.*]] = zext i32 [[I7]] to i64
78+
; CHECK-NEXT: [[I9:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[I8]]
79+
; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[I9]], align 8
80+
; CHECK-NEXT: [[I2:%.*]] = zext i32 [[I]] to i64
81+
; CHECK-NEXT: [[I3:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[I2]]
82+
; CHECK-NEXT: store <vscale x 4 x float> zeroinitializer, ptr [[I3]], align 16
83+
; CHECK-NEXT: ret void
84+
;
85+
bb:
86+
%i7 = add nuw nsw i32 %i, 1
87+
%i8 = zext i32 %i7 to i64
88+
%i9 = getelementptr inbounds float, ptr %arg, i64 %i8
89+
store <vscale x 2 x float> zeroinitializer, ptr %i9
90+
%i2 = zext i32 %i to i64
91+
%i3 = getelementptr inbounds float, ptr %arg, i64 %i2
92+
store <vscale x 4 x float> zeroinitializer, ptr %i3
93+
ret void
94+
}
95+
96+
define void @ScalableVectorTestNonOverlapping(ptr %arg, i32 %i) vscale_range(1, 2) {
97+
; CHECK-LABEL: @ScalableVectorTestNonOverlapping(
98+
; CHECK-NEXT: bb:
99+
; CHECK-NEXT: [[I7:%.*]] = add nuw nsw i32 [[I:%.*]], 10
100+
; CHECK-NEXT: [[I8:%.*]] = zext i32 [[I7]] to i64
101+
; CHECK-NEXT: [[I9:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[I8]]
102+
; CHECK-NEXT: store float 0.000000e+00, ptr [[I9]], align 4
103+
; CHECK-NEXT: [[I2:%.*]] = zext i32 [[I]] to i64
104+
; CHECK-NEXT: [[I3:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[I2]]
105+
; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[I3]], align 8
106+
; CHECK-NEXT: ret void
107+
;
108+
bb:
109+
%i7 = add nuw nsw i32 %i, 10
110+
%i8 = zext i32 %i7 to i64
111+
%i9 = getelementptr inbounds float, ptr %arg, i64 %i8
112+
store float 0.0, ptr %i9
113+
%i2 = zext i32 %i to i64
114+
%i3 = getelementptr inbounds float, ptr %arg, i64 %i2
115+
store <vscale x 2 x float> zeroinitializer, ptr %i3
116+
ret void
117+
}
118+
119+
define void @ScalableVectorTestNonOverlapping2(ptr %arg, i32 %i) vscale_range(1, 2) {
120+
; CHECK-LABEL: @ScalableVectorTestNonOverlapping2(
121+
; CHECK-NEXT: bb:
122+
; CHECK-NEXT: [[I7:%.*]] = add nuw nsw i32 [[I:%.*]], 10
123+
; CHECK-NEXT: [[I8:%.*]] = zext i32 [[I7]] to i64
124+
; CHECK-NEXT: [[I9:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[I8]]
125+
; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[I9]], align 8
126+
; CHECK-NEXT: [[I2:%.*]] = zext i32 [[I]] to i64
127+
; CHECK-NEXT: [[I3:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[I2]]
128+
; CHECK-NEXT: store <vscale x 4 x float> zeroinitializer, ptr [[I3]], align 16
129+
; CHECK-NEXT: ret void
130+
;
131+
bb:
132+
%i7 = add nuw nsw i32 %i, 10
133+
%i8 = zext i32 %i7 to i64
134+
%i9 = getelementptr inbounds float, ptr %arg, i64 %i8
135+
store <vscale x 2 x float> zeroinitializer, ptr %i9
136+
%i2 = zext i32 %i to i64
137+
%i3 = getelementptr inbounds float, ptr %arg, i64 %i2
138+
store <vscale x 4 x float> zeroinitializer, ptr %i3
139+
ret void
140+
}
141+
50142
define void @ArrayTestPartiallyOverlapping(i64 %0) {
51143
;
52144
; The DSE pass will not kill the store because the overlap is partial
@@ -55,9 +147,9 @@ define void @ArrayTestPartiallyOverlapping(i64 %0) {
55147
; CHECK-LABEL: @ArrayTestPartiallyOverlapping(
56148
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP0:%.*]], 10
57149
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds [0 x i8], ptr @BUFFER, i64 0, i64 [[TMP2]]
58-
; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[TMP0]], 15
59-
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [0 x i8], ptr @BUFFER, i64 0, i64 [[TMP5]]
60-
; CHECK-NEXT: store i32 1, ptr [[TMP6]], align 4
150+
; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP0]], 15
151+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [0 x i8], ptr @BUFFER, i64 0, i64 [[TMP4]]
152+
; CHECK-NEXT: store i32 1, ptr [[TMP5]], align 4
61153
; CHECK-NEXT: store i64 0, ptr [[TMP3]], align 4
62154
; CHECK-NEXT: ret void
63155
;
@@ -97,3 +189,30 @@ bb:
97189
ret void
98190
}
99191

192+
define void @ScalableVectorTestPartiallyOverlapping(ptr %arg, i32 %i) {
193+
;
194+
; The DSE pass will not kill the store because the overlap is partial
195+
; and won't fully clobber the original store.
196+
;
197+
; CHECK-LABEL: @ScalableVectorTestPartiallyOverlapping(
198+
; CHECK-NEXT: bb:
199+
; CHECK-NEXT: [[I2:%.*]] = zext i32 [[I:%.*]] to i64
200+
; CHECK-NEXT: [[I3:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[I2]]
201+
; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[I3]], align 8
202+
; CHECK-NEXT: [[I5:%.*]] = add nuw nsw i32 [[I]], 1
203+
; CHECK-NEXT: [[I6:%.*]] = zext i32 [[I5]] to i64
204+
; CHECK-NEXT: [[I7:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[I6]]
205+
; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[I7]], align 8
206+
; CHECK-NEXT: ret void
207+
;
208+
bb:
209+
%i2 = zext i32 %i to i64
210+
%i3 = getelementptr inbounds float, ptr %arg, i64 %i2
211+
store <vscale x 2 x float> zeroinitializer, ptr %i3
212+
%i5 = add nuw nsw i32 %i, 1
213+
%i6 = zext i32 %i5 to i64
214+
%i7 = getelementptr inbounds float, ptr %arg, i64 %i6
215+
store <vscale x 2 x float> zeroinitializer, ptr %i7
216+
ret void
217+
}
218+

llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ define void @later_non_removable_store(i1 %c, ptr %p) {
641641
; CHECK: if:
642642
; CHECK-NEXT: br label [[EXIT]]
643643
; CHECK: exit:
644-
; CHECK-NEXT: call void @use(ptr [[P]]) #[[ATTR6:[0-9]+]]
644+
; CHECK-NEXT: call void @use(ptr [[P]]) #[[ATTR7:[0-9]+]]
645645
; CHECK-NEXT: ret void
646646
;
647647
store i8 1, ptr %p
@@ -655,3 +655,81 @@ exit:
655655
call void @use(ptr %p) argmemonly
656656
ret void
657657
}
658+
659+
define void @scalable_scalable_redundant_store(ptr %ptr) {
660+
; CHECK-LABEL: @scalable_scalable_redundant_store(
661+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[PTR:%.*]], i64 2
662+
; CHECK-NEXT: store <vscale x 2 x i64> zeroinitializer, ptr [[GEP]], align 16
663+
; CHECK-NEXT: store <vscale x 4 x i64> zeroinitializer, ptr [[PTR]], align 32
664+
; CHECK-NEXT: ret void
665+
;
666+
%gep = getelementptr i64, ptr %ptr, i64 2
667+
store <vscale x 2 x i64> zeroinitializer, ptr %gep
668+
store <vscale x 4 x i64> zeroinitializer, ptr %ptr
669+
ret void
670+
}
671+
672+
define void @scalable_scalable_neg(ptr %ptr) {
673+
; CHECK-LABEL: @scalable_scalable_neg(
674+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[PTR:%.*]], i64 8
675+
; CHECK-NEXT: store <vscale x 4 x i64> zeroinitializer, ptr [[GEP]], align 32
676+
; CHECK-NEXT: store <vscale x 2 x i64> zeroinitializer, ptr [[PTR]], align 16
677+
; CHECK-NEXT: ret void
678+
;
679+
%gep = getelementptr i64, ptr %ptr, i64 8
680+
store <vscale x 4 x i64> zeroinitializer, ptr %gep
681+
store <vscale x 2 x i64> zeroinitializer, ptr %ptr
682+
ret void
683+
}
684+
685+
define void @scalable_fixed_redundant_store(ptr %ptr) vscale_range(1, 2) {
686+
; CHECK-LABEL: @scalable_fixed_redundant_store(
687+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[PTR:%.*]], i64 2
688+
; CHECK-NEXT: store <2 x i64> zeroinitializer, ptr [[GEP]], align 16
689+
; CHECK-NEXT: store <vscale x 4 x i64> zeroinitializer, ptr [[PTR]], align 32
690+
; CHECK-NEXT: ret void
691+
;
692+
%gep = getelementptr i64, ptr %ptr, i64 2
693+
store <2 x i64> zeroinitializer, ptr %gep
694+
store <vscale x 4 x i64> zeroinitializer, ptr %ptr
695+
ret void
696+
}
697+
698+
define void @scalable_fixed_neg(ptr %ptr) vscale_range(1, 2) {
699+
; CHECK-LABEL: @scalable_fixed_neg(
700+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[PTR:%.*]], i64 16
701+
; CHECK-NEXT: store <2 x i64> zeroinitializer, ptr [[GEP]], align 16
702+
; CHECK-NEXT: store <vscale x 4 x i64> zeroinitializer, ptr [[PTR]], align 32
703+
; CHECK-NEXT: ret void
704+
;
705+
%gep = getelementptr i64, ptr %ptr, i64 16
706+
store <2 x i64> zeroinitializer, ptr %gep
707+
store <vscale x 4 x i64> zeroinitializer, ptr %ptr
708+
ret void
709+
}
710+
711+
define void @fixed_scalable_redundant_store(ptr %ptr) vscale_range(1, 2) {
712+
; CHECK-LABEL: @fixed_scalable_redundant_store(
713+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[PTR:%.*]], i64 2
714+
; CHECK-NEXT: store <vscale x 2 x i64> zeroinitializer, ptr [[GEP]], align 16
715+
; CHECK-NEXT: store <8 x i64> zeroinitializer, ptr [[PTR]], align 64
716+
; CHECK-NEXT: ret void
717+
;
718+
%gep = getelementptr i64, ptr %ptr, i64 2
719+
store <vscale x 2 x i64> zeroinitializer, ptr %gep
720+
store <8 x i64> zeroinitializer, ptr %ptr
721+
ret void
722+
}
723+
724+
define void @fixed_scalable_neg(ptr %ptr) vscale_range(1, 2) {
725+
; CHECK-LABEL: @fixed_scalable_neg(
726+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[PTR:%.*]], i64 2
727+
; CHECK-NEXT: store <vscale x 2 x i64> zeroinitializer, ptr [[GEP]], align 16
728+
; CHECK-NEXT: store <4 x i64> zeroinitializer, ptr [[PTR]], align 32
729+
; CHECK-NEXT: ret void
730+
;
731+
%gep = getelementptr i64, ptr %ptr, i64 2
732+
store <vscale x 2 x i64> zeroinitializer, ptr %gep
733+
store <4 x i64> zeroinitializer, ptr %ptr
734+
ret void
735+
}

0 commit comments

Comments
 (0)