17c8e05aaSJulian Nagele; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-max-iterations=0  -scalar-evolution-classify-expressions=0  2>&1 | FileCheck %s
27c8e05aaSJulian Nagele
37c8e05aaSJulian Nageledefine void @slt(i16 %a, i16 %b, i1 %c) {
47c8e05aaSJulian Nagele; CHECK-LABEL: 'slt'
57c8e05aaSJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @slt
67c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: backedge-taken count is (19 + (-1 * %count)<nsw>)<nsw>
77c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i16 18
87c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (19 + (-1 * %count)<nsw>)<nsw>
97c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: Trip multiple is 1
107c8e05aaSJulian Nageleentry:
117c8e05aaSJulian Nagele  br i1 %c, label %b1, label %b2
127c8e05aaSJulian Nagele
137c8e05aaSJulian Nageleb1:
147c8e05aaSJulian Nagele  %cmp1 = icmp slt i16 %a, 1
157c8e05aaSJulian Nagele  br i1 %cmp1, label %exit, label %preheader
167c8e05aaSJulian Nagele
177c8e05aaSJulian Nageleb2:
187c8e05aaSJulian Nagele  %cmp2 = icmp slt i16 %b, 4
197c8e05aaSJulian Nagele  br i1 %cmp2, label %exit, label %preheader
207c8e05aaSJulian Nagele
217c8e05aaSJulian Nagelepreheader:
227c8e05aaSJulian Nagele  %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]
237c8e05aaSJulian Nagele  %cmp3 = icmp sle i16 %count, 19
247c8e05aaSJulian Nagele  br i1 %cmp3, label %loop, label %exit
257c8e05aaSJulian Nagele
267c8e05aaSJulian Nageleloop:
277c8e05aaSJulian Nagele  %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
287c8e05aaSJulian Nagele  %iv.next = add i16 %iv, 1
297c8e05aaSJulian Nagele  %exitcond = icmp eq i16 %iv.next, 20
307c8e05aaSJulian Nagele  br i1 %exitcond, label %exit, label %loop
317c8e05aaSJulian Nagele
327c8e05aaSJulian Nageleexit:
337c8e05aaSJulian Nagele  ret void
347c8e05aaSJulian Nagele}
357c8e05aaSJulian Nagele
367c8e05aaSJulian Nageledefine void @ult(i16 %a, i16 %b, i1 %c) {
377c8e05aaSJulian Nagele; CHECK-LABEL: 'ult'
387c8e05aaSJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @ult
397c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: backedge-taken count is (21 + (-1 * %count))
407c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i16 19
417c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (21 + (-1 * %count))
427c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: Trip multiple is 1
437c8e05aaSJulian Nageleentry:
447c8e05aaSJulian Nagele  br i1 %c, label %b1, label %b2
457c8e05aaSJulian Nagele
467c8e05aaSJulian Nageleb1:
477c8e05aaSJulian Nagele  %cmp1 = icmp ult i16 %a, 2
487c8e05aaSJulian Nagele  br i1 %cmp1, label %exit, label %preheader
497c8e05aaSJulian Nagele
507c8e05aaSJulian Nageleb2:
517c8e05aaSJulian Nagele  %cmp2 = icmp ult i16 %b, 5
527c8e05aaSJulian Nagele  br i1 %cmp2, label %exit, label %preheader
537c8e05aaSJulian Nagele
547c8e05aaSJulian Nagelepreheader:
557c8e05aaSJulian Nagele  %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]
567c8e05aaSJulian Nagele  %cmp3 = icmp ule i16 %count, 20
577c8e05aaSJulian Nagele  br i1 %cmp3, label %loop, label %exit
587c8e05aaSJulian Nagele
597c8e05aaSJulian Nageleloop:
607c8e05aaSJulian Nagele  %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
617c8e05aaSJulian Nagele  %iv.next = add i16 %iv, 1
627c8e05aaSJulian Nagele  %exitcond = icmp eq i16 %iv.next, 22
637c8e05aaSJulian Nagele  br i1 %exitcond, label %exit, label %loop
647c8e05aaSJulian Nagele
657c8e05aaSJulian Nageleexit:
667c8e05aaSJulian Nagele  ret void
677c8e05aaSJulian Nagele}
687c8e05aaSJulian Nagele
697c8e05aaSJulian Nageledefine void @sgt(i16 %a, i16 %b, i1 %c) {
707c8e05aaSJulian Nagele; CHECK-LABEL: 'sgt'
717c8e05aaSJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @sgt
727c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %count)
737c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i16 9
747c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + %count)
757c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: Trip multiple is 1
767c8e05aaSJulian Nageleentry:
777c8e05aaSJulian Nagele  br i1 %c, label %b1, label %b2
787c8e05aaSJulian Nagele
797c8e05aaSJulian Nageleb1:
807c8e05aaSJulian Nagele  %cmp1 = icmp sgt i16 %a, 10
817c8e05aaSJulian Nagele  br i1 %cmp1, label %exit, label %preheader
827c8e05aaSJulian Nagele
837c8e05aaSJulian Nageleb2:
847c8e05aaSJulian Nagele  %cmp2 = icmp sgt i16 %b, 8
857c8e05aaSJulian Nagele  br i1 %cmp2, label %exit, label %preheader
867c8e05aaSJulian Nagele
877c8e05aaSJulian Nagelepreheader:
887c8e05aaSJulian Nagele  %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]
897c8e05aaSJulian Nagele  %cmp3 = icmp sge i16 %count, 1
907c8e05aaSJulian Nagele  br i1 %cmp3, label %loop, label %exit
917c8e05aaSJulian Nagele
927c8e05aaSJulian Nageleloop:
937c8e05aaSJulian Nagele  %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
947c8e05aaSJulian Nagele  %iv.next = add i16 %iv, -1
957c8e05aaSJulian Nagele  %exitcond = icmp eq i16 %iv.next, 0
967c8e05aaSJulian Nagele  br i1 %exitcond, label %exit, label %loop
977c8e05aaSJulian Nagele
987c8e05aaSJulian Nageleexit:
997c8e05aaSJulian Nagele  ret void
1007c8e05aaSJulian Nagele}
1017c8e05aaSJulian Nagele
1027c8e05aaSJulian Nageledefine void @ugt(i16 %a, i16 %b, i1 %c) {
1037c8e05aaSJulian Nagele; CHECK-LABEL: 'ugt'
1047c8e05aaSJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @ugt
1057c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %count)<nsw>
1067c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i16 10
1077c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + %count)<nsw>
1087c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1097c8e05aaSJulian Nageleentry:
1107c8e05aaSJulian Nagele  br i1 %c, label %b1, label %b2
1117c8e05aaSJulian Nagele
1127c8e05aaSJulian Nageleb1:
1137c8e05aaSJulian Nagele  %cmp1 = icmp ugt i16 %a, 11
1147c8e05aaSJulian Nagele  br i1 %cmp1, label %exit, label %preheader
1157c8e05aaSJulian Nagele
1167c8e05aaSJulian Nageleb2:
1177c8e05aaSJulian Nagele  %cmp2 = icmp ugt i16 %b, 7
1187c8e05aaSJulian Nagele  br i1 %cmp2, label %exit, label %preheader
1197c8e05aaSJulian Nagele
1207c8e05aaSJulian Nagelepreheader:
1217c8e05aaSJulian Nagele  %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]
1227c8e05aaSJulian Nagele  %cmp3 = icmp ne i16 %count, 0
1237c8e05aaSJulian Nagele  br i1 %cmp3, label %loop, label %exit
1247c8e05aaSJulian Nagele
1257c8e05aaSJulian Nageleloop:
1267c8e05aaSJulian Nagele  %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
1277c8e05aaSJulian Nagele  %iv.next = add i16 %iv, -1
1287c8e05aaSJulian Nagele  %exitcond = icmp eq i16 %iv.next, 0
1297c8e05aaSJulian Nagele  br i1 %exitcond, label %exit, label %loop
1307c8e05aaSJulian Nagele
1317c8e05aaSJulian Nageleexit:
1327c8e05aaSJulian Nagele  ret void
1337c8e05aaSJulian Nagele}
1347c8e05aaSJulian Nagele
1357c8e05aaSJulian Nageledefine void @three_incoming(i16 %a, i16 %b, i1 %c, i1 %d) {
1367c8e05aaSJulian Nagele; CHECK-LABEL: 'three_incoming'
1377c8e05aaSJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @three_incoming
1387c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %count)<nsw>
1397c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i16 11
1407c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + %count)<nsw>
1417c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1427c8e05aaSJulian Nageleentry:
1437c8e05aaSJulian Nagele  br i1 %c, label %b1, label %entry2
1447c8e05aaSJulian Nagele
1457c8e05aaSJulian Nageleentry2:
1467c8e05aaSJulian Nagele  br i1 %d, label %b2, label %b3
1477c8e05aaSJulian Nagele
1487c8e05aaSJulian Nageleb1:
1497c8e05aaSJulian Nagele  %cmp1 = icmp ugt i16 %a, 10
1507c8e05aaSJulian Nagele  br i1 %cmp1, label %exit, label %preheader
1517c8e05aaSJulian Nagele
1527c8e05aaSJulian Nageleb2:
1537c8e05aaSJulian Nagele  %cmp2 = icmp ugt i16 %b, 8
1547c8e05aaSJulian Nagele  br i1 %cmp2, label %exit, label %preheader
1557c8e05aaSJulian Nagele
1567c8e05aaSJulian Nageleb3:
1577c8e05aaSJulian Nagele  %cmp3 = icmp ugt i16 %b, 12
1587c8e05aaSJulian Nagele  br i1 %cmp3, label %exit, label %preheader
1597c8e05aaSJulian Nagele
1607c8e05aaSJulian Nagelepreheader:
1617c8e05aaSJulian Nagele  %count = phi i16 [ %a, %b1 ], [ %b, %b2 ], [ %b, %b3 ]
1627c8e05aaSJulian Nagele  %cmp4 = icmp ne i16 %count, 0
1637c8e05aaSJulian Nagele  br i1 %cmp4, label %loop, label %exit
1647c8e05aaSJulian Nagele
1657c8e05aaSJulian Nageleloop:
1667c8e05aaSJulian Nagele  %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
1677c8e05aaSJulian Nagele  %iv.next = add i16 %iv, -1
1687c8e05aaSJulian Nagele  %exitcond = icmp eq i16 %iv.next, 0
1697c8e05aaSJulian Nagele  br i1 %exitcond, label %exit, label %loop
1707c8e05aaSJulian Nagele
1717c8e05aaSJulian Nageleexit:
1727c8e05aaSJulian Nagele  ret void
1737c8e05aaSJulian Nagele}
1747c8e05aaSJulian Nagele
1757c8e05aaSJulian Nageledefine void @mixed(i16 %a, i16 %b, i1 %c) {
1767c8e05aaSJulian Nagele; CHECK-LABEL: 'mixed'
1777c8e05aaSJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @mixed
1787c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %count)
1797c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i16 -2
1807c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + %count)
1817c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1827c8e05aaSJulian Nageleentry:
1837c8e05aaSJulian Nagele  br i1 %c, label %b1, label %b2
1847c8e05aaSJulian Nagele
1857c8e05aaSJulian Nageleb1:
1867c8e05aaSJulian Nagele  %cmp1 = icmp ugt i16 %a, 10
1877c8e05aaSJulian Nagele  br i1 %cmp1, label %exit, label %preheader
1887c8e05aaSJulian Nagele
1897c8e05aaSJulian Nageleb2:
1907c8e05aaSJulian Nagele  %cmp2 = icmp sgt i16 %b, 8
1917c8e05aaSJulian Nagele  br i1 %cmp2, label %exit, label %preheader
1927c8e05aaSJulian Nagele
1937c8e05aaSJulian Nagelepreheader:
1947c8e05aaSJulian Nagele  %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]
1957c8e05aaSJulian Nagele  %cmp3 = icmp ne i16 %count, 0
1967c8e05aaSJulian Nagele  br i1 %cmp3, label %loop, label %exit
1977c8e05aaSJulian Nagele
1987c8e05aaSJulian Nageleloop:
1997c8e05aaSJulian Nagele  %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
2007c8e05aaSJulian Nagele  %iv.next = add i16 %iv, -1
2017c8e05aaSJulian Nagele  %exitcond = icmp eq i16 %iv.next, 0
2027c8e05aaSJulian Nagele  br i1 %exitcond, label %exit, label %loop
2037c8e05aaSJulian Nagele
2047c8e05aaSJulian Nageleexit:
2057c8e05aaSJulian Nagele  ret void
2067c8e05aaSJulian Nagele}
2077c8e05aaSJulian Nagele
2087c8e05aaSJulian Nageledefine void @one_constant(i16 %a, i16 %b, i1 %c, i16 %d) {
2097c8e05aaSJulian Nagele; CHECK-LABEL: 'one_constant'
2107c8e05aaSJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @one_constant
2117c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %count)
2127c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i16 -2
2137c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + %count)
2147c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %loop: Trip multiple is 1
2157c8e05aaSJulian Nageleentry:
2167c8e05aaSJulian Nagele  br i1 %c, label %b1, label %b2
2177c8e05aaSJulian Nagele
2187c8e05aaSJulian Nageleb1:
2197c8e05aaSJulian Nagele  %cmp1 = icmp ugt i16 %a, 10
2207c8e05aaSJulian Nagele  br i1 %cmp1, label %exit, label %preheader
2217c8e05aaSJulian Nagele
2227c8e05aaSJulian Nageleb2:
2237c8e05aaSJulian Nagele  %cmp2 = icmp ugt i16 %b, %d
2247c8e05aaSJulian Nagele  br i1 %cmp2, label %exit, label %preheader
2257c8e05aaSJulian Nagele
2267c8e05aaSJulian Nagelepreheader:
2277c8e05aaSJulian Nagele  %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]
2287c8e05aaSJulian Nagele  %cmp3 = icmp ne i16 %count, 0
2297c8e05aaSJulian Nagele  br i1 %cmp3, label %loop, label %exit
2307c8e05aaSJulian Nagele
2317c8e05aaSJulian Nageleloop:
2327c8e05aaSJulian Nagele  %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]
2337c8e05aaSJulian Nagele  %iv.next = add i16 %iv, -1
2347c8e05aaSJulian Nagele  %exitcond = icmp eq i16 %iv.next, 0
2357c8e05aaSJulian Nagele  br i1 %exitcond, label %exit, label %loop
2367c8e05aaSJulian Nagele
2377c8e05aaSJulian Nageleexit:
2387c8e05aaSJulian Nagele  ret void
2397c8e05aaSJulian Nagele}
2407c8e05aaSJulian Nagele
2417c8e05aaSJulian Nageledefine void @epilogue(i64 %count) {
2427c8e05aaSJulian Nagele; CHECK-LABEL: 'epilogue'
2437c8e05aaSJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @epilogue
2447c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %epilogue: backedge-taken count is (-1 + %count.epilogue)
2457c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %epilogue: constant max backedge-taken count is i64 6
2467c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %epilogue: symbolic max backedge-taken count is (-1 + %count.epilogue)
2477c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %epilogue: Trip multiple is 1
2487c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %while.body: backedge-taken count is ((-8 + %count) /u 8)
2497c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %while.body: constant max backedge-taken count is i64 2305843009213693951
2507c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %while.body: symbolic max backedge-taken count is ((-8 + %count) /u 8)
2517c8e05aaSJulian Nagele; CHECK-NEXT:  Loop %while.body: Trip multiple is 1
2527c8e05aaSJulian Nageleentry:
2537c8e05aaSJulian Nagele  %cmp = icmp ugt i64 %count, 7
2547c8e05aaSJulian Nagele  br i1 %cmp, label %while.body, label %epilogue.preheader
2557c8e05aaSJulian Nagele
2567c8e05aaSJulian Nagelewhile.body:
2577c8e05aaSJulian Nagele  %iv = phi i64 [ %sub, %while.body ], [ %count, %entry ]
2587c8e05aaSJulian Nagele  %sub = add i64 %iv, -8
2597c8e05aaSJulian Nagele  %exitcond.not = icmp ugt i64 %sub, 7
2607c8e05aaSJulian Nagele  br i1 %exitcond.not, label %while.body, label %while.loopexit
2617c8e05aaSJulian Nagele
2627c8e05aaSJulian Nagelewhile.loopexit:
2637c8e05aaSJulian Nagele  %sub.exit = phi i64 [ %sub, %while.body ]
2647c8e05aaSJulian Nagele  br label %epilogue.preheader
2657c8e05aaSJulian Nagele
2667c8e05aaSJulian Nageleepilogue.preheader:
2677c8e05aaSJulian Nagele  %count.epilogue = phi i64 [ %count, %entry ], [ %sub.exit, %while.loopexit ]
2687c8e05aaSJulian Nagele  %epilogue.cmp = icmp eq i64 %count.epilogue, 0
2697c8e05aaSJulian Nagele  br i1 %epilogue.cmp, label %exit, label %epilogue
2707c8e05aaSJulian Nagele
2717c8e05aaSJulian Nageleepilogue:
2727c8e05aaSJulian Nagele  %iv.epilogue = phi i64 [ %dec, %epilogue ], [ %count.epilogue, %epilogue.preheader ]
2737c8e05aaSJulian Nagele  %dec = add i64 %iv.epilogue, -1
2747c8e05aaSJulian Nagele  %exitcond.epilogue = icmp eq i64 %dec, 0
2757c8e05aaSJulian Nagele  br i1 %exitcond.epilogue, label %exit, label %epilogue
2767c8e05aaSJulian Nagele
2777c8e05aaSJulian Nageleexit:
2787c8e05aaSJulian Nagele  ret void
2797c8e05aaSJulian Nagele}
280acfd26a9SJulian Nagele
281acfd26a9SJulian Nageledeclare void @llvm.assume(i1)
282acfd26a9SJulian Nagele
283acfd26a9SJulian Nagele; Checks that the presence of assumptions does not interfere with
284acfd26a9SJulian Nagele; exiting loop guard collection via following loop predecessors.
285acfd26a9SJulian Nageledefine void @pr120442(i1 %c.1, i1 %c.2) {
286acfd26a9SJulian Nagele; CHECK-LABEL: 'pr120442'
287acfd26a9SJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @pr120442
288acfd26a9SJulian Nagele; CHECK-NEXT:  Loop %inner.header: backedge-taken count is i32 0
289acfd26a9SJulian Nagele; CHECK-NEXT:  Loop %inner.header: constant max backedge-taken count is i32 0
290acfd26a9SJulian Nagele; CHECK-NEXT:  Loop %inner.header: symbolic max backedge-taken count is i32 0
291acfd26a9SJulian Nagele; CHECK-NEXT:  Loop %inner.header: Trip multiple is 1
292acfd26a9SJulian Nageleentry:
293acfd26a9SJulian Nagele  call void @llvm.assume(i1 %c.1)
294acfd26a9SJulian Nagele  call void @llvm.assume(i1 %c.2)
295acfd26a9SJulian Nagele  br label %outer.header
296acfd26a9SJulian Nagele
297acfd26a9SJulian Nageleouter.header:
298acfd26a9SJulian Nagele  %phi7 = phi i32 [ 0, %bb ], [ 0, %entry ]
299acfd26a9SJulian Nagele  br label %inner.header
300acfd26a9SJulian Nagele
301acfd26a9SJulian Nagelebb:
302acfd26a9SJulian Nagele  br i1 false, label %outer.header, label %bb
303acfd26a9SJulian Nagele
304acfd26a9SJulian Nageleinner.header:
305acfd26a9SJulian Nagele  %phi = phi i32 [ %add, %inner.header ], [ 0, %outer.header ]
306acfd26a9SJulian Nagele  %add = add i32 %phi, 1
307acfd26a9SJulian Nagele  %icmp = icmp ugt i32 %add, 0
308acfd26a9SJulian Nagele  br i1 %icmp, label %exit, label %inner.header
309acfd26a9SJulian Nagele
310acfd26a9SJulian Nageleexit:
311acfd26a9SJulian Nagele  ret void
312acfd26a9SJulian Nagele}
313f035351aSJulian Nagele
314f035351aSJulian Nagele; Checks correct traversal for loops without a unique predecessor
315f035351aSJulian Nagele; outside the loop.
316f035351aSJulian Nageledefine void @pr120615() {
317f035351aSJulian Nagele; CHECK-LABEL: pr120615
318f035351aSJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @pr120615
319f035351aSJulian Nagele; CHECK-NEXT:  Loop %header: backedge-taken count is i32 0
320f035351aSJulian Nagele; CHECK-NEXT:  Loop %header: constant max backedge-taken count is i32 0
321f035351aSJulian Nagele; CHECK-NEXT:  Loop %header: symbolic max backedge-taken count is i32 0
322f035351aSJulian Nagele; CHECK-NEXT:  Loop %header: Trip multiple is 1
323f035351aSJulian Nageleentry:
324f035351aSJulian Nagele  br label %header
325f035351aSJulian Nagele
326f035351aSJulian Nagelebb:
327f035351aSJulian Nagele  br label %header
328f035351aSJulian Nagele
329f035351aSJulian Nageleheader:
330f035351aSJulian Nagele  %0 = phi i32 [ %1, %header ], [ 0, %bb ], [ 0, %entry ]
331f035351aSJulian Nagele  %1 = add i32 %0, 1
332f035351aSJulian Nagele  %icmp = icmp slt i32 %0, 0
333f035351aSJulian Nagele  br i1 %icmp, label %header, label %exit
334f035351aSJulian Nagele
335f035351aSJulian Nageleexit:
336f035351aSJulian Nagele  ret void
337f035351aSJulian Nagele
338f035351aSJulian Nagele}
339*137d7067SJulian Nagele
340*137d7067SJulian Nagele; Checks correct traversal for loops without a unique predecessor
341*137d7067SJulian Nagele; outside the loop.
342*137d7067SJulian Nageledefine void @pr122913() {
343*137d7067SJulian Nagele; CHECK-LABEL: pr122913
344*137d7067SJulian Nagele; CHECK-NEXT:  Determining loop execution counts for: @pr122913
345*137d7067SJulian Nagele; CHECK-NEXT:  Loop %header: backedge-taken count is i1 false
346*137d7067SJulian Nagele; CHECK-NEXT:  Loop %header: constant max backedge-taken count is i1 false
347*137d7067SJulian Nagele; CHECK-NEXT:  Loop %header: symbolic max backedge-taken count is i1 false
348*137d7067SJulian Nagele; CHECK-NEXT:  Loop %header: Trip multiple is 1
349*137d7067SJulian Nageleentry:
350*137d7067SJulian Nagele  br i1 1, label %bb, label %header
351*137d7067SJulian Nagele
352*137d7067SJulian Nagelebb:
353*137d7067SJulian Nagele  br i1 1, label %exit, label %header
354*137d7067SJulian Nagele
355*137d7067SJulian Nageleheader:
356*137d7067SJulian Nagele  %0 = phi i32 [ %1, %body ], [ 0, %bb ], [ 0, %entry ]
357*137d7067SJulian Nagele  br label %body
358*137d7067SJulian Nagele
359*137d7067SJulian Nagelebody:
360*137d7067SJulian Nagele  %1 = add i32 %0, 1
361*137d7067SJulian Nagele  %2 = icmp ult i32 %1, 0
362*137d7067SJulian Nagele  br i1 %2, label %header, label %exit
363*137d7067SJulian Nagele
364*137d7067SJulian Nageleexit:
365*137d7067SJulian Nagele  ret void
366*137d7067SJulian Nagele}
367