@@ -148,6 +148,72 @@ exit:
148148 ret void
149149}
150150
151+ define void @main_vf_vscale_x_2_no_epi_iteration (ptr %A ) #0 vscale_range(8 , 8 ) {
152+ ; CHECK-LABEL: @main_vf_vscale_x_2_no_epi_iteration(
153+ ; CHECK-NEXT: entry:
154+ ; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
155+ ; CHECK-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 4
156+ ; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
157+ ; CHECK: vector.ph:
158+ ; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()
159+ ; CHECK-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 4
160+ ; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 1024, [[TMP3]]
161+ ; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 1024, [[N_MOD_VF]]
162+ ; CHECK-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64()
163+ ; CHECK-NEXT: [[TMP5:%.*]] = mul nuw i64 [[TMP4]], 4
164+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
165+ ; CHECK: vector.body:
166+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
167+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP5]]
168+ ; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
169+ ; CHECK-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
170+ ; CHECK: middle.block:
171+ ; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 1024, [[N_VEC]]
172+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
173+ ; CHECK: for.body:
174+ ;
175+ ; CHECK-VF8-LABEL: @main_vf_vscale_x_2_no_epi_iteration(
176+ ; CHECK-VF8-NEXT: iter.check:
177+ ; CHECK-VF8-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]
178+ ; CHECK-VF8: vector.main.loop.iter.check:
179+ ; CHECK-VF8-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
180+ ; CHECK-VF8-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 4
181+ ; CHECK-VF8-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 1024, [[TMP1]]
182+ ; CHECK-VF8-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]]
183+ ; CHECK-VF8: vector.ph:
184+ ; CHECK-VF8-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()
185+ ; CHECK-VF8-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 4
186+ ; CHECK-VF8-NEXT: [[N_MOD_VF:%.*]] = urem i64 1024, [[TMP3]]
187+ ; CHECK-VF8-NEXT: [[N_VEC:%.*]] = sub i64 1024, [[N_MOD_VF]]
188+ ; CHECK-VF8-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64()
189+ ; CHECK-VF8-NEXT: [[TMP5:%.*]] = mul nuw i64 [[TMP4]], 4
190+ ; CHECK-VF8-NEXT: br label [[VECTOR_BODY:%.*]]
191+ ; CHECK-VF8: vector.body:
192+ ; CHECK-VF8-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
193+ ; CHECK-VF8-NEXT: [[INDEX_NEXT2]] = add nuw i64 [[INDEX1]], 8
194+ ; CHECK-VF8-NEXT: [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 1024
195+ ; CHECK-VF8-NEXT: br i1 [[TMP14]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
196+ ; CHECK-VF8: vec.epilog.middle.block:
197+ ; CHECK-VF8-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
198+ ; CHECK-VF8: vec.epilog.scalar.ph:
199+ ; CHECK-VF8-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 1024, [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[N_VEC]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[ITER_CHECK:%.*]] ]
200+ ; CHECK-VF8-NEXT: br label [[FOR_BODY:%.*]]
201+ ; CHECK-VF8: for.body:
202+ ;
203+ entry:
204+ br label %for.body
205+
206+ for.body:
207+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %for.body ]
208+ %arrayidx = getelementptr inbounds i64 , ptr %A , i64 %iv
209+ store i64 1 , ptr %arrayidx , align 1
210+ %iv.next = add nuw nsw i64 %iv , 1
211+ %exitcond = icmp ne i64 %iv.next , 1024
212+ br i1 %exitcond , label %for.body , label %exit
213+
214+ exit:
215+ ret void
216+ }
151217
152218; DEBUG: LV: Checking a loop in 'main_vf_vscale_x_2'
153219; DEBUG: Create Skeleton for epilogue vectorized loop (first pass)
@@ -163,106 +229,118 @@ exit:
163229; fixed-width VF=8 for the epilogue if the vectors are known to be
164230; sufficiently wide. This information can be deduced from vscale_range or
165231; VScaleForTuning (set by mcpu/mtune).
166- define void @main_vf_vscale_x_2 (ptr %A ) #0 vscale_range(8 , 8 ) {
232+ define void @main_vf_vscale_x_2 (ptr %A , i64 %n ) #0 vscale_range(8 , 8 ) {
167233; CHECK-LABEL: @main_vf_vscale_x_2(
168234; CHECK-NEXT: iter.check:
169- ; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]
235+ ; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N:%.*]], 8
236+ ; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]
170237; CHECK: vector.main.loop.iter.check:
171238; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
172239; CHECK-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 4
173- ; CHECK-NEXT: [[MIN_ITERS_CHECK :%.*]] = icmp ult i64 1024 , [[TMP1]]
174- ; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK ]], label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]]
240+ ; CHECK-NEXT: [[MIN_ITERS_CHECK1 :%.*]] = icmp ult i64 [[N]] , [[TMP1]]
241+ ; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK1 ]], label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]]
175242; CHECK: vector.ph:
176243; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()
177244; CHECK-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 4
178- ; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 1024 , [[TMP3]]
179- ; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 1024 , [[N_MOD_VF]]
245+ ; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]] , [[TMP3]]
246+ ; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]] , [[N_MOD_VF]]
180247; CHECK-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64()
181248; CHECK-NEXT: [[TMP5:%.*]] = mul nuw i64 [[TMP4]], 4
182249; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
183250; CHECK: vector.body:
184251; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
185252; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[INDEX]]
253+ ; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i64, ptr [[TMP12]], i32 0
186254; CHECK-NEXT: [[TMP15:%.*]] = call i64 @llvm.vscale.i64()
187255; CHECK-NEXT: [[TMP16:%.*]] = mul nuw i64 [[TMP15]], 2
188256; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i64, ptr [[TMP12]], i64 [[TMP16]]
189- ; CHECK-NEXT: store <vscale x 2 x i64> splat (i64 1), ptr [[TMP12 ]], align 1
257+ ; CHECK-NEXT: store <vscale x 2 x i64> splat (i64 1), ptr [[TMP14 ]], align 1
190258; CHECK-NEXT: store <vscale x 2 x i64> splat (i64 1), ptr [[TMP17]], align 1
191259; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP5]]
192260; CHECK-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
193- ; CHECK-NEXT: br i1 [[TMP18]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5 :![0-9]+]]
261+ ; CHECK-NEXT: br i1 [[TMP18]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP7 :![0-9]+]]
194262; CHECK: middle.block:
195- ; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 1024 , [[N_VEC]]
196- ; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK :%.*]]
263+ ; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]] , [[N_VEC]]
264+ ; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH :%.*]]
197265; CHECK: vec.epilog.iter.check:
198- ; CHECK-NEXT: [[N_VEC_REMAINING:%.*]] = sub i64 1024 , [[N_VEC]]
266+ ; CHECK-NEXT: [[N_VEC_REMAINING:%.*]] = sub i64 [[N]] , [[N_VEC]]
199267; CHECK-NEXT: [[MIN_EPILOG_ITERS_CHECK:%.*]] = icmp ult i64 [[N_VEC_REMAINING]], 8
200268; CHECK-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]]
201269; CHECK: vec.epilog.ph:
202- ; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
203- ; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]
270+ ; CHECK-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[SCALAR_PH]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
271+ ; CHECK-NEXT: [[N_MOD_VF2:%.*]] = urem i64 [[N]], 8
272+ ; CHECK-NEXT: [[N_VEC3:%.*]] = sub i64 [[N]], [[N_MOD_VF2]]
273+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
204274; CHECK: vec.epilog.vector.body:
205- ; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ [[VEC_EPILOG_RESUME_VAL]], [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VEC_EPILOG_VECTOR_BODY]] ]
206- ; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[INDEX1]]
207- ; CHECK-NEXT: store <8 x i64> splat (i64 1), ptr [[TMP20]], align 1
208- ; CHECK-NEXT: [[INDEX_NEXT2]] = add nuw i64 [[INDEX1]], 8
209- ; CHECK-NEXT: [[TMP22:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 1024
210- ; CHECK-NEXT: br i1 [[TMP22]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
275+ ; CHECK-NEXT: [[INDEX4:%.*]] = phi i64 [ [[VEC_EPILOG_RESUME_VAL]], [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT5:%.*]], [[FOR_BODY]] ]
276+ ; CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[INDEX4]]
277+ ; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i64, ptr [[TMP19]], i32 0
278+ ; CHECK-NEXT: store <8 x i64> splat (i64 1), ptr [[TMP13]], align 1
279+ ; CHECK-NEXT: [[INDEX_NEXT5]] = add nuw i64 [[INDEX4]], 8
280+ ; CHECK-NEXT: [[TMP20:%.*]] = icmp eq i64 [[INDEX_NEXT5]], [[N_VEC3]]
281+ ; CHECK-NEXT: br i1 [[TMP20]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
211282; CHECK: vec.epilog.middle.block:
212- ; CHECK-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
283+ ; CHECK-NEXT: [[CMP_N6:%.*]] = icmp eq i64 [[N]], [[N_VEC3]]
284+ ; CHECK-NEXT: br i1 [[CMP_N6]], label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
213285; CHECK: vec.epilog.scalar.ph:
214- ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 1024 , [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[N_VEC]], [[VEC_EPILOG_ITER_CHECK ]] ], [ 0, [[ITER_CHECK:%.*]] ]
215- ; CHECK-NEXT: br label [[FOR_BODY :%.*]]
286+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC3]] , [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[N_VEC]], [[SCALAR_PH ]] ], [ 0, [[ITER_CHECK:%.*]] ]
287+ ; CHECK-NEXT: br label [[FOR_BODY1 :%.*]]
216288; CHECK: for.body:
217289;
218290; CHECK-VF8-LABEL: @main_vf_vscale_x_2(
219291; CHECK-VF8-NEXT: iter.check:
220- ; CHECK-VF8-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]
292+ ; CHECK-VF8-NEXT: [[MIN_ITERS_CHECK1:%.*]] = icmp ult i64 [[N:%.*]], 8
293+ ; CHECK-VF8-NEXT: br i1 [[MIN_ITERS_CHECK1]], label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]
221294; CHECK-VF8: vector.main.loop.iter.check:
222295; CHECK-VF8-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
223296; CHECK-VF8-NEXT: [[TMP1:%.*]] = mul nuw i64 [[TMP0]], 4
224- ; CHECK-VF8-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 1024 , [[TMP1]]
297+ ; CHECK-VF8-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]] , [[TMP1]]
225298; CHECK-VF8-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]]
226299; CHECK-VF8: vector.ph:
227300; CHECK-VF8-NEXT: [[TMP2:%.*]] = call i64 @llvm.vscale.i64()
228301; CHECK-VF8-NEXT: [[TMP3:%.*]] = mul nuw i64 [[TMP2]], 4
229- ; CHECK-VF8-NEXT: [[N_MOD_VF:%.*]] = urem i64 1024 , [[TMP3]]
230- ; CHECK-VF8-NEXT: [[N_VEC:%.*]] = sub i64 1024 , [[N_MOD_VF]]
302+ ; CHECK-VF8-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]] , [[TMP3]]
303+ ; CHECK-VF8-NEXT: [[N_VEC:%.*]] = sub i64 [[N]] , [[N_MOD_VF]]
231304; CHECK-VF8-NEXT: [[TMP4:%.*]] = call i64 @llvm.vscale.i64()
232305; CHECK-VF8-NEXT: [[TMP5:%.*]] = mul nuw i64 [[TMP4]], 4
233306; CHECK-VF8-NEXT: br label [[VECTOR_BODY:%.*]]
234307; CHECK-VF8: vector.body:
235308; CHECK-VF8-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
236309; CHECK-VF8-NEXT: [[TMP12:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[INDEX]]
310+ ; CHECK-VF8-NEXT: [[TMP14:%.*]] = getelementptr inbounds i64, ptr [[TMP12]], i32 0
237311; CHECK-VF8-NEXT: [[TMP15:%.*]] = call i64 @llvm.vscale.i64()
238312; CHECK-VF8-NEXT: [[TMP16:%.*]] = mul nuw i64 [[TMP15]], 2
239313; CHECK-VF8-NEXT: [[TMP17:%.*]] = getelementptr inbounds i64, ptr [[TMP12]], i64 [[TMP16]]
240- ; CHECK-VF8-NEXT: store <vscale x 2 x i64> splat (i64 1), ptr [[TMP12 ]], align 1
314+ ; CHECK-VF8-NEXT: store <vscale x 2 x i64> splat (i64 1), ptr [[TMP14 ]], align 1
241315; CHECK-VF8-NEXT: store <vscale x 2 x i64> splat (i64 1), ptr [[TMP17]], align 1
242316; CHECK-VF8-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP5]]
243317; CHECK-VF8-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
244- ; CHECK-VF8-NEXT: br i1 [[TMP18]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5 :![0-9]+]]
318+ ; CHECK-VF8-NEXT: br i1 [[TMP18]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8 :![0-9]+]]
245319; CHECK-VF8: middle.block:
246- ; CHECK-VF8-NEXT: [[CMP_N:%.*]] = icmp eq i64 1024 , [[N_VEC]]
320+ ; CHECK-VF8-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]] , [[N_VEC]]
247321; CHECK-VF8-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]
248322; CHECK-VF8: vec.epilog.iter.check:
249- ; CHECK-VF8-NEXT: [[N_VEC_REMAINING:%.*]] = sub i64 1024 , [[N_VEC]]
323+ ; CHECK-VF8-NEXT: [[N_VEC_REMAINING:%.*]] = sub i64 [[N]] , [[N_VEC]]
250324; CHECK-VF8-NEXT: [[MIN_EPILOG_ITERS_CHECK:%.*]] = icmp ult i64 [[N_VEC_REMAINING]], 8
251325; CHECK-VF8-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]]
252326; CHECK-VF8: vec.epilog.ph:
253327; CHECK-VF8-NEXT: [[VEC_EPILOG_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
328+ ; CHECK-VF8-NEXT: [[N_MOD_VF2:%.*]] = urem i64 [[N]], 8
329+ ; CHECK-VF8-NEXT: [[N_VEC3:%.*]] = sub i64 [[N]], [[N_MOD_VF2]]
254330; CHECK-VF8-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]
255331; CHECK-VF8: vec.epilog.vector.body:
256332; CHECK-VF8-NEXT: [[INDEX1:%.*]] = phi i64 [ [[VEC_EPILOG_RESUME_VAL]], [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT2:%.*]], [[VEC_EPILOG_VECTOR_BODY]] ]
257333; CHECK-VF8-NEXT: [[TMP20:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[INDEX1]]
258- ; CHECK-VF8-NEXT: store <8 x i64> splat (i64 1), ptr [[TMP20]], align 1
334+ ; CHECK-VF8-NEXT: [[TMP21:%.*]] = getelementptr inbounds i64, ptr [[TMP20]], i32 0
335+ ; CHECK-VF8-NEXT: store <8 x i64> splat (i64 1), ptr [[TMP21]], align 1
259336; CHECK-VF8-NEXT: [[INDEX_NEXT2]] = add nuw i64 [[INDEX1]], 8
260- ; CHECK-VF8-NEXT: [[TMP22 :%.*]] = icmp eq i64 [[INDEX_NEXT2]], 1024
261- ; CHECK-VF8-NEXT: br i1 [[TMP22 ]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP6 :![0-9]+]]
337+ ; CHECK-VF8-NEXT: [[TMP19 :%.*]] = icmp eq i64 [[INDEX_NEXT2]], [[N_VEC3]]
338+ ; CHECK-VF8-NEXT: br i1 [[TMP19 ]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP9 :![0-9]+]]
262339; CHECK-VF8: vec.epilog.middle.block:
263- ; CHECK-VF8-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
340+ ; CHECK-VF8-NEXT: [[CMP_N6:%.*]] = icmp eq i64 [[N]], [[N_VEC3]]
341+ ; CHECK-VF8-NEXT: br i1 [[CMP_N6]], label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
264342; CHECK-VF8: vec.epilog.scalar.ph:
265- ; CHECK-VF8-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 1024 , [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[N_VEC]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[ITER_CHECK:%.*]] ]
343+ ; CHECK-VF8-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC3]] , [[VEC_EPILOG_MIDDLE_BLOCK]] ], [ [[N_VEC]], [[VEC_EPILOG_ITER_CHECK]] ], [ 0, [[ITER_CHECK:%.*]] ]
266344; CHECK-VF8-NEXT: br label [[FOR_BODY:%.*]]
267345; CHECK-VF8: for.body:
268346;
@@ -274,7 +352,7 @@ for.body:
274352 %arrayidx = getelementptr inbounds i64 , ptr %A , i64 %iv
275353 store i64 1 , ptr %arrayidx , align 1
276354 %iv.next = add nuw nsw i64 %iv , 1
277- %exitcond = icmp ne i64 %iv.next , 1024
355+ %exitcond = icmp ne i64 %iv.next , %n
278356 br i1 %exitcond , label %for.body , label %exit
279357
280358exit:
@@ -313,7 +391,7 @@ define void @test_pr57912_pointer_induction(ptr %start) #0 {
313391; CHECK-NEXT: store <vscale x 16 x i8> zeroinitializer, ptr [[TMP19]], align 1
314392; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP7]]
315393; CHECK-NEXT: [[TMP20:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
316- ; CHECK-NEXT: br i1 [[TMP20]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8 :![0-9]+]]
394+ ; CHECK-NEXT: br i1 [[TMP20]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10 :![0-9]+]]
317395; CHECK: middle.block:
318396; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 10000, [[N_VEC]]
319397; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]
@@ -340,7 +418,7 @@ define void @test_pr57912_pointer_induction(ptr %start) #0 {
340418; CHECK-NEXT: store <vscale x 8 x i8> zeroinitializer, ptr [[TMP28]], align 1
341419; CHECK-NEXT: [[INDEX_NEXT8]] = add nuw i64 [[INDEX7]], [[TMP26]]
342420; CHECK-NEXT: [[TMP30:%.*]] = icmp eq i64 [[INDEX_NEXT8]], [[N_VEC3]]
343- ; CHECK-NEXT: br i1 [[TMP30]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP9 :![0-9]+]]
421+ ; CHECK-NEXT: br i1 [[TMP30]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP11 :![0-9]+]]
344422; CHECK: vec.epilog.middle.block:
345423; CHECK-NEXT: [[CMP_N6:%.*]] = icmp eq i64 10000, [[N_VEC3]]
346424; CHECK-NEXT: br i1 [[CMP_N6]], label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
@@ -376,7 +454,7 @@ define void @test_pr57912_pointer_induction(ptr %start) #0 {
376454; CHECK-VF8-NEXT: store <vscale x 16 x i8> zeroinitializer, ptr [[TMP17]], align 1
377455; CHECK-VF8-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], [[TMP5]]
378456; CHECK-VF8-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
379- ; CHECK-VF8-NEXT: br i1 [[TMP18]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8 :![0-9]+]]
457+ ; CHECK-VF8-NEXT: br i1 [[TMP18]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP11 :![0-9]+]]
380458; CHECK-VF8: middle.block:
381459; CHECK-VF8-NEXT: [[CMP_N:%.*]] = icmp eq i64 10000, [[N_VEC]]
382460; CHECK-VF8-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]
@@ -395,7 +473,7 @@ define void @test_pr57912_pointer_induction(ptr %start) #0 {
395473; CHECK-VF8-NEXT: store <8 x i8> zeroinitializer, ptr [[TMP20]], align 1
396474; CHECK-VF8-NEXT: [[INDEX_NEXT4]] = add nuw i64 [[INDEX3]], 8
397475; CHECK-VF8-NEXT: [[TMP22:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 10000
398- ; CHECK-VF8-NEXT: br i1 [[TMP22]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP9 :![0-9]+]]
476+ ; CHECK-VF8-NEXT: br i1 [[TMP22]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP12 :![0-9]+]]
399477; CHECK-VF8: vec.epilog.middle.block:
400478; CHECK-VF8-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
401479; CHECK-VF8: vec.epilog.scalar.ph:
0 commit comments