Skip to content

Commit b5d72e3

Browse files
committed
fixup! [SCEV] Collect and merge loop guards through PHI nodes with multiple incoming Values
1 parent b595b8c commit b5d72e3

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed

llvm/test/Analysis/ScalarEvolution/trip-count.ll

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,3 +293,135 @@ exit:
293293
ret void
294294

295295
}
296+
297+
define void @slt(i16 %a, i16 %b, i1 %c) {
298+
; CHECK-LABEL: 'slt'
299+
; CHECK-NEXT: Determining loop execution counts for: @slt
300+
; CHECK-NEXT: Loop %loop: backedge-taken count is (63 + (-1 * %count))
301+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 -32704
302+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (63 + (-1 * %count))
303+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
304+
entry:
305+
br i1 %c, label %b1, label %b2
306+
307+
b1:
308+
%cmp1 = icmp slt i16 %a, 8
309+
br i1 %cmp1, label %preheader, label %exit
310+
311+
b2:
312+
%cmp2 = icmp slt i16 %b, 8
313+
br i1 %cmp2, label %preheader, label %exit
314+
315+
preheader:
316+
%count = phi i16 [ %a, %b1 ], [ %b, %b2 ]
317+
br label %loop
318+
319+
loop:
320+
%iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
321+
%iv.next = add i16 %iv, 1
322+
%exitcond = icmp slt i16 %iv.next, 64
323+
br i1 %exitcond, label %loop, label %exit
324+
325+
exit:
326+
ret void
327+
328+
}
329+
330+
define void @ult(i16 %a, i16 %b, i1 %c) {
331+
; CHECK-LABEL: 'ult'
332+
; CHECK-NEXT: Determining loop execution counts for: @ult
333+
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)
334+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 -2
335+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)
336+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
337+
entry:
338+
br i1 %c, label %b1, label %b2
339+
340+
b1:
341+
%cmp1 = icmp ult i16 %a, 8
342+
br i1 %cmp1, label %exit, label %preheader
343+
344+
b2:
345+
%cmp2 = icmp ult i16 %b, 8
346+
br i1 %cmp2, label %exit, label %preheader
347+
348+
preheader:
349+
%count = phi i16 [ %a, %b1 ], [ %b, %b2 ]
350+
br label %loop
351+
352+
loop:
353+
%iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
354+
%iv.next = add i16 %iv, -1
355+
%exitcond = icmp eq i16 %iv.next, 0
356+
br i1 %exitcond, label %exit, label %loop
357+
358+
exit:
359+
ret void
360+
361+
}
362+
363+
define void @sgt(i16 %a, i16 %b, i1 %c) {
364+
; CHECK-LABEL: 'sgt'
365+
; CHECK-NEXT: Determining loop execution counts for: @sgt
366+
; CHECK-NEXT: Loop %loop: backedge-taken count is %count
367+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 32767
368+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %count
369+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
370+
entry:
371+
br i1 %c, label %b1, label %b2
372+
373+
b1:
374+
%cmp1 = icmp sgt i16 %a, 8
375+
br i1 %cmp1, label %preheader, label %exit
376+
377+
b2:
378+
%cmp2 = icmp sgt i16 %b, 8
379+
br i1 %cmp2, label %preheader, label %exit
380+
381+
preheader:
382+
%count = phi i16 [ %a, %b1 ], [ %b, %b2 ]
383+
br label %loop
384+
385+
loop:
386+
%iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
387+
%iv.next = add i16 %iv, -1
388+
%exitcond = icmp slt i16 %iv.next, 0
389+
br i1 %exitcond, label %exit, label %loop
390+
391+
exit:
392+
ret void
393+
}
394+
395+
396+
define void @mixed(i16 %a, i16 %b, i1 %c) {
397+
; CHECK-LABEL: 'mixed'
398+
; CHECK-NEXT: Determining loop execution counts for: @mixed
399+
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (-1 * %count) + (64 smax (1 + %count)))
400+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 -32704
401+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (-1 * %count) + (64 smax (1 + %count)))
402+
; CHECK-NEXT: Loop %loop: Trip multiple is 1
403+
entry:
404+
br i1 %c, label %b1, label %b2
405+
406+
b1:
407+
%cmp1 = icmp slt i16 %a, 8
408+
br i1 %cmp1, label %preheader, label %exit
409+
410+
b2:
411+
%cmp2 = icmp ult i16 %b, 8
412+
br i1 %cmp2, label %preheader, label %exit
413+
414+
preheader:
415+
%count = phi i16 [ %a, %b1 ], [ %b, %b2 ]
416+
br label %loop
417+
418+
loop:
419+
%iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
420+
%iv.next = add i16 %iv, 1
421+
%exitcond = icmp slt i16 %iv.next, 64
422+
br i1 %exitcond, label %loop, label %exit
423+
424+
exit:
425+
ret void
426+
427+
}

0 commit comments

Comments
 (0)