brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.3 KiB · 564ce6b Raw
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