1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt < %s -S -passes=loop-unroll -unroll-peel-max-count=3 | FileCheck %s 3 4declare void @foo(i32) 5declare void @bar(i8) 6 7define void @test_umin(i32 %N) { 8; CHECK-LABEL: define void @test_umin( 9; CHECK-SAME: i32 [[N:%.*]]) { 10; CHECK-NEXT: entry: 11; CHECK-NEXT: [[CMP5_NOT:%.*]] = icmp eq i32 [[N]], 0 12; CHECK-NEXT: br i1 [[CMP5_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]] 13; CHECK: for.body.preheader: 14; CHECK-NEXT: br label [[FOR_BODY_PEEL2:%.*]] 15; CHECK: for.body.peel.begin: 16; CHECK-NEXT: br label [[FOR_BODY_PEEL:%.*]] 17; CHECK: for.body.peel: 18; CHECK-NEXT: [[COND_PEEL:%.*]] = tail call i32 @llvm.umin.i32(i32 0, i32 2) 19; CHECK-NEXT: tail call void @foo(i32 [[COND_PEEL]]) 20; CHECK-NEXT: [[INC_PEEL:%.*]] = add nuw i32 0, 1 21; CHECK-NEXT: [[EXITCOND_NOT_PEEL:%.*]] = icmp eq i32 [[INC_PEEL]], [[N]] 22; CHECK-NEXT: br i1 [[EXITCOND_NOT_PEEL]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY_PEEL_NEXT:%.*]] 23; CHECK: for.body.peel.next: 24; CHECK-NEXT: br label [[FOR_BODY_PEEL3:%.*]] 25; CHECK: for.body.peel2: 26; CHECK-NEXT: [[COND_PEEL3:%.*]] = tail call i32 @llvm.umin.i32(i32 [[INC_PEEL]], i32 2) 27; CHECK-NEXT: tail call void @foo(i32 [[COND_PEEL3]]) 28; CHECK-NEXT: [[INC_PEEL4:%.*]] = add nuw i32 [[INC_PEEL]], 1 29; CHECK-NEXT: [[EXITCOND_NOT_PEEL5:%.*]] = icmp eq i32 [[INC_PEEL4]], [[N]] 30; CHECK-NEXT: br i1 [[EXITCOND_NOT_PEEL5]], label [[FOR_COND_CLEANUP_LOOPEXIT]], label [[FOR_BODY_PEEL_NEXT1:%.*]] 31; CHECK: for.body.peel.next1: 32; CHECK-NEXT: br label [[FOR_BODY_PEEL_NEXT6:%.*]] 33; CHECK: for.body.peel.next6: 34; CHECK-NEXT: br label [[FOR_BODY_PREHEADER_PEEL_NEWPH:%.*]] 35; CHECK: for.body.preheader.peel.newph: 36; CHECK-NEXT: br label [[FOR_BODY:%.*]] 37; CHECK: for.body: 38; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ [[INC_PEEL4]], [[FOR_BODY_PREHEADER_PEEL_NEWPH]] ] 39; CHECK-NEXT: tail call void @foo(i32 2) 40; CHECK-NEXT: [[INC]] = add nuw i32 [[I_06]], 1 41; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 42; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT_LOOPEXIT:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 43; CHECK: for.cond.cleanup.loopexit.loopexit: 44; CHECK-NEXT: br label [[FOR_COND_CLEANUP_LOOPEXIT]] 45; CHECK: for.cond.cleanup.loopexit: 46; CHECK-NEXT: br label [[FOR_COND_CLEANUP]] 47; CHECK: for.cond.cleanup: 48; CHECK-NEXT: ret void 49; 50entry: 51 %cmp5.not = icmp eq i32 %N, 0 52 br i1 %cmp5.not, label %for.cond.cleanup, label %for.body 53 54for.body: 55 %i.06 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 56 %cond = tail call i32 @llvm.umin.i32(i32 %i.06, i32 2) 57 tail call void @foo(i32 %cond) 58 %inc = add nuw i32 %i.06, 1 59 %exitcond.not = icmp eq i32 %inc, %N 60 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 61 62for.cond.cleanup: 63 ret void 64} 65 66define void @test_umax(i32 %N) { 67; CHECK-LABEL: define void @test_umax( 68; CHECK-SAME: i32 [[N:%.*]]) { 69; CHECK-NEXT: entry: 70; CHECK-NEXT: [[CMP5_NOT:%.*]] = icmp eq i32 [[N]], 0 71; CHECK-NEXT: br i1 [[CMP5_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]] 72; CHECK: for.body.preheader: 73; CHECK-NEXT: br label [[FOR_BODY_PEEL2:%.*]] 74; CHECK: for.body.peel.begin: 75; CHECK-NEXT: br label [[FOR_BODY_PEEL:%.*]] 76; CHECK: for.body.peel: 77; CHECK-NEXT: [[COND_PEEL:%.*]] = tail call i32 @llvm.umax.i32(i32 0, i32 2) 78; CHECK-NEXT: tail call void @foo(i32 [[COND_PEEL]]) 79; CHECK-NEXT: [[INC_PEEL:%.*]] = add nuw i32 0, 1 80; CHECK-NEXT: [[EXITCOND_NOT_PEEL:%.*]] = icmp eq i32 [[INC_PEEL]], [[N]] 81; CHECK-NEXT: br i1 [[EXITCOND_NOT_PEEL]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY_PEEL_NEXT:%.*]] 82; CHECK: for.body.peel.next: 83; CHECK-NEXT: br label [[FOR_BODY_PEEL3:%.*]] 84; CHECK: for.body.peel2: 85; CHECK-NEXT: [[COND_PEEL3:%.*]] = tail call i32 @llvm.umax.i32(i32 [[INC_PEEL]], i32 2) 86; CHECK-NEXT: tail call void @foo(i32 [[COND_PEEL3]]) 87; CHECK-NEXT: [[INC_PEEL4:%.*]] = add nuw i32 [[INC_PEEL]], 1 88; CHECK-NEXT: [[EXITCOND_NOT_PEEL5:%.*]] = icmp eq i32 [[INC_PEEL4]], [[N]] 89; CHECK-NEXT: br i1 [[EXITCOND_NOT_PEEL5]], label [[FOR_COND_CLEANUP_LOOPEXIT]], label [[FOR_BODY_PEEL_NEXT1:%.*]] 90; CHECK: for.body.peel.next1: 91; CHECK-NEXT: br label [[FOR_BODY_PEEL_NEXT6:%.*]] 92; CHECK: for.body.peel.next6: 93; CHECK-NEXT: br label [[FOR_BODY_PREHEADER_PEEL_NEWPH:%.*]] 94; CHECK: for.body.preheader.peel.newph: 95; CHECK-NEXT: br label [[FOR_BODY:%.*]] 96; CHECK: for.body: 97; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ [[INC_PEEL4]], [[FOR_BODY_PREHEADER_PEEL_NEWPH]] ] 98; CHECK-NEXT: tail call void @foo(i32 [[I_06]]) 99; CHECK-NEXT: [[INC]] = add nuw i32 [[I_06]], 1 100; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 101; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT_LOOPEXIT:%.*]], label [[FOR_BODY]], !llvm.loop [[LOOP2:![0-9]+]] 102; CHECK: for.cond.cleanup.loopexit.loopexit: 103; CHECK-NEXT: br label [[FOR_COND_CLEANUP_LOOPEXIT]] 104; CHECK: for.cond.cleanup.loopexit: 105; CHECK-NEXT: br label [[FOR_COND_CLEANUP]] 106; CHECK: for.cond.cleanup: 107; CHECK-NEXT: ret void 108; 109entry: 110 %cmp5.not = icmp eq i32 %N, 0 111 br i1 %cmp5.not, label %for.cond.cleanup, label %for.body 112 113for.body: 114 %i.06 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 115 %cond = tail call i32 @llvm.umax.i32(i32 %i.06, i32 2) 116 tail call void @foo(i32 %cond) 117 %inc = add nuw i32 %i.06, 1 118 %exitcond.not = icmp eq i32 %inc, %N 119 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 120 121for.cond.cleanup: 122 ret void 123} 124 125define void @test_smax(i32 %N) { 126; CHECK-LABEL: define void @test_smax( 127; CHECK-SAME: i32 [[N:%.*]]) { 128; CHECK-NEXT: entry: 129; CHECK-NEXT: [[CMP5:%.*]] = icmp slt i32 [[N]], 0 130; CHECK-NEXT: br i1 [[CMP5]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]] 131; CHECK: for.body.preheader: 132; CHECK-NEXT: br label [[FOR_BODY_PEEL2:%.*]] 133; CHECK: for.body.peel.begin: 134; CHECK-NEXT: br label [[FOR_BODY_PEEL:%.*]] 135; CHECK: for.body.peel: 136; CHECK-NEXT: [[COND_PEEL:%.*]] = tail call i32 @llvm.smax.i32(i32 0, i32 -2) 137; CHECK-NEXT: tail call void @foo(i32 [[COND_PEEL]]) 138; CHECK-NEXT: [[DEC_PEEL:%.*]] = add nsw i32 0, -1 139; CHECK-NEXT: [[CMP_PEEL:%.*]] = icmp sgt i32 [[DEC_PEEL]], [[N]] 140; CHECK-NEXT: br i1 [[CMP_PEEL]], label [[FOR_BODY_PEEL_NEXT:%.*]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]] 141; CHECK: for.body.peel.next: 142; CHECK-NEXT: br label [[FOR_BODY_PEEL3:%.*]] 143; CHECK: for.body.peel2: 144; CHECK-NEXT: [[COND_PEEL3:%.*]] = tail call i32 @llvm.smax.i32(i32 [[DEC_PEEL]], i32 -2) 145; CHECK-NEXT: tail call void @foo(i32 [[COND_PEEL3]]) 146; CHECK-NEXT: [[DEC_PEEL4:%.*]] = add nsw i32 [[DEC_PEEL]], -1 147; CHECK-NEXT: [[CMP_PEEL5:%.*]] = icmp sgt i32 [[DEC_PEEL4]], [[N]] 148; CHECK-NEXT: br i1 [[CMP_PEEL5]], label [[FOR_BODY_PEEL_NEXT1:%.*]], label [[FOR_COND_CLEANUP_LOOPEXIT]] 149; CHECK: for.body.peel.next1: 150; CHECK-NEXT: br label [[FOR_BODY_PEEL_NEXT6:%.*]] 151; CHECK: for.body.peel.next6: 152; CHECK-NEXT: br label [[FOR_BODY_PREHEADER_PEEL_NEWPH:%.*]] 153; CHECK: for.body.preheader.peel.newph: 154; CHECK-NEXT: br label [[FOR_BODY:%.*]] 155; CHECK: for.body: 156; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ [[DEC:%.*]], [[FOR_BODY]] ], [ [[DEC_PEEL4]], [[FOR_BODY_PREHEADER_PEEL_NEWPH]] ] 157; CHECK-NEXT: tail call void @foo(i32 -2) 158; CHECK-NEXT: [[DEC]] = add nsw i32 [[I_06]], -1 159; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[DEC]], [[N]] 160; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP_LOOPEXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP3:![0-9]+]] 161; CHECK: for.cond.cleanup.loopexit.loopexit: 162; CHECK-NEXT: br label [[FOR_COND_CLEANUP_LOOPEXIT]] 163; CHECK: for.cond.cleanup.loopexit: 164; CHECK-NEXT: br label [[FOR_COND_CLEANUP]] 165; CHECK: for.cond.cleanup: 166; CHECK-NEXT: ret void 167; 168entry: 169 %cmp5 = icmp slt i32 %N, 0 170 br i1 %cmp5, label %for.body, label %for.cond.cleanup 171 172for.body: 173 %i.06 = phi i32 [ %dec, %for.body ], [ 0, %entry ] 174 %cond = tail call i32 @llvm.smax.i32(i32 %i.06, i32 -2) 175 tail call void @foo(i32 %cond) 176 %dec = add nsw i32 %i.06, -1 177 %cmp = icmp sgt i32 %dec, %N 178 br i1 %cmp, label %for.body, label %for.cond.cleanup 179 180for.cond.cleanup: 181 ret void 182} 183 184define void @test_smin(i32 %N) { 185; CHECK-LABEL: define void @test_smin( 186; CHECK-SAME: i32 [[N:%.*]]) { 187; CHECK-NEXT: entry: 188; CHECK-NEXT: [[CMP5:%.*]] = icmp slt i32 [[N]], 0 189; CHECK-NEXT: br i1 [[CMP5]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]] 190; CHECK: for.body.preheader: 191; CHECK-NEXT: br label [[FOR_BODY_PEEL2:%.*]] 192; CHECK: for.body.peel.begin: 193; CHECK-NEXT: br label [[FOR_BODY_PEEL:%.*]] 194; CHECK: for.body.peel: 195; CHECK-NEXT: [[COND_PEEL:%.*]] = tail call i32 @llvm.smin.i32(i32 0, i32 -2) 196; CHECK-NEXT: tail call void @foo(i32 noundef signext [[COND_PEEL]]) 197; CHECK-NEXT: [[DEC_PEEL:%.*]] = add nsw i32 0, -1 198; CHECK-NEXT: [[CMP_PEEL:%.*]] = icmp sgt i32 [[DEC_PEEL]], [[N]] 199; CHECK-NEXT: br i1 [[CMP_PEEL]], label [[FOR_BODY_PEEL_NEXT:%.*]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]] 200; CHECK: for.body.peel.next: 201; CHECK-NEXT: br label [[FOR_BODY_PEEL3:%.*]] 202; CHECK: for.body.peel2: 203; CHECK-NEXT: [[COND_PEEL3:%.*]] = tail call i32 @llvm.smin.i32(i32 [[DEC_PEEL]], i32 -2) 204; CHECK-NEXT: tail call void @foo(i32 noundef signext [[COND_PEEL3]]) 205; CHECK-NEXT: [[DEC_PEEL4:%.*]] = add nsw i32 [[DEC_PEEL]], -1 206; CHECK-NEXT: [[CMP_PEEL5:%.*]] = icmp sgt i32 [[DEC_PEEL4]], [[N]] 207; CHECK-NEXT: br i1 [[CMP_PEEL5]], label [[FOR_BODY_PEEL_NEXT1:%.*]], label [[FOR_COND_CLEANUP_LOOPEXIT]] 208; CHECK: for.body.peel.next1: 209; CHECK-NEXT: br label [[FOR_BODY_PEEL_NEXT6:%.*]] 210; CHECK: for.body.peel.next6: 211; CHECK-NEXT: br label [[FOR_BODY_PREHEADER_PEEL_NEWPH:%.*]] 212; CHECK: for.body.preheader.peel.newph: 213; CHECK-NEXT: br label [[FOR_BODY:%.*]] 214; CHECK: for.body: 215; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ [[DEC:%.*]], [[FOR_BODY]] ], [ [[DEC_PEEL4]], [[FOR_BODY_PREHEADER_PEEL_NEWPH]] ] 216; CHECK-NEXT: tail call void @foo(i32 noundef signext [[I_06]]) 217; CHECK-NEXT: [[DEC]] = add nsw i32 [[I_06]], -1 218; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[DEC]], [[N]] 219; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP_LOOPEXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP4:![0-9]+]] 220; CHECK: for.cond.cleanup.loopexit.loopexit: 221; CHECK-NEXT: br label [[FOR_COND_CLEANUP_LOOPEXIT]] 222; CHECK: for.cond.cleanup.loopexit: 223; CHECK-NEXT: br label [[FOR_COND_CLEANUP]] 224; CHECK: for.cond.cleanup: 225; CHECK-NEXT: ret void 226; 227entry: 228 %cmp5 = icmp slt i32 %N, 0 229 br i1 %cmp5, label %for.body, label %for.cond.cleanup 230 231for.body: 232 %i.06 = phi i32 [ %dec, %for.body ], [ 0, %entry ] 233 %cond = tail call i32 @llvm.smin.i32(i32 %i.06, i32 -2) 234 tail call void @foo(i32 noundef signext %cond) 235 %dec = add nsw i32 %i.06, -1 236 %cmp = icmp sgt i32 %dec, %N 237 br i1 %cmp, label %for.body, label %for.cond.cleanup 238 239for.cond.cleanup: 240 ret void 241} 242 243define void @test_negative(i32 %End, i32 %Step) { 244; CHECK-LABEL: define void @test_negative( 245; CHECK-SAME: i32 [[END:%.*]], i32 [[STEP:%.*]]) { 246; CHECK-NEXT: entry: 247; CHECK-NEXT: [[CMP_NOT5:%.*]] = icmp eq i32 [[END]], 0 248; CHECK-NEXT: br i1 [[CMP_NOT5]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]] 249; CHECK: for.body.preheader: 250; CHECK-NEXT: br label [[FOR_BODY:%.*]] 251; CHECK: for.body: 252; CHECK-NEXT: [[I_06:%.*]] = phi i32 [ [[ADD:%.*]], [[FOR_BODY]] ], [ 0, [[FOR_BODY_PREHEADER]] ] 253; CHECK-NEXT: [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[I_06]], i32 2) 254; CHECK-NEXT: tail call void @foo(i32 [[COND]]) 255; CHECK-NEXT: [[ADD]] = add nsw i32 [[I_06]], [[STEP]] 256; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[ADD]], [[END]] 257; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY]] 258; CHECK: for.cond.cleanup.loopexit: 259; CHECK-NEXT: br label [[FOR_COND_CLEANUP]] 260; CHECK: for.cond.cleanup: 261; CHECK-NEXT: ret void 262; 263entry: 264 %cmp.not5 = icmp eq i32 %End, 0 265 br i1 %cmp.not5, label %for.cond.cleanup, label %for.body 266 267for.body: 268 %i.06 = phi i32 [ %add, %for.body ], [ 0, %entry ] 269 %cond = tail call i32 @llvm.smin.i32(i32 %i.06, i32 2) 270 tail call void @foo(i32 %cond) 271 %add = add nsw i32 %i.06, %Step 272 %cmp.not = icmp eq i32 %add, %End 273 br i1 %cmp.not, label %for.cond.cleanup, label %for.body 274 275for.cond.cleanup: 276 ret void 277} 278 279define void @test_max_count_threshold(i32 %N) { 280; CHECK-LABEL: define void @test_max_count_threshold( 281; CHECK-SAME: i32 [[N:%.*]]) { 282; CHECK-NEXT: entry: 283; CHECK-NEXT: [[CMP5_NOT:%.*]] = icmp eq i32 [[N]], 0 284; CHECK-NEXT: br i1 [[CMP5_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]] 285; CHECK: for.body.preheader: 286; CHECK-NEXT: br label [[FOR_BODY1:%.*]] 287; CHECK: for.body: 288; CHECK-NEXT: [[I_6:%.*]] = phi i32 [ [[INC1:%.*]], [[FOR_BODY1]] ], [ 0, [[FOR_BODY_PREHEADER]] ] 289; CHECK-NEXT: [[COND1:%.*]] = tail call i32 @llvm.umin.i32(i32 [[I_6]], i32 5) 290; CHECK-NEXT: tail call void @foo(i32 [[COND1]]) 291; CHECK-NEXT: [[INC1]] = add nuw i32 [[I_6]], 1 292; CHECK-NEXT: [[EXITCOND_NOT1:%.*]] = icmp eq i32 [[INC1]], [[N]] 293; CHECK-NEXT: br i1 [[EXITCOND_NOT1]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY1]] 294; CHECK: for.cond.cleanup.loopexit: 295; CHECK-NEXT: br label [[FOR_COND_CLEANUP]] 296; CHECK: for.cond.cleanup: 297; CHECK-NEXT: ret void 298; 299entry: 300 %cmp5.not = icmp eq i32 %N, 0 301 br i1 %cmp5.not, label %for.cond.cleanup, label %for.body 302 303for.body: 304 %i.06 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 305 %cond = tail call i32 @llvm.umin.i32(i32 %i.06, i32 5) 306 tail call void @foo(i32 %cond) 307 %inc = add nuw i32 %i.06, 1 308 %exitcond.not = icmp eq i32 %inc, %N 309 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 310 311for.cond.cleanup: 312 ret void 313} 314 315define void @test_wrap(i8 %N) { 316; CHECK-LABEL: define void @test_wrap( 317; CHECK-SAME: i8 [[N:%.*]]) { 318; CHECK-NEXT: entry: 319; CHECK-NEXT: [[CMP5_NOT:%.*]] = icmp eq i8 [[N]], 0 320; CHECK-NEXT: br i1 [[CMP5_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]] 321; CHECK: for.body.preheader: 322; CHECK-NEXT: br label [[FOR_BODY:%.*]] 323; CHECK: for.body: 324; CHECK-NEXT: [[I_06:%.*]] = phi i8 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[FOR_BODY_PREHEADER]] ] 325; CHECK-NEXT: [[COND:%.*]] = tail call i8 @llvm.umin.i8(i8 [[I_06]], i8 -2) 326; CHECK-NEXT: tail call void @bar(i8 [[COND]]) 327; CHECK-NEXT: [[INC]] = add i8 [[I_06]], 127 328; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i8 [[INC]], [[N]] 329; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY]] 330; CHECK: for.cond.cleanup.loopexit: 331; CHECK-NEXT: br label [[FOR_COND_CLEANUP]] 332; CHECK: for.cond.cleanup: 333; CHECK-NEXT: ret void 334; 335entry: 336 %cmp5.not = icmp eq i8 %N, 0 337 br i1 %cmp5.not, label %for.cond.cleanup, label %for.body 338 339for.body: 340 %i.06 = phi i8 [ %inc, %for.body ], [ 0, %entry ] 341 %cond = tail call i8 @llvm.umin.i8(i8 %i.06, i8 254) 342 tail call void @bar(i8 %cond) 343 %inc = add i8 %i.06, 127 344 %exitcond.not = icmp eq i8 %inc, %N 345 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 346 347for.cond.cleanup: 348 ret void 349} 350;. 351; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]]} 352; CHECK: [[META1]] = !{!"llvm.loop.peeled.count", i32 2} 353; CHECK: [[LOOP2]] = distinct !{[[LOOP2]], [[META1]]} 354; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]]} 355; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]]} 356;. 357