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+
50142define 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;
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+
0 commit comments