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