4747 ret void
4848}
4949
50+ define void @ScalableVectorTestFullyOverlapping (ptr %arg , i32 %i ) vscale_range(1 , 2 ) {
51+ ; CHECK-LABEL: @ScalableVectorTestFullyOverlapping(
52+ ; CHECK-NEXT: [[I_1:%.*]] = add nuw nsw i32 [[I:%.*]], 1
53+ ; CHECK-NEXT: [[EXT_I_1:%.*]] = zext i32 [[I_1]] to i64
54+ ; CHECK-NEXT: [[GEP_ARG_I_1:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[EXT_I_1]]
55+ ; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP_ARG_I_1]], align 4
56+ ; CHECK-NEXT: [[EXT_I:%.*]] = zext i32 [[I]] to i64
57+ ; CHECK-NEXT: [[GEP_ARG_I:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[EXT_I]]
58+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I]], align 8
59+ ; CHECK-NEXT: ret void
60+ ;
61+ %i.1 = add nuw nsw i32 %i , 1
62+ %ext.i.1 = zext i32 %i.1 to i64
63+ %gep.arg.i.1 = getelementptr inbounds float , ptr %arg , i64 %ext.i.1
64+ store float 0 .0 , ptr %gep.arg.i.1
65+ %ext.i = zext i32 %i to i64
66+ %gep.arg.i = getelementptr inbounds float , ptr %arg , i64 %ext.i
67+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i
68+ ret void
69+ }
70+
71+ define void @ScalableVectorTestFullyOverlapping2 (ptr %arg , i32 %i ) {
72+ ; CHECK-LABEL: @ScalableVectorTestFullyOverlapping2(
73+ ; CHECK-NEXT: [[I_1:%.*]] = add nuw nsw i32 [[I:%.*]], 1
74+ ; CHECK-NEXT: [[EXT_I_1:%.*]] = zext i32 [[I_1]] to i64
75+ ; CHECK-NEXT: [[GEP_ARG_I_1:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[EXT_I_1]]
76+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I_1]], align 8
77+ ; CHECK-NEXT: [[EXT_I:%.*]] = zext i32 [[I]] to i64
78+ ; CHECK-NEXT: [[GEP_ARG_I:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[EXT_I]]
79+ ; CHECK-NEXT: store <vscale x 4 x float> zeroinitializer, ptr [[GEP_ARG_I]], align 16
80+ ; CHECK-NEXT: ret void
81+ ;
82+ %i.1 = add nuw nsw i32 %i , 1
83+ %ext.i.1 = zext i32 %i.1 to i64
84+ %gep.arg.i.1 = getelementptr inbounds float , ptr %arg , i64 %ext.i.1
85+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i.1
86+ %ext.i = zext i32 %i to i64
87+ %gep.arg.i = getelementptr inbounds float , ptr %arg , i64 %ext.i
88+ store <vscale x 4 x float > zeroinitializer , ptr %gep.arg.i
89+ ret void
90+ }
91+
92+ define void @ScalableVectorTestNonOverlapping (ptr %arg , i32 %i ) vscale_range(1 , 2 ) {
93+ ; CHECK-LABEL: @ScalableVectorTestNonOverlapping(
94+ ; CHECK-NEXT: [[I_10:%.*]] = add nuw nsw i32 [[I:%.*]], 10
95+ ; CHECK-NEXT: [[EXT_I_10:%.*]] = zext i32 [[I_10]] to i64
96+ ; CHECK-NEXT: [[GEP_ARG_I_10:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[EXT_I_10]]
97+ ; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP_ARG_I_10]], align 4
98+ ; CHECK-NEXT: [[EXT_I:%.*]] = zext i32 [[I]] to i64
99+ ; CHECK-NEXT: [[GEP_ARG_I:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[EXT_I]]
100+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I]], align 8
101+ ; CHECK-NEXT: ret void
102+ ;
103+ %i.10 = add nuw nsw i32 %i , 10
104+ %ext.i.10 = zext i32 %i.10 to i64
105+ %gep.arg.i.10 = getelementptr inbounds float , ptr %arg , i64 %ext.i.10
106+ store float 0 .0 , ptr %gep.arg.i.10
107+ %ext.i = zext i32 %i to i64
108+ %gep.arg.i = getelementptr inbounds float , ptr %arg , i64 %ext.i
109+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i
110+ ret void
111+ }
112+
113+ define void @ScalableVectorTestNonOverlapping2 (ptr %arg , i32 %i ) vscale_range(1 , 2 ) {
114+ ; CHECK-LABEL: @ScalableVectorTestNonOverlapping2(
115+ ; CHECK-NEXT: [[I_10:%.*]] = add nuw nsw i32 [[I:%.*]], 10
116+ ; CHECK-NEXT: [[EXT_I_10:%.*]] = zext i32 [[I_10]] to i64
117+ ; CHECK-NEXT: [[GEP_ARG_I_10:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[EXT_I_10]]
118+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I_10]], align 8
119+ ; CHECK-NEXT: [[EXT_I:%.*]] = zext i32 [[I]] to i64
120+ ; CHECK-NEXT: [[GEP_ARG_I:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[EXT_I]]
121+ ; CHECK-NEXT: store <vscale x 4 x float> zeroinitializer, ptr [[GEP_ARG_I]], align 16
122+ ; CHECK-NEXT: ret void
123+ ;
124+ %i.10 = add nuw nsw i32 %i , 10
125+ %ext.i.10 = zext i32 %i.10 to i64
126+ %gep.arg.i.10 = getelementptr inbounds float , ptr %arg , i64 %ext.i.10
127+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i.10
128+ %ext.i = zext i32 %i to i64
129+ %gep.arg.i = getelementptr inbounds float , ptr %arg , i64 %ext.i
130+ store <vscale x 4 x float > zeroinitializer , ptr %gep.arg.i
131+ ret void
132+ }
133+
50134define void @ArrayTestPartiallyOverlapping (i64 %0 ) {
51135;
52136; The DSE pass will not kill the store because the overlap is partial
@@ -55,9 +139,9 @@ define void @ArrayTestPartiallyOverlapping(i64 %0) {
55139; CHECK-LABEL: @ArrayTestPartiallyOverlapping(
56140; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP0:%.*]], 10
57141; 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
142+ ; CHECK-NEXT: [[TMP4 :%.*]] = add i64 [[TMP0]], 15
143+ ; CHECK-NEXT: [[TMP5 :%.*]] = getelementptr inbounds [0 x i8], ptr @BUFFER, i64 0, i64 [[TMP4 ]]
144+ ; CHECK-NEXT: store i32 1, ptr [[TMP5 ]], align 4
61145; CHECK-NEXT: store i64 0, ptr [[TMP3]], align 4
62146; CHECK-NEXT: ret void
63147;
97181 ret void
98182}
99183
184+ define void @ScalableVectorTestPartiallyOverlapping (ptr %arg , i32 %i ) {
185+ ;
186+ ; The DSE pass will not kill the store because the overlap is partial
187+ ; and won't fully clobber the original store.
188+ ;
189+ ; CHECK-LABEL: @ScalableVectorTestPartiallyOverlapping(
190+ ; CHECK-NEXT: [[EXT_I:%.*]] = zext i32 [[I:%.*]] to i64
191+ ; CHECK-NEXT: [[GEP_ARG_I:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[EXT_I]]
192+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I]], align 8
193+ ; CHECK-NEXT: [[I_1:%.*]] = add nuw nsw i32 [[I]], 1
194+ ; CHECK-NEXT: [[EXT_I_1:%.*]] = zext i32 [[I_1]] to i64
195+ ; CHECK-NEXT: [[GEP_ARG_I_1:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[EXT_I_1]]
196+ ; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[GEP_ARG_I_1]], align 8
197+ ; CHECK-NEXT: ret void
198+ ;
199+ %ext.i = zext i32 %i to i64
200+ %gep.arg.i = getelementptr inbounds float , ptr %arg , i64 %ext.i
201+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i
202+ %i.1 = add nuw nsw i32 %i , 1
203+ %ext.i.1 = zext i32 %i.1 to i64
204+ %gep.arg.i.1 = getelementptr inbounds float , ptr %arg , i64 %ext.i.1
205+ store <vscale x 2 x float > zeroinitializer , ptr %gep.arg.i.1
206+ ret void
207+ }
208+
0 commit comments