393 lines · plain
1; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-max-iterations=0 -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s2 3define void @slt(i16 %a, i16 %b, i1 %c) {4; CHECK-LABEL: 'slt'5; CHECK-NEXT: Determining loop execution counts for: @slt6; CHECK-NEXT: Loop %loop: backedge-taken count is (19 + (-1 * %count)<nsw>)<nsw>7; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 188; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (19 + (-1 * %count)<nsw>)<nsw>9; CHECK-NEXT: Loop %loop: Trip multiple is 110entry:11 br i1 %c, label %b1, label %b212 13b1:14 %cmp1 = icmp slt i16 %a, 115 br i1 %cmp1, label %exit, label %preheader16 17b2:18 %cmp2 = icmp slt i16 %b, 419 br i1 %cmp2, label %exit, label %preheader20 21preheader:22 %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]23 %cmp3 = icmp sle i16 %count, 1924 br i1 %cmp3, label %loop, label %exit25 26loop:27 %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]28 %iv.next = add i16 %iv, 129 %exitcond = icmp eq i16 %iv.next, 2030 br i1 %exitcond, label %exit, label %loop31 32exit:33 ret void34}35 36define void @ult(i16 %a, i16 %b, i1 %c) {37; CHECK-LABEL: 'ult'38; CHECK-NEXT: Determining loop execution counts for: @ult39; CHECK-NEXT: Loop %loop: backedge-taken count is (21 + (-1 * %count))40; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 1941; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (21 + (-1 * %count))42; CHECK-NEXT: Loop %loop: Trip multiple is 143entry:44 br i1 %c, label %b1, label %b245 46b1:47 %cmp1 = icmp ult i16 %a, 248 br i1 %cmp1, label %exit, label %preheader49 50b2:51 %cmp2 = icmp ult i16 %b, 552 br i1 %cmp2, label %exit, label %preheader53 54preheader:55 %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]56 %cmp3 = icmp ule i16 %count, 2057 br i1 %cmp3, label %loop, label %exit58 59loop:60 %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]61 %iv.next = add i16 %iv, 162 %exitcond = icmp eq i16 %iv.next, 2263 br i1 %exitcond, label %exit, label %loop64 65exit:66 ret void67}68 69define void @sgt(i16 %a, i16 %b, i1 %c) {70; CHECK-LABEL: 'sgt'71; CHECK-NEXT: Determining loop execution counts for: @sgt72; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)73; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 974; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)75; CHECK-NEXT: Loop %loop: Trip multiple is 176entry:77 br i1 %c, label %b1, label %b278 79b1:80 %cmp1 = icmp sgt i16 %a, 1081 br i1 %cmp1, label %exit, label %preheader82 83b2:84 %cmp2 = icmp sgt i16 %b, 885 br i1 %cmp2, label %exit, label %preheader86 87preheader:88 %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]89 %cmp3 = icmp sge i16 %count, 190 br i1 %cmp3, label %loop, label %exit91 92loop:93 %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]94 %iv.next = add i16 %iv, -195 %exitcond = icmp eq i16 %iv.next, 096 br i1 %exitcond, label %exit, label %loop97 98exit:99 ret void100}101 102define void @ugt(i16 %a, i16 %b, i1 %c) {103; CHECK-LABEL: 'ugt'104; CHECK-NEXT: Determining loop execution counts for: @ugt105; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)<nsw>106; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 10107; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)<nsw>108; CHECK-NEXT: Loop %loop: Trip multiple is 1109entry:110 br i1 %c, label %b1, label %b2111 112b1:113 %cmp1 = icmp ugt i16 %a, 11114 br i1 %cmp1, label %exit, label %preheader115 116b2:117 %cmp2 = icmp ugt i16 %b, 7118 br i1 %cmp2, label %exit, label %preheader119 120preheader:121 %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]122 %cmp3 = icmp ne i16 %count, 0123 br i1 %cmp3, label %loop, label %exit124 125loop:126 %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]127 %iv.next = add i16 %iv, -1128 %exitcond = icmp eq i16 %iv.next, 0129 br i1 %exitcond, label %exit, label %loop130 131exit:132 ret void133}134 135define void @three_incoming(i16 %a, i16 %b, i1 %c, i1 %d) {136; CHECK-LABEL: 'three_incoming'137; CHECK-NEXT: Determining loop execution counts for: @three_incoming138; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)<nsw>139; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 11140; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)<nsw>141; CHECK-NEXT: Loop %loop: Trip multiple is 1142entry:143 br i1 %c, label %b1, label %entry2144 145entry2:146 br i1 %d, label %b2, label %b3147 148b1:149 %cmp1 = icmp ugt i16 %a, 10150 br i1 %cmp1, label %exit, label %preheader151 152b2:153 %cmp2 = icmp ugt i16 %b, 8154 br i1 %cmp2, label %exit, label %preheader155 156b3:157 %cmp3 = icmp ugt i16 %b, 12158 br i1 %cmp3, label %exit, label %preheader159 160preheader:161 %count = phi i16 [ %a, %b1 ], [ %b, %b2 ], [ %b, %b3 ]162 %cmp4 = icmp ne i16 %count, 0163 br i1 %cmp4, label %loop, label %exit164 165loop:166 %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]167 %iv.next = add i16 %iv, -1168 %exitcond = icmp eq i16 %iv.next, 0169 br i1 %exitcond, label %exit, label %loop170 171exit:172 ret void173}174 175define void @mixed(i16 %a, i16 %b, i1 %c) {176; CHECK-LABEL: 'mixed'177; CHECK-NEXT: Determining loop execution counts for: @mixed178; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)179; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 -2180; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)181; CHECK-NEXT: Loop %loop: Trip multiple is 1182entry:183 br i1 %c, label %b1, label %b2184 185b1:186 %cmp1 = icmp ugt i16 %a, 10187 br i1 %cmp1, label %exit, label %preheader188 189b2:190 %cmp2 = icmp sgt i16 %b, 8191 br i1 %cmp2, label %exit, label %preheader192 193preheader:194 %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]195 %cmp3 = icmp ne i16 %count, 0196 br i1 %cmp3, label %loop, label %exit197 198loop:199 %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]200 %iv.next = add i16 %iv, -1201 %exitcond = icmp eq i16 %iv.next, 0202 br i1 %exitcond, label %exit, label %loop203 204exit:205 ret void206}207 208define void @one_constant(i16 %a, i16 %b, i1 %c, i16 %d) {209; CHECK-LABEL: 'one_constant'210; CHECK-NEXT: Determining loop execution counts for: @one_constant211; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + %count)212; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 -2213; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + %count)214; CHECK-NEXT: Loop %loop: Trip multiple is 1215entry:216 br i1 %c, label %b1, label %b2217 218b1:219 %cmp1 = icmp ugt i16 %a, 10220 br i1 %cmp1, label %exit, label %preheader221 222b2:223 %cmp2 = icmp ugt i16 %b, %d224 br i1 %cmp2, label %exit, label %preheader225 226preheader:227 %count = phi i16 [ %a, %b1 ], [ %b, %b2 ]228 %cmp3 = icmp ne i16 %count, 0229 br i1 %cmp3, label %loop, label %exit230 231loop:232 %iv = phi i16 [ %iv.next, %loop ], [ %count, %preheader ]233 %iv.next = add i16 %iv, -1234 %exitcond = icmp eq i16 %iv.next, 0235 br i1 %exitcond, label %exit, label %loop236 237exit:238 ret void239}240 241define void @epilogue(i64 %count) {242; CHECK-LABEL: 'epilogue'243; CHECK-NEXT: Determining loop execution counts for: @epilogue244; CHECK-NEXT: Loop %epilogue: backedge-taken count is (-1 + %count.epilogue)245; CHECK-NEXT: Loop %epilogue: constant max backedge-taken count is i64 6246; CHECK-NEXT: Loop %epilogue: symbolic max backedge-taken count is (-1 + %count.epilogue)247; CHECK-NEXT: Loop %epilogue: Trip multiple is 1248; CHECK-NEXT: Loop %while.body: backedge-taken count is ((-8 + %count) /u 8)249; CHECK-NEXT: Loop %while.body: constant max backedge-taken count is i64 2305843009213693951250; CHECK-NEXT: Loop %while.body: symbolic max backedge-taken count is ((-8 + %count) /u 8)251; CHECK-NEXT: Loop %while.body: Trip multiple is 1252entry:253 %cmp = icmp ugt i64 %count, 7254 br i1 %cmp, label %while.body, label %epilogue.preheader255 256while.body:257 %iv = phi i64 [ %sub, %while.body ], [ %count, %entry ]258 %sub = add i64 %iv, -8259 %exitcond.not = icmp ugt i64 %sub, 7260 br i1 %exitcond.not, label %while.body, label %while.loopexit261 262while.loopexit:263 %sub.exit = phi i64 [ %sub, %while.body ]264 br label %epilogue.preheader265 266epilogue.preheader:267 %count.epilogue = phi i64 [ %count, %entry ], [ %sub.exit, %while.loopexit ]268 %epilogue.cmp = icmp eq i64 %count.epilogue, 0269 br i1 %epilogue.cmp, label %exit, label %epilogue270 271epilogue:272 %iv.epilogue = phi i64 [ %dec, %epilogue ], [ %count.epilogue, %epilogue.preheader ]273 %dec = add i64 %iv.epilogue, -1274 %exitcond.epilogue = icmp eq i64 %dec, 0275 br i1 %exitcond.epilogue, label %exit, label %epilogue276 277exit:278 ret void279}280 281declare void @llvm.assume(i1)282 283; Checks that the presence of assumptions does not interfere with284; exiting loop guard collection via following loop predecessors.285define void @pr120442(i1 %c.1, i1 %c.2) {286; CHECK-LABEL: 'pr120442'287; CHECK-NEXT: Determining loop execution counts for: @pr120442288; CHECK-NEXT: Loop %inner.header: backedge-taken count is i32 0289; CHECK-NEXT: Loop %inner.header: constant max backedge-taken count is i32 0290; CHECK-NEXT: Loop %inner.header: symbolic max backedge-taken count is i32 0291; CHECK-NEXT: Loop %inner.header: Trip multiple is 1292entry:293 call void @llvm.assume(i1 %c.1)294 call void @llvm.assume(i1 %c.2)295 br label %outer.header296 297outer.header:298 %phi7 = phi i32 [ 0, %bb ], [ 0, %entry ]299 br label %inner.header300 301bb:302 br i1 false, label %outer.header, label %bb303 304inner.header:305 %phi = phi i32 [ %add, %inner.header ], [ 0, %outer.header ]306 %add = add i32 %phi, 1307 %icmp = icmp ugt i32 %add, 0308 br i1 %icmp, label %exit, label %inner.header309 310exit:311 ret void312}313 314; Checks correct traversal for loops without a unique predecessor315; outside the loop.316define void @pr120615() {317; CHECK-LABEL: pr120615318; CHECK-NEXT: Determining loop execution counts for: @pr120615319; CHECK-NEXT: Loop %header: backedge-taken count is i32 0320; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 0321; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is i32 0322; CHECK-NEXT: Loop %header: Trip multiple is 1323entry:324 br label %header325 326bb:327 br label %header328 329header:330 %0 = phi i32 [ %1, %header ], [ 0, %bb ], [ 0, %entry ]331 %1 = add i32 %0, 1332 %icmp = icmp slt i32 %0, 0333 br i1 %icmp, label %header, label %exit334 335exit:336 ret void337 338}339 340; Checks correct traversal for loops without a unique predecessor341; outside the loop.342define void @pr122913() {343; CHECK-LABEL: pr122913344; CHECK-NEXT: Determining loop execution counts for: @pr122913345; CHECK-NEXT: Loop %header: backedge-taken count is i1 false346; CHECK-NEXT: Loop %header: constant max backedge-taken count is i1 false347; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is i1 false348; CHECK-NEXT: Loop %header: Trip multiple is 1349entry:350 br i1 1, label %bb, label %header351 352bb:353 br i1 1, label %exit, label %header354 355header:356 %0 = phi i32 [ %1, %body ], [ 0, %bb ], [ 0, %entry ]357 br label %body358 359body:360 %1 = add i32 %0, 1361 %2 = icmp ult i32 %1, 0362 br i1 %2, label %header, label %exit363 364exit:365 ret void366}367 368define void @hang_due_to_unreachable_phi_inblock() personality ptr null {369bb:370 br label %bb6371 372self-loop: ; preds = %self-loop373 %dead = invoke ptr null()374 to label %self-loop unwind label %bb4375 376bb4: ; preds = %self-loop377 %i5 = landingpad { ptr, i32 }378 cleanup379 br label %bb6380 381bb6: ; preds = %bb4, %bb382 %i7 = phi ptr [ null, %bb4 ], [ null, %bb ]383 br label %bb8384 385bb8: ; preds = %bb8, %bb6386 %i9 = phi ptr [ null, %bb8 ], [ null, %bb6 ]387 %i11 = icmp eq ptr %i9, null388 br i1 %i11, label %bb12, label %bb8389 390bb12: ; preds = %bb8, %bb6391 ret void392}393