@@ -167,3 +167,236 @@ loop:
167167exit:
168168 ret void
169169}
170+
171+ define void @test_step2_start_outer_add_rec_step_16 (i64 %n , i64 %m ) {
172+ ; CHECK-LABEL: 'test_step2_start_outer_add_rec_step_16'
173+ ; CHECK-NEXT: Classifying expressions for: @test_step2_start_outer_add_rec_step_16
174+ ; CHECK-NEXT: %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]
175+ ; CHECK-NEXT: --> {0,+,16}<%outer.header> U: [0,-15) S: [-9223372036854775808,9223372036854775793) Exits: <<Unknown>> LoopDispositions: { %outer.header: Computable, %loop: Invariant }
176+ ; CHECK-NEXT: %iv = phi i64 [ %outer.iv, %outer.header ], [ %iv.next, %loop ]
177+ ; CHECK-NEXT: --> {{\{\{}}0,+,16}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
178+ ; CHECK-NEXT: %div.0 = udiv i64 %iv, 4
179+ ; CHECK-NEXT: --> ({{\{\{}}0,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
180+ ; CHECK-NEXT: %iv.1 = add i64 %iv, 1
181+ ; CHECK-NEXT: --> {{\{\{}}1,+,16}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
182+ ; CHECK-NEXT: %div.1 = udiv i64 %iv.1, 4
183+ ; CHECK-NEXT: --> ({{\{\{}}1,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
184+ ; CHECK-NEXT: %iv.2 = add i64 %iv, 2
185+ ; CHECK-NEXT: --> {{\{\{}}2,+,16}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
186+ ; CHECK-NEXT: %div.2 = udiv i64 %iv.2, 4
187+ ; CHECK-NEXT: --> ({{\{\{}}2,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
188+ ; CHECK-NEXT: %iv.3 = add i64 %iv, 3
189+ ; CHECK-NEXT: --> {{\{\{}}3,+,16}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
190+ ; CHECK-NEXT: %div.3 = udiv i64 %iv.3, 4
191+ ; CHECK-NEXT: --> ({{\{\{}}3,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
192+ ; CHECK-NEXT: %iv.4 = add i64 %iv, 4
193+ ; CHECK-NEXT: --> {{\{\{}}4,+,16}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
194+ ; CHECK-NEXT: %div.4 = udiv i64 %iv.4, 4
195+ ; CHECK-NEXT: --> ({{\{\{}}4,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
196+ ; CHECK-NEXT: %iv.5 = add i64 %iv, 5
197+ ; CHECK-NEXT: --> {{\{\{}}5,+,16}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
198+ ; CHECK-NEXT: %div.5 = udiv i64 %iv.5, 4
199+ ; CHECK-NEXT: --> ({{\{\{}}5,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
200+ ; CHECK-NEXT: %iv.neg.1 = add i64 %iv, -1
201+ ; CHECK-NEXT: --> {{\{\{}}-1,+,16}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
202+ ; CHECK-NEXT: %div.neg.1 = udiv i64 %iv.neg.1, 4
203+ ; CHECK-NEXT: --> ({{\{\{}}-1,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
204+ ; CHECK-NEXT: %div3.0 = udiv i64 %iv, 3
205+ ; CHECK-NEXT: --> ({{\{\{}}0,+,16}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
206+ ; CHECK-NEXT: %div3.1 = udiv i64 %iv.1, 3
207+ ; CHECK-NEXT: --> ({{\{\{}}1,+,16}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517206) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
208+ ; CHECK-NEXT: %div3.2 = udiv i64 %iv.2, 3
209+ ; CHECK-NEXT: --> ({{\{\{}}2,+,16}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
210+ ; CHECK-NEXT: %div3.4 = udiv i64 %iv.4, 3
211+ ; CHECK-NEXT: --> ({{\{\{}}4,+,16}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
212+ ; CHECK-NEXT: %div3.5 = udiv i64 %iv.5, 3
213+ ; CHECK-NEXT: --> ({{\{\{}}5,+,16}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517206) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
214+ ; CHECK-NEXT: %iv.next = add i64 %iv, 2
215+ ; CHECK-NEXT: --> {{\{\{}}2,+,16}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
216+ ; CHECK-NEXT: %outer.iv.next = add i64 %outer.iv, 16
217+ ; CHECK-NEXT: --> {16,+,16}<%outer.header> U: [0,-15) S: [-9223372036854775808,9223372036854775793) Exits: <<Unknown>> LoopDispositions: { %outer.header: Computable, %loop: Invariant }
218+ ; CHECK-NEXT: Determining loop execution counts for: @test_step2_start_outer_add_rec_step_16
219+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
220+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
221+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
222+ ; CHECK-NEXT: Loop %outer.header: Unpredictable backedge-taken count.
223+ ; CHECK-NEXT: Loop %outer.header: Unpredictable constant max backedge-taken count.
224+ ; CHECK-NEXT: Loop %outer.header: Unpredictable symbolic max backedge-taken count.
225+ ; CHECK-NEXT: Loop %outer.header: Predicated backedge-taken count is (%m /u 16)
226+ ; CHECK-NEXT: Predicates:
227+ ; CHECK-NEXT: Equal predicate: (zext i4 (trunc i64 %m to i4) to i64) == 0
228+ ; CHECK-NEXT: Loop %outer.header: Predicated constant max backedge-taken count is i64 1152921504606846975
229+ ; CHECK-NEXT: Predicates:
230+ ; CHECK-NEXT: Equal predicate: (zext i4 (trunc i64 %m to i4) to i64) == 0
231+ ; CHECK-NEXT: Loop %outer.header: Predicated symbolic max backedge-taken count is (%m /u 16)
232+ ; CHECK-NEXT: Predicates:
233+ ; CHECK-NEXT: Equal predicate: (zext i4 (trunc i64 %m to i4) to i64) == 0
234+ ;
235+ entry:
236+ br label %outer.header
237+
238+ outer.header:
239+ %outer.iv = phi i64 [ 0 , %entry ], [ %outer.iv.next , %outer.latch ]
240+ br label %loop
241+
242+ loop:
243+ %iv = phi i64 [ %outer.iv , %outer.header ], [ %iv.next , %loop ]
244+ %div.0 = udiv i64 %iv , 4
245+ call void @use (i64 %div.0 )
246+ %iv.1 = add i64 %iv , 1
247+ %div.1 = udiv i64 %iv.1 , 4
248+ call void @use (i64 %div.1 )
249+ %iv.2 = add i64 %iv , 2
250+ %div.2 = udiv i64 %iv.2 , 4
251+ call void @use (i64 %div.2 )
252+ %iv.3 = add i64 %iv , 3
253+ %div.3 = udiv i64 %iv.3 , 4
254+ call void @use (i64 %div.3 )
255+ %iv.4 = add i64 %iv , 4
256+ %div.4 = udiv i64 %iv.4 , 4
257+ call void @use (i64 %div.4 )
258+ %iv.5 = add i64 %iv , 5
259+ %div.5 = udiv i64 %iv.5 , 4
260+ call void @use (i64 %div.5 )
261+ %iv.neg.1 = add i64 %iv , -1
262+ %div.neg.1 = udiv i64 %iv.neg.1 , 4
263+ call void @use (i64 %div.neg.1 )
264+ %div3.0 = udiv i64 %iv , 3
265+ call void @use (i64 %div3.0 )
266+ %div3.1 = udiv i64 %iv.1 ,3
267+ call void @use (i64 %div3.1 )
268+ %div3.2 = udiv i64 %iv.2 , 3
269+ call void @use (i64 %div3.2 )
270+ %div3.4 = udiv i64 %iv.4 , 3
271+ call void @use (i64 %div3.4 )
272+ %div3.5 = udiv i64 %iv.5 , 3
273+ call void @use (i64 %div3.5 )
274+ %iv.next = add i64 %iv , 2
275+ %cond = icmp slt i64 %iv , %n
276+ br i1 %cond , label %loop , label %outer.latch
277+
278+ outer.latch:
279+ %outer.iv.next = add i64 %outer.iv , 16
280+ %outer.ec = icmp eq i64 %outer.iv , %m
281+ br i1 %outer.ec , label %exit , label %outer.header
282+
283+ exit:
284+ ret void
285+ }
286+
287+ define void @test_step2_div4_start_outer_add_rec_step_2 (i64 %n , i64 %m ) {
288+ ; CHECK-LABEL: 'test_step2_div4_start_outer_add_rec_step_2'
289+ ; CHECK-NEXT: Classifying expressions for: @test_step2_div4_start_outer_add_rec_step_2
290+ ; CHECK-NEXT: %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]
291+ ; CHECK-NEXT: --> {0,+,2}<%outer.header> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %outer.header: Computable, %loop: Invariant }
292+ ; CHECK-NEXT: %iv = phi i64 [ %outer.iv, %outer.header ], [ %iv.next, %loop ]
293+ ; CHECK-NEXT: --> {{\{\{}}0,+,2}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
294+ ; CHECK-NEXT: %div.0 = udiv i64 %iv, 4
295+ ; CHECK-NEXT: --> ({{\{\{}}0,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
296+ ; CHECK-NEXT: %iv.1 = add i64 %iv, 1
297+ ; CHECK-NEXT: --> {{\{\{}}1,+,2}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
298+ ; CHECK-NEXT: %div.1 = udiv i64 %iv.1, 4
299+ ; CHECK-NEXT: --> ({{\{\{}}1,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
300+ ; CHECK-NEXT: %iv.2 = add i64 %iv, 2
301+ ; CHECK-NEXT: --> {{\{\{}}2,+,2}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
302+ ; CHECK-NEXT: %div.2 = udiv i64 %iv.2, 4
303+ ; CHECK-NEXT: --> ({{\{\{}}2,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
304+ ; CHECK-NEXT: %iv.3 = add i64 %iv, 3
305+ ; CHECK-NEXT: --> {{\{\{}}3,+,2}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
306+ ; CHECK-NEXT: %div.3 = udiv i64 %iv.3, 4
307+ ; CHECK-NEXT: --> ({{\{\{}}3,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
308+ ; CHECK-NEXT: %iv.4 = add i64 %iv, 4
309+ ; CHECK-NEXT: --> {{\{\{}}4,+,2}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
310+ ; CHECK-NEXT: %div.4 = udiv i64 %iv.4, 4
311+ ; CHECK-NEXT: --> ({{\{\{}}4,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
312+ ; CHECK-NEXT: %iv.5 = add i64 %iv, 5
313+ ; CHECK-NEXT: --> {{\{\{}}5,+,2}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
314+ ; CHECK-NEXT: %div.5 = udiv i64 %iv.5, 4
315+ ; CHECK-NEXT: --> ({{\{\{}}5,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
316+ ; CHECK-NEXT: %iv.neg.1 = add i64 %iv, -1
317+ ; CHECK-NEXT: --> {{\{\{}}-1,+,2}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
318+ ; CHECK-NEXT: %div.neg.1 = udiv i64 %iv.neg.1, 4
319+ ; CHECK-NEXT: --> ({{\{\{}}-1,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
320+ ; CHECK-NEXT: %div3.0 = udiv i64 %iv, 3
321+ ; CHECK-NEXT: --> ({{\{\{}}0,+,2}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
322+ ; CHECK-NEXT: %div3.1 = udiv i64 %iv.1, 3
323+ ; CHECK-NEXT: --> ({{\{\{}}1,+,2}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517206) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
324+ ; CHECK-NEXT: %div3.2 = udiv i64 %iv.2, 3
325+ ; CHECK-NEXT: --> ({{\{\{}}2,+,2}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
326+ ; CHECK-NEXT: %div3.4 = udiv i64 %iv.4, 3
327+ ; CHECK-NEXT: --> ({{\{\{}}4,+,2}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
328+ ; CHECK-NEXT: %div3.5 = udiv i64 %iv.5, 3
329+ ; CHECK-NEXT: --> ({{\{\{}}5,+,2}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517206) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
330+ ; CHECK-NEXT: %iv.next = add i64 %iv, 2
331+ ; CHECK-NEXT: --> {{\{\{}}2,+,2}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
332+ ; CHECK-NEXT: %outer.iv.next = add i64 %outer.iv, 2
333+ ; CHECK-NEXT: --> {2,+,2}<%outer.header> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %outer.header: Computable, %loop: Invariant }
334+ ; CHECK-NEXT: Determining loop execution counts for: @test_step2_div4_start_outer_add_rec_step_2
335+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
336+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
337+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
338+ ; CHECK-NEXT: Loop %outer.header: Unpredictable backedge-taken count.
339+ ; CHECK-NEXT: Loop %outer.header: Unpredictable constant max backedge-taken count.
340+ ; CHECK-NEXT: Loop %outer.header: Unpredictable symbolic max backedge-taken count.
341+ ; CHECK-NEXT: Loop %outer.header: Predicated backedge-taken count is (%m /u 2)
342+ ; CHECK-NEXT: Predicates:
343+ ; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %m to i1) to i64) == 0
344+ ; CHECK-NEXT: Loop %outer.header: Predicated constant max backedge-taken count is i64 9223372036854775807
345+ ; CHECK-NEXT: Predicates:
346+ ; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %m to i1) to i64) == 0
347+ ; CHECK-NEXT: Loop %outer.header: Predicated symbolic max backedge-taken count is (%m /u 2)
348+ ; CHECK-NEXT: Predicates:
349+ ; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %m to i1) to i64) == 0
350+ ;
351+ entry:
352+ br label %outer.header
353+
354+ outer.header:
355+ %outer.iv = phi i64 [ 0 , %entry ], [ %outer.iv.next , %outer.latch ]
356+ br label %loop
357+
358+ loop:
359+ %iv = phi i64 [ %outer.iv , %outer.header ], [ %iv.next , %loop ]
360+ %div.0 = udiv i64 %iv , 4
361+ call void @use (i64 %div.0 )
362+ %iv.1 = add i64 %iv , 1
363+ %div.1 = udiv i64 %iv.1 , 4
364+ call void @use (i64 %div.1 )
365+ %iv.2 = add i64 %iv , 2
366+ %div.2 = udiv i64 %iv.2 , 4
367+ call void @use (i64 %div.2 )
368+ %iv.3 = add i64 %iv , 3
369+ %div.3 = udiv i64 %iv.3 , 4
370+ call void @use (i64 %div.3 )
371+ %iv.4 = add i64 %iv , 4
372+ %div.4 = udiv i64 %iv.4 , 4
373+ call void @use (i64 %div.4 )
374+ %iv.5 = add i64 %iv , 5
375+ %div.5 = udiv i64 %iv.5 , 4
376+ call void @use (i64 %div.5 )
377+ %iv.neg.1 = add i64 %iv , -1
378+ %div.neg.1 = udiv i64 %iv.neg.1 , 4
379+ call void @use (i64 %div.neg.1 )
380+ %div3.0 = udiv i64 %iv , 3
381+ call void @use (i64 %div3.0 )
382+ %div3.1 = udiv i64 %iv.1 ,3
383+ call void @use (i64 %div3.1 )
384+ %div3.2 = udiv i64 %iv.2 , 3
385+ call void @use (i64 %div3.2 )
386+ %div3.4 = udiv i64 %iv.4 , 3
387+ call void @use (i64 %div3.4 )
388+ %div3.5 = udiv i64 %iv.5 , 3
389+ call void @use (i64 %div3.5 )
390+ call void @use (i64 %div.neg.1 )
391+ %iv.next = add i64 %iv , 2
392+ %cond = icmp slt i64 %iv , %n
393+ br i1 %cond , label %loop , label %outer.latch
394+
395+ outer.latch:
396+ %outer.iv.next = add i64 %outer.iv , 2
397+ %outer.ec = icmp eq i64 %outer.iv , %m
398+ br i1 %outer.ec , label %exit , label %outer.header
399+
400+ exit:
401+ ret void
402+ }
0 commit comments