1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=false -unroll-runtime-multi-exit=true -unroll-count=4 -verify-dom-info -S | FileCheck %s 3 4; REQUIRES: asserts 5; The tests below are for verifying dom tree after runtime unrolling 6; with multiple exit/exiting blocks. 7 8; We explicitly set the unroll count so that expensiveTripCount computation is allowed. 9 10; mergedexit block has edges from loop exit blocks. 11define i64 @test1() { 12; CHECK-LABEL: @test1( 13; CHECK-NEXT: entry: 14; CHECK-NEXT: br label [[PREHEADER:%.*]] 15; CHECK: preheader: 16; CHECK-NEXT: [[TRIP:%.*]] = zext i32 undef to i64 17; CHECK-NEXT: br label [[HEADER:%.*]] 18; CHECK: header: 19; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 2, [[PREHEADER]] ], [ [[ADD_IV_3:%.*]], [[LATCH_3:%.*]] ] 20; CHECK-NEXT: [[ADD_IV:%.*]] = add nuw nsw i64 [[IV]], 2 21; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i64 [[ADD_IV]], [[TRIP]] 22; CHECK-NEXT: br i1 [[CMP1]], label [[LATCH:%.*]], label [[HEADEREXIT:%.*]] 23; CHECK: latch: 24; CHECK-NEXT: [[SHFT:%.*]] = ashr i64 [[ADD_IV]], 1 25; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i64 [[SHFT]], [[TRIP]] 26; CHECK-NEXT: br i1 [[CMP2]], label [[HEADER_1:%.*]], label [[LATCHEXIT:%.*]] 27; CHECK: header.1: 28; CHECK-NEXT: [[ADD_IV_1:%.*]] = add nuw nsw i64 [[ADD_IV]], 2 29; CHECK-NEXT: [[CMP1_1:%.*]] = icmp ult i64 [[ADD_IV_1]], [[TRIP]] 30; CHECK-NEXT: br i1 [[CMP1_1]], label [[LATCH_1:%.*]], label [[HEADEREXIT]] 31; CHECK: latch.1: 32; CHECK-NEXT: [[SHFT_1:%.*]] = ashr i64 [[ADD_IV_1]], 1 33; CHECK-NEXT: [[CMP2_1:%.*]] = icmp ult i64 [[SHFT_1]], [[TRIP]] 34; CHECK-NEXT: br i1 [[CMP2_1]], label [[HEADER_2:%.*]], label [[LATCHEXIT]] 35; CHECK: header.2: 36; CHECK-NEXT: [[ADD_IV_2:%.*]] = add nuw nsw i64 [[ADD_IV_1]], 2 37; CHECK-NEXT: [[CMP1_2:%.*]] = icmp ult i64 [[ADD_IV_2]], [[TRIP]] 38; CHECK-NEXT: br i1 [[CMP1_2]], label [[LATCH_2:%.*]], label [[HEADEREXIT]] 39; CHECK: latch.2: 40; CHECK-NEXT: [[SHFT_2:%.*]] = ashr i64 [[ADD_IV_2]], 1 41; CHECK-NEXT: [[CMP2_2:%.*]] = icmp ult i64 [[SHFT_2]], [[TRIP]] 42; CHECK-NEXT: br i1 [[CMP2_2]], label [[HEADER_3:%.*]], label [[LATCHEXIT]] 43; CHECK: header.3: 44; CHECK-NEXT: [[ADD_IV_3]] = add nuw nsw i64 [[ADD_IV_2]], 2 45; CHECK-NEXT: [[CMP1_3:%.*]] = icmp ult i64 [[ADD_IV_3]], [[TRIP]] 46; CHECK-NEXT: br i1 [[CMP1_3]], label [[LATCH_3]], label [[HEADEREXIT]] 47; CHECK: latch.3: 48; CHECK-NEXT: [[SHFT_3:%.*]] = ashr i64 [[ADD_IV_3]], 1 49; CHECK-NEXT: [[CMP2_3:%.*]] = icmp ult i64 [[SHFT_3]], [[TRIP]] 50; CHECK-NEXT: br i1 [[CMP2_3]], label [[HEADER]], label [[LATCHEXIT]], !llvm.loop [[LOOP0:![0-9]+]] 51; CHECK: headerexit: 52; CHECK-NEXT: [[ADDPHI:%.*]] = phi i64 [ [[ADD_IV]], [[HEADER]] ], [ [[ADD_IV_1]], [[HEADER_1]] ], [ [[ADD_IV_2]], [[HEADER_2]] ], [ [[ADD_IV_3]], [[HEADER_3]] ] 53; CHECK-NEXT: br label [[MERGEDEXIT:%.*]] 54; CHECK: latchexit: 55; CHECK-NEXT: [[SHFTPHI:%.*]] = phi i64 [ [[SHFT]], [[LATCH]] ], [ [[SHFT_1]], [[LATCH_1]] ], [ [[SHFT_2]], [[LATCH_2]] ], [ [[SHFT_3]], [[LATCH_3]] ] 56; CHECK-NEXT: br label [[MERGEDEXIT]] 57; CHECK: mergedexit: 58; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[ADDPHI]], [[HEADEREXIT]] ], [ [[SHFTPHI]], [[LATCHEXIT]] ] 59; CHECK-NEXT: ret i64 [[RETVAL]] 60; 61entry: 62 br label %preheader 63 64preheader: ; preds = %bb 65 %trip = zext i32 undef to i64 66 br label %header 67 68header: ; preds = %latch, %preheader 69 %iv = phi i64 [ 2, %preheader ], [ %add.iv, %latch ] 70 %add.iv = add nuw nsw i64 %iv, 2 71 %cmp1 = icmp ult i64 %add.iv, %trip 72 br i1 %cmp1, label %latch, label %headerexit 73 74latch: ; preds = %header 75 %shft = ashr i64 %add.iv, 1 76 %cmp2 = icmp ult i64 %shft, %trip 77 br i1 %cmp2, label %header, label %latchexit 78 79headerexit: ; preds = %header 80 %addphi = phi i64 [ %add.iv, %header ] 81 br label %mergedexit 82 83latchexit: ; preds = %latch 84 %shftphi = phi i64 [ %shft, %latch ] 85 br label %mergedexit 86 87mergedexit: ; preds = %latchexit, %headerexit 88 %retval = phi i64 [ %addphi, %headerexit ], [ %shftphi, %latchexit ] 89 ret i64 %retval 90} 91 92; mergedexit has edges from loop exit blocks and a block outside the loop. 93define void @test2(i1 %cond, i32 %n) { 94; CHECK-LABEL: @test2( 95; CHECK-NEXT: entry: 96; CHECK-NEXT: br i1 [[COND:%.*]], label [[PREHEADER:%.*]], label [[MERGEDEXIT:%.*]] 97; CHECK: preheader: 98; CHECK-NEXT: [[TRIP:%.*]] = zext i32 [[N:%.*]] to i64 99; CHECK-NEXT: br label [[HEADER:%.*]] 100; CHECK: header: 101; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 2, [[PREHEADER]] ], [ [[ADD_IV_3:%.*]], [[LATCH_3:%.*]] ] 102; CHECK-NEXT: [[ADD_IV:%.*]] = add nuw nsw i64 [[IV]], 2 103; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i64 [[ADD_IV]], [[TRIP]] 104; CHECK-NEXT: br i1 [[CMP1]], label [[LATCH:%.*]], label [[HEADEREXIT:%.*]] 105; CHECK: latch: 106; CHECK-NEXT: [[SHFT:%.*]] = ashr i64 [[ADD_IV]], 1 107; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i64 [[SHFT]], [[TRIP]] 108; CHECK-NEXT: br i1 [[CMP2]], label [[HEADER_1:%.*]], label [[LATCHEXIT:%.*]] 109; CHECK: header.1: 110; CHECK-NEXT: [[ADD_IV_1:%.*]] = add nuw nsw i64 [[ADD_IV]], 2 111; CHECK-NEXT: [[CMP1_1:%.*]] = icmp ult i64 [[ADD_IV_1]], [[TRIP]] 112; CHECK-NEXT: br i1 [[CMP1_1]], label [[LATCH_1:%.*]], label [[HEADEREXIT]] 113; CHECK: latch.1: 114; CHECK-NEXT: [[SHFT_1:%.*]] = ashr i64 [[ADD_IV_1]], 1 115; CHECK-NEXT: [[CMP2_1:%.*]] = icmp ult i64 [[SHFT_1]], [[TRIP]] 116; CHECK-NEXT: br i1 [[CMP2_1]], label [[HEADER_2:%.*]], label [[LATCHEXIT]] 117; CHECK: header.2: 118; CHECK-NEXT: [[ADD_IV_2:%.*]] = add nuw nsw i64 [[ADD_IV_1]], 2 119; CHECK-NEXT: [[CMP1_2:%.*]] = icmp ult i64 [[ADD_IV_2]], [[TRIP]] 120; CHECK-NEXT: br i1 [[CMP1_2]], label [[LATCH_2:%.*]], label [[HEADEREXIT]] 121; CHECK: latch.2: 122; CHECK-NEXT: [[SHFT_2:%.*]] = ashr i64 [[ADD_IV_2]], 1 123; CHECK-NEXT: [[CMP2_2:%.*]] = icmp ult i64 [[SHFT_2]], [[TRIP]] 124; CHECK-NEXT: br i1 [[CMP2_2]], label [[HEADER_3:%.*]], label [[LATCHEXIT]] 125; CHECK: header.3: 126; CHECK-NEXT: [[ADD_IV_3]] = add nuw nsw i64 [[ADD_IV_2]], 2 127; CHECK-NEXT: [[CMP1_3:%.*]] = icmp ult i64 [[ADD_IV_3]], [[TRIP]] 128; CHECK-NEXT: br i1 [[CMP1_3]], label [[LATCH_3]], label [[HEADEREXIT]] 129; CHECK: latch.3: 130; CHECK-NEXT: [[SHFT_3:%.*]] = ashr i64 [[ADD_IV_3]], 1 131; CHECK-NEXT: [[CMP2_3:%.*]] = icmp ult i64 [[SHFT_3]], [[TRIP]] 132; CHECK-NEXT: br i1 [[CMP2_3]], label [[HEADER]], label [[LATCHEXIT]], !llvm.loop [[LOOP2:![0-9]+]] 133; CHECK: headerexit: 134; CHECK-NEXT: br label [[MERGEDEXIT]] 135; CHECK: latchexit: 136; CHECK-NEXT: br label [[MERGEDEXIT]] 137; CHECK: mergedexit: 138; CHECK-NEXT: ret void 139; 140entry: 141 br i1 %cond, label %preheader, label %mergedexit 142 143preheader: ; preds = %entry 144 %trip = zext i32 %n to i64 145 br label %header 146 147header: ; preds = %latch, %preheader 148 %iv = phi i64 [ 2, %preheader ], [ %add.iv, %latch ] 149 %add.iv = add nuw nsw i64 %iv, 2 150 %cmp1 = icmp ult i64 %add.iv, %trip 151 br i1 %cmp1, label %latch, label %headerexit 152 153latch: ; preds = %header 154 %shft = ashr i64 %add.iv, 1 155 %cmp2 = icmp ult i64 %shft, %trip 156 br i1 %cmp2, label %header, label %latchexit 157 158headerexit: ; preds = %header 159 br label %mergedexit 160 161latchexit: ; preds = %latch 162 br label %mergedexit 163 164mergedexit: ; preds = %latchexit, %headerexit, %entry 165 ret void 166} 167 168 169; exitsucc is from loop exit block only. 170define i64 @test3(i32 %n) { 171; CHECK-LABEL: @test3( 172; CHECK-NEXT: entry: 173; CHECK-NEXT: br label [[PREHEADER:%.*]] 174; CHECK: preheader: 175; CHECK-NEXT: [[TRIP:%.*]] = zext i32 [[N:%.*]] to i64 176; CHECK-NEXT: br label [[HEADER:%.*]] 177; CHECK: header: 178; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 2, [[PREHEADER]] ], [ [[ADD_IV_3:%.*]], [[LATCH_3:%.*]] ] 179; CHECK-NEXT: [[ADD_IV:%.*]] = add nuw nsw i64 [[IV]], 2 180; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i64 [[ADD_IV]], [[TRIP]] 181; CHECK-NEXT: br i1 [[CMP1]], label [[LATCH:%.*]], label [[HEADEREXIT:%.*]] 182; CHECK: latch: 183; CHECK-NEXT: [[SHFT:%.*]] = ashr i64 [[ADD_IV]], 1 184; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i64 [[SHFT]], [[TRIP]] 185; CHECK-NEXT: br i1 [[CMP2]], label [[HEADER_1:%.*]], label [[LATCHEXIT:%.*]] 186; CHECK: header.1: 187; CHECK-NEXT: [[ADD_IV_1:%.*]] = add nuw nsw i64 [[ADD_IV]], 2 188; CHECK-NEXT: [[CMP1_1:%.*]] = icmp ult i64 [[ADD_IV_1]], [[TRIP]] 189; CHECK-NEXT: br i1 [[CMP1_1]], label [[LATCH_1:%.*]], label [[HEADEREXIT]] 190; CHECK: latch.1: 191; CHECK-NEXT: [[SHFT_1:%.*]] = ashr i64 [[ADD_IV_1]], 1 192; CHECK-NEXT: [[CMP2_1:%.*]] = icmp ult i64 [[SHFT_1]], [[TRIP]] 193; CHECK-NEXT: br i1 [[CMP2_1]], label [[HEADER_2:%.*]], label [[LATCHEXIT]] 194; CHECK: header.2: 195; CHECK-NEXT: [[ADD_IV_2:%.*]] = add nuw nsw i64 [[ADD_IV_1]], 2 196; CHECK-NEXT: [[CMP1_2:%.*]] = icmp ult i64 [[ADD_IV_2]], [[TRIP]] 197; CHECK-NEXT: br i1 [[CMP1_2]], label [[LATCH_2:%.*]], label [[HEADEREXIT]] 198; CHECK: latch.2: 199; CHECK-NEXT: [[SHFT_2:%.*]] = ashr i64 [[ADD_IV_2]], 1 200; CHECK-NEXT: [[CMP2_2:%.*]] = icmp ult i64 [[SHFT_2]], [[TRIP]] 201; CHECK-NEXT: br i1 [[CMP2_2]], label [[HEADER_3:%.*]], label [[LATCHEXIT]] 202; CHECK: header.3: 203; CHECK-NEXT: [[ADD_IV_3]] = add nuw nsw i64 [[ADD_IV_2]], 2 204; CHECK-NEXT: [[CMP1_3:%.*]] = icmp ult i64 [[ADD_IV_3]], [[TRIP]] 205; CHECK-NEXT: br i1 [[CMP1_3]], label [[LATCH_3]], label [[HEADEREXIT]] 206; CHECK: latch.3: 207; CHECK-NEXT: [[SHFT_3:%.*]] = ashr i64 [[ADD_IV_3]], 1 208; CHECK-NEXT: [[CMP2_3:%.*]] = icmp ult i64 [[SHFT_3]], [[TRIP]] 209; CHECK-NEXT: br i1 [[CMP2_3]], label [[HEADER]], label [[LATCHEXIT]], !llvm.loop [[LOOP3:![0-9]+]] 210; CHECK: headerexit: 211; CHECK-NEXT: br label [[EXITSUCC:%.*]] 212; CHECK: latchexit: 213; CHECK-NEXT: [[SHFTPHI:%.*]] = phi i64 [ [[SHFT]], [[LATCH]] ], [ [[SHFT_1]], [[LATCH_1]] ], [ [[SHFT_2]], [[LATCH_2]] ], [ [[SHFT_3]], [[LATCH_3]] ] 214; CHECK-NEXT: ret i64 [[SHFTPHI]] 215; CHECK: exitsucc: 216; CHECK-NEXT: ret i64 96 217; 218entry: 219 br label %preheader 220 221preheader: ; preds = %bb 222 %trip = zext i32 %n to i64 223 br label %header 224 225header: ; preds = %latch, %preheader 226 %iv = phi i64 [ 2, %preheader ], [ %add.iv, %latch ] 227 %add.iv = add nuw nsw i64 %iv, 2 228 %cmp1 = icmp ult i64 %add.iv, %trip 229 br i1 %cmp1, label %latch, label %headerexit 230 231latch: ; preds = %header 232 %shft = ashr i64 %add.iv, 1 233 %cmp2 = icmp ult i64 %shft, %trip 234 br i1 %cmp2, label %header, label %latchexit 235 236headerexit: ; preds = %header 237 br label %exitsucc 238 239latchexit: ; preds = %latch 240 %shftphi = phi i64 [ %shft, %latch ] 241 ret i64 %shftphi 242 243exitsucc: ; preds = %headerexit 244 ret i64 96 245} 246 247; exit block (%default) has an exiting block and another exit block as predecessors. 248define void @test4(i16 %c3) { 249; CHECK-LABEL: @test4( 250; CHECK-NEXT: preheader: 251; CHECK-NEXT: [[C1:%.*]] = zext i32 undef to i64 252; CHECK-NEXT: [[UMAX:%.*]] = call i64 @llvm.umax.i64(i64 [[C1]], i64 1) 253; CHECK-NEXT: [[TMP0:%.*]] = add nsw i64 [[UMAX]], -1 254; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[UMAX]], 3 255; CHECK-NEXT: [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0 256; CHECK-NEXT: br i1 [[LCMP_MOD]], label [[HEADER_PROL_PREHEADER:%.*]], label [[HEADER_PROL_LOOPEXIT:%.*]] 257; CHECK: header.prol.preheader: 258; CHECK-NEXT: br label [[HEADER_PROL:%.*]] 259; CHECK: header.prol: 260; CHECK-NEXT: [[INDVARS_IV_PROL:%.*]] = phi i64 [ 0, [[HEADER_PROL_PREHEADER]] ], [ [[INDVARS_IV_NEXT_PROL:%.*]], [[LATCH_PROL:%.*]] ] 261; CHECK-NEXT: [[PROL_ITER:%.*]] = phi i64 [ 0, [[HEADER_PROL_PREHEADER]] ], [ [[PROL_ITER_NEXT:%.*]], [[LATCH_PROL]] ] 262; CHECK-NEXT: br label [[EXITING_PROL:%.*]] 263; CHECK: exiting.prol: 264; CHECK-NEXT: switch i16 [[C3:%.*]], label [[DEFAULT_LOOPEXIT_LOOPEXIT1:%.*]] [ 265; CHECK-NEXT: i16 45, label [[OTHEREXIT_LOOPEXIT2:%.*]] 266; CHECK-NEXT: i16 95, label [[LATCH_PROL]] 267; CHECK-NEXT: ] 268; CHECK: latch.prol: 269; CHECK-NEXT: [[INDVARS_IV_NEXT_PROL]] = add nuw nsw i64 [[INDVARS_IV_PROL]], 1 270; CHECK-NEXT: [[C2_PROL:%.*]] = icmp ult i64 [[INDVARS_IV_NEXT_PROL]], [[C1]] 271; CHECK-NEXT: [[PROL_ITER_NEXT]] = add i64 [[PROL_ITER]], 1 272; CHECK-NEXT: [[PROL_ITER_CMP:%.*]] = icmp ne i64 [[PROL_ITER_NEXT]], [[XTRAITER]] 273; CHECK-NEXT: br i1 [[PROL_ITER_CMP]], label [[HEADER_PROL]], label [[HEADER_PROL_LOOPEXIT_UNR_LCSSA:%.*]], !llvm.loop [[LOOP4:![0-9]+]] 274; CHECK: header.prol.loopexit.unr-lcssa: 275; CHECK-NEXT: [[INDVARS_IV_UNR_PH:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_PROL]], [[LATCH_PROL]] ] 276; CHECK-NEXT: br label [[HEADER_PROL_LOOPEXIT]] 277; CHECK: header.prol.loopexit: 278; CHECK-NEXT: [[INDVARS_IV_UNR:%.*]] = phi i64 [ 0, [[PREHEADER:%.*]] ], [ [[INDVARS_IV_UNR_PH]], [[HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ] 279; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 3 280; CHECK-NEXT: br i1 [[TMP1]], label [[LATCHEXIT:%.*]], label [[PREHEADER_NEW:%.*]] 281; CHECK: preheader.new: 282; CHECK-NEXT: br label [[HEADER:%.*]] 283; CHECK: header: 284; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_UNR]], [[PREHEADER_NEW]] ], [ [[INDVARS_IV_NEXT_3:%.*]], [[LATCH_3:%.*]] ] 285; CHECK-NEXT: br label [[EXITING:%.*]] 286; CHECK: exiting: 287; CHECK-NEXT: switch i16 [[C3]], label [[DEFAULT_LOOPEXIT_LOOPEXIT:%.*]] [ 288; CHECK-NEXT: i16 45, label [[OTHEREXIT_LOOPEXIT:%.*]] 289; CHECK-NEXT: i16 95, label [[LATCH:%.*]] 290; CHECK-NEXT: ] 291; CHECK: latch: 292; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 1 293; CHECK-NEXT: br label [[EXITING_1:%.*]] 294; CHECK: exiting.1: 295; CHECK-NEXT: switch i16 [[C3]], label [[DEFAULT_LOOPEXIT_LOOPEXIT]] [ 296; CHECK-NEXT: i16 45, label [[OTHEREXIT_LOOPEXIT]] 297; CHECK-NEXT: i16 95, label [[LATCH_1:%.*]] 298; CHECK-NEXT: ] 299; CHECK: latch.1: 300; CHECK-NEXT: [[INDVARS_IV_NEXT_1:%.*]] = add nuw nsw i64 [[INDVARS_IV_NEXT]], 1 301; CHECK-NEXT: br label [[EXITING_2:%.*]] 302; CHECK: exiting.2: 303; CHECK-NEXT: switch i16 [[C3]], label [[DEFAULT_LOOPEXIT_LOOPEXIT]] [ 304; CHECK-NEXT: i16 45, label [[OTHEREXIT_LOOPEXIT]] 305; CHECK-NEXT: i16 95, label [[LATCH_2:%.*]] 306; CHECK-NEXT: ] 307; CHECK: latch.2: 308; CHECK-NEXT: [[INDVARS_IV_NEXT_2:%.*]] = add nuw nsw i64 [[INDVARS_IV_NEXT_1]], 1 309; CHECK-NEXT: br label [[EXITING_3:%.*]] 310; CHECK: exiting.3: 311; CHECK-NEXT: switch i16 [[C3]], label [[DEFAULT_LOOPEXIT_LOOPEXIT]] [ 312; CHECK-NEXT: i16 45, label [[OTHEREXIT_LOOPEXIT]] 313; CHECK-NEXT: i16 95, label [[LATCH_3]] 314; CHECK-NEXT: ] 315; CHECK: latch.3: 316; CHECK-NEXT: [[INDVARS_IV_NEXT_3]] = add nuw nsw i64 [[INDVARS_IV_NEXT_2]], 1 317; CHECK-NEXT: [[C2_3:%.*]] = icmp ult i64 [[INDVARS_IV_NEXT_3]], [[C1]] 318; CHECK-NEXT: br i1 [[C2_3]], label [[HEADER]], label [[LATCHEXIT_UNR_LCSSA:%.*]], !llvm.loop [[LOOP5:![0-9]+]] 319; CHECK: latchexit.unr-lcssa: 320; CHECK-NEXT: br label [[LATCHEXIT]] 321; CHECK: latchexit: 322; CHECK-NEXT: ret void 323; CHECK: default.loopexit.loopexit: 324; CHECK-NEXT: br label [[DEFAULT_LOOPEXIT:%.*]] 325; CHECK: default.loopexit.loopexit1: 326; CHECK-NEXT: br label [[DEFAULT_LOOPEXIT]] 327; CHECK: default.loopexit: 328; CHECK-NEXT: br label [[DEFAULT:%.*]] 329; CHECK: default: 330; CHECK-NEXT: ret void 331; CHECK: otherexit.loopexit: 332; CHECK-NEXT: br label [[OTHEREXIT:%.*]] 333; CHECK: otherexit.loopexit2: 334; CHECK-NEXT: br label [[OTHEREXIT]] 335; CHECK: otherexit: 336; CHECK-NEXT: br label [[DEFAULT]] 337; 338preheader: 339 %c1 = zext i32 undef to i64 340 br label %header 341 342header: ; preds = %latch, %preheader 343 %indvars.iv = phi i64 [ 0, %preheader ], [ %indvars.iv.next, %latch ] 344 br label %exiting 345 346exiting: ; preds = %header 347 switch i16 %c3, label %default [ 348 i16 45, label %otherexit 349 i16 95, label %latch 350 ] 351 352latch: ; preds = %exiting 353 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 354 %c2 = icmp ult i64 %indvars.iv.next, %c1 355 br i1 %c2, label %header, label %latchexit 356 357latchexit: ; preds = %latch 358 ret void 359 360default: ; preds = %otherexit, %exiting 361 ret void 362 363otherexit: ; preds = %exiting 364 br label %default 365} 366 367; exit block (%exitB) has an exiting block and another exit block as predecessors. 368; exiting block comes from inner loop. 369define void @test5(i1 %c) { 370; CHECK-LABEL: @test5( 371; CHECK-NEXT: bb: 372; CHECK-NEXT: [[TMP:%.*]] = icmp sgt i32 undef, 79 373; CHECK-NEXT: br i1 [[TMP]], label [[OUTERLATCHEXIT:%.*]], label [[BB1:%.*]] 374; CHECK: bb1: 375; CHECK-NEXT: br i1 false, label [[OUTERH_PROL_PREHEADER:%.*]], label [[OUTERH_PROL_LOOPEXIT:%.*]] 376; CHECK: outerH.prol.preheader: 377; CHECK-NEXT: br label [[OUTERH_PROL:%.*]] 378; CHECK: outerH.prol: 379; CHECK-NEXT: [[TMP4_PROL:%.*]] = phi i32 [ [[TMP6_PROL:%.*]], [[OUTERLATCH_PROL:%.*]] ], [ undef, [[OUTERH_PROL_PREHEADER]] ] 380; CHECK-NEXT: [[PROL_ITER:%.*]] = phi i32 [ 0, [[OUTERH_PROL_PREHEADER]] ], [ [[PROL_ITER_NEXT:%.*]], [[OUTERLATCH_PROL]] ] 381; CHECK-NEXT: br label [[INNERH_PROL:%.*]] 382; CHECK: innerH.prol: 383; CHECK-NEXT: br i1 [[C:%.*]], label [[INNEREXITING_PROL:%.*]], label [[OTHEREXITB_LOOPEXIT1:%.*]] 384; CHECK: innerexiting.prol: 385; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_PROL:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT2:%.*]] 386; CHECK: innerLatch.prol: 387; CHECK-NEXT: br i1 false, label [[INNERH_1_PROL:%.*]], label [[OUTERLATCH_PROL]] 388; CHECK: innerH.1.prol: 389; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_1_PROL:%.*]], label [[OTHEREXITB_LOOPEXIT1]] 390; CHECK: innerexiting.1.prol: 391; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_1_PROL:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT2]] 392; CHECK: innerLatch.1.prol: 393; CHECK-NEXT: br i1 false, label [[INNERH_2_PROL:%.*]], label [[OUTERLATCH_PROL]] 394; CHECK: innerH.2.prol: 395; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_2_PROL:%.*]], label [[OTHEREXITB_LOOPEXIT1]] 396; CHECK: innerexiting.2.prol: 397; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_2_PROL:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT2]] 398; CHECK: innerLatch.2.prol: 399; CHECK-NEXT: br i1 false, label [[INNERH_3_PROL:%.*]], label [[OUTERLATCH_PROL]] 400; CHECK: innerH.3.prol: 401; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_3_PROL:%.*]], label [[OTHEREXITB_LOOPEXIT1]] 402; CHECK: innerexiting.3.prol: 403; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_3_PROL:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT2]] 404; CHECK: innerLatch.3.prol: 405; CHECK-NEXT: br i1 false, label [[INNERH_PROL]], label [[OUTERLATCH_PROL]], !llvm.loop [[LOOP6:![0-9]+]] 406; CHECK: outerLatch.prol: 407; CHECK-NEXT: [[TMP6_PROL]] = add i32 [[TMP4_PROL]], 1 408; CHECK-NEXT: [[TMP7_PROL:%.*]] = icmp sgt i32 [[TMP6_PROL]], 79 409; CHECK-NEXT: [[PROL_ITER_NEXT]] = add i32 [[PROL_ITER]], 1 410; CHECK-NEXT: [[PROL_ITER_CMP:%.*]] = icmp ne i32 [[PROL_ITER_NEXT]], 0 411; CHECK-NEXT: br i1 [[PROL_ITER_CMP]], label [[OUTERH_PROL]], label [[OUTERH_PROL_LOOPEXIT_UNR_LCSSA:%.*]], !llvm.loop [[LOOP7:![0-9]+]] 412; CHECK: outerH.prol.loopexit.unr-lcssa: 413; CHECK-NEXT: [[TMP4_UNR_PH:%.*]] = phi i32 [ [[TMP6_PROL]], [[OUTERLATCH_PROL]] ] 414; CHECK-NEXT: br label [[OUTERH_PROL_LOOPEXIT]] 415; CHECK: outerH.prol.loopexit: 416; CHECK-NEXT: [[TMP4_UNR:%.*]] = phi i32 [ undef, [[BB1]] ], [ [[TMP4_UNR_PH]], [[OUTERH_PROL_LOOPEXIT_UNR_LCSSA]] ] 417; CHECK-NEXT: br i1 false, label [[OUTERLATCHEXIT_LOOPEXIT:%.*]], label [[BB1_NEW:%.*]] 418; CHECK: bb1.new: 419; CHECK-NEXT: br label [[OUTERH:%.*]] 420; CHECK: outerH: 421; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[TMP4_UNR]], [[BB1_NEW]] ], [ [[TMP6_3:%.*]], [[OUTERLATCH_3:%.*]] ] 422; CHECK-NEXT: br label [[INNERH:%.*]] 423; CHECK: innerH: 424; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT:%.*]] 425; CHECK: innerexiting: 426; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT:%.*]] 427; CHECK: innerLatch: 428; CHECK-NEXT: br i1 false, label [[INNERH_1:%.*]], label [[OUTERLATCH:%.*]] 429; CHECK: innerH.1: 430; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_1:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT]] 431; CHECK: innerexiting.1: 432; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_1:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT]] 433; CHECK: innerLatch.1: 434; CHECK-NEXT: br i1 false, label [[INNERH_2:%.*]], label [[OUTERLATCH]] 435; CHECK: innerH.2: 436; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_2:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT]] 437; CHECK: innerexiting.2: 438; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_2:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT]] 439; CHECK: innerLatch.2: 440; CHECK-NEXT: br i1 false, label [[INNERH_3:%.*]], label [[OUTERLATCH]] 441; CHECK: innerH.3: 442; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_3:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT]] 443; CHECK: innerexiting.3: 444; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_3:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT]] 445; CHECK: innerLatch.3: 446; CHECK-NEXT: br i1 false, label [[INNERH]], label [[OUTERLATCH]], !llvm.loop [[LOOP6]] 447; CHECK: outerLatch: 448; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP4]], 1 449; CHECK-NEXT: br label [[INNERH_13:%.*]] 450; CHECK: innerH.13: 451; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_14:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT12:%.*]] 452; CHECK: innerexiting.14: 453; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_15:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT13:%.*]] 454; CHECK: innerLatch.15: 455; CHECK-NEXT: br i1 false, label [[INNERH_1_1:%.*]], label [[OUTERLATCH_1:%.*]] 456; CHECK: innerH.1.1: 457; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_1_1:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT12]] 458; CHECK: innerexiting.1.1: 459; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_1_1:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT13]] 460; CHECK: innerLatch.1.1: 461; CHECK-NEXT: br i1 false, label [[INNERH_2_1:%.*]], label [[OUTERLATCH_1]] 462; CHECK: innerH.2.1: 463; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_2_1:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT12]] 464; CHECK: innerexiting.2.1: 465; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_2_1:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT13]] 466; CHECK: innerLatch.2.1: 467; CHECK-NEXT: br i1 false, label [[INNERH_3_1:%.*]], label [[OUTERLATCH_1]] 468; CHECK: innerH.3.1: 469; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_3_1:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT12]] 470; CHECK: innerexiting.3.1: 471; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_3_1:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT13]] 472; CHECK: innerLatch.3.1: 473; CHECK-NEXT: br i1 false, label [[INNERH_13]], label [[OUTERLATCH_1]], !llvm.loop [[LOOP6]] 474; CHECK: outerLatch.1: 475; CHECK-NEXT: [[TMP6_1:%.*]] = add i32 [[TMP6]], 1 476; CHECK-NEXT: br label [[INNERH_26:%.*]] 477; CHECK: innerH.26: 478; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_27:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT14:%.*]] 479; CHECK: innerexiting.27: 480; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_28:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT15:%.*]] 481; CHECK: innerLatch.28: 482; CHECK-NEXT: br i1 false, label [[INNERH_1_2:%.*]], label [[OUTERLATCH_2:%.*]] 483; CHECK: innerH.1.2: 484; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_1_2:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT14]] 485; CHECK: innerexiting.1.2: 486; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_1_2:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT15]] 487; CHECK: innerLatch.1.2: 488; CHECK-NEXT: br i1 false, label [[INNERH_2_2:%.*]], label [[OUTERLATCH_2]] 489; CHECK: innerH.2.2: 490; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_2_2:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT14]] 491; CHECK: innerexiting.2.2: 492; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_2_2:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT15]] 493; CHECK: innerLatch.2.2: 494; CHECK-NEXT: br i1 false, label [[INNERH_3_2:%.*]], label [[OUTERLATCH_2]] 495; CHECK: innerH.3.2: 496; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_3_2:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT14]] 497; CHECK: innerexiting.3.2: 498; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_3_2:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT15]] 499; CHECK: innerLatch.3.2: 500; CHECK-NEXT: br i1 false, label [[INNERH_26]], label [[OUTERLATCH_2]], !llvm.loop [[LOOP6]] 501; CHECK: outerLatch.2: 502; CHECK-NEXT: [[TMP6_2:%.*]] = add i32 [[TMP6_1]], 1 503; CHECK-NEXT: br label [[INNERH_39:%.*]] 504; CHECK: innerH.39: 505; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_310:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT16:%.*]] 506; CHECK: innerexiting.310: 507; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_311:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT17:%.*]] 508; CHECK: innerLatch.311: 509; CHECK-NEXT: br i1 false, label [[INNERH_1_3:%.*]], label [[OUTERLATCH_3]] 510; CHECK: innerH.1.3: 511; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_1_3:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT16]] 512; CHECK: innerexiting.1.3: 513; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_1_3:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT17]] 514; CHECK: innerLatch.1.3: 515; CHECK-NEXT: br i1 false, label [[INNERH_2_3:%.*]], label [[OUTERLATCH_3]] 516; CHECK: innerH.2.3: 517; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_2_3:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT16]] 518; CHECK: innerexiting.2.3: 519; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_2_3:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT17]] 520; CHECK: innerLatch.2.3: 521; CHECK-NEXT: br i1 false, label [[INNERH_3_3:%.*]], label [[OUTERLATCH_3]] 522; CHECK: innerH.3.3: 523; CHECK-NEXT: br i1 [[C]], label [[INNEREXITING_3_3:%.*]], label [[OTHEREXITB_LOOPEXIT_LOOPEXIT16]] 524; CHECK: innerexiting.3.3: 525; CHECK-NEXT: br i1 [[C]], label [[INNERLATCH_3_3:%.*]], label [[EXITB_LOOPEXIT_LOOPEXIT_LOOPEXIT17]] 526; CHECK: innerLatch.3.3: 527; CHECK-NEXT: br i1 false, label [[INNERH_39]], label [[OUTERLATCH_3]], !llvm.loop [[LOOP6]] 528; CHECK: outerLatch.3: 529; CHECK-NEXT: [[TMP6_3]] = add i32 [[TMP6_2]], 1 530; CHECK-NEXT: [[TMP7_3:%.*]] = icmp sgt i32 [[TMP6_3]], 79 531; CHECK-NEXT: br i1 [[TMP7_3]], label [[OUTERLATCHEXIT_LOOPEXIT_UNR_LCSSA:%.*]], label [[OUTERH]], !llvm.loop [[LOOP8:![0-9]+]] 532; CHECK: outerLatchExit.loopexit.unr-lcssa: 533; CHECK-NEXT: br label [[OUTERLATCHEXIT_LOOPEXIT]] 534; CHECK: outerLatchExit.loopexit: 535; CHECK-NEXT: br label [[OUTERLATCHEXIT]] 536; CHECK: outerLatchExit: 537; CHECK-NEXT: ret void 538; CHECK: exitB.loopexit.loopexit.loopexit: 539; CHECK-NEXT: br label [[EXITB_LOOPEXIT_LOOPEXIT:%.*]] 540; CHECK: exitB.loopexit.loopexit.loopexit13: 541; CHECK-NEXT: br label [[EXITB_LOOPEXIT_LOOPEXIT]] 542; CHECK: exitB.loopexit.loopexit.loopexit15: 543; CHECK-NEXT: br label [[EXITB_LOOPEXIT_LOOPEXIT]] 544; CHECK: exitB.loopexit.loopexit.loopexit17: 545; CHECK-NEXT: br label [[EXITB_LOOPEXIT_LOOPEXIT]] 546; CHECK: exitB.loopexit.loopexit: 547; CHECK-NEXT: br label [[EXITB_LOOPEXIT:%.*]] 548; CHECK: exitB.loopexit.loopexit2: 549; CHECK-NEXT: br label [[EXITB_LOOPEXIT]] 550; CHECK: exitB.loopexit: 551; CHECK-NEXT: br label [[EXITB:%.*]] 552; CHECK: exitB: 553; CHECK-NEXT: ret void 554; CHECK: otherexitB.loopexit.loopexit: 555; CHECK-NEXT: br label [[OTHEREXITB_LOOPEXIT:%.*]] 556; CHECK: otherexitB.loopexit.loopexit12: 557; CHECK-NEXT: br label [[OTHEREXITB_LOOPEXIT]] 558; CHECK: otherexitB.loopexit.loopexit14: 559; CHECK-NEXT: br label [[OTHEREXITB_LOOPEXIT]] 560; CHECK: otherexitB.loopexit.loopexit16: 561; CHECK-NEXT: br label [[OTHEREXITB_LOOPEXIT]] 562; CHECK: otherexitB.loopexit: 563; CHECK-NEXT: br label [[OTHEREXITB:%.*]] 564; CHECK: otherexitB.loopexit1: 565; CHECK-NEXT: br label [[OTHEREXITB]] 566; CHECK: otherexitB: 567; CHECK-NEXT: br label [[EXITB]] 568; 569bb: 570 %tmp = icmp sgt i32 undef, 79 571 br i1 %tmp, label %outerLatchExit, label %bb1 572 573bb1: ; preds = %bb 574 br label %outerH 575 576outerH: ; preds = %outerLatch, %bb1 577 %tmp4 = phi i32 [ %tmp6, %outerLatch ], [ undef, %bb1 ] 578 br label %innerH 579 580innerH: ; preds = %innerLatch, %outerH 581 br i1 %c, label %innerexiting, label %otherexitB 582 583innerexiting: ; preds = %innerH 584 br i1 %c, label %innerLatch, label %exitB 585 586innerLatch: ; preds = %innerexiting 587 %tmp13 = fcmp olt double undef, 2.000000e+00 588 br i1 %tmp13, label %innerH, label %outerLatch 589 590outerLatch: ; preds = %innerLatch 591 %tmp6 = add i32 %tmp4, 1 592 %tmp7 = icmp sgt i32 %tmp6, 79 593 br i1 %tmp7, label %outerLatchExit, label %outerH 594 595outerLatchExit: ; preds = %outerLatch, %bb 596 ret void 597 598exitB: ; preds = %innerexiting, %otherexitB 599 ret void 600 601otherexitB: ; preds = %innerH 602 br label %exitB 603 604} 605 606; Blocks reachable from exits (not_zero44) have the IDom as the block within the loop (Header). 607; Update the IDom to the preheader. 608define void @test6(i1 %c) { 609; CHECK-LABEL: @test6( 610; CHECK-NEXT: entry: 611; CHECK-NEXT: [[SMAX:%.*]] = call i64 @llvm.smax.i64(i64 undef, i64 616) 612; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[SMAX]], -1 613; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[TMP0]], undef 614; CHECK-NEXT: [[TMP2:%.*]] = lshr i64 [[TMP1]], 1 615; CHECK-NEXT: [[TMP3:%.*]] = add nuw i64 [[TMP2]], 1 616; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP3]], 3 617; CHECK-NEXT: [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0 618; CHECK-NEXT: br i1 [[LCMP_MOD]], label [[HEADER_PROL_PREHEADER:%.*]], label [[HEADER_PROL_LOOPEXIT:%.*]] 619; CHECK: header.prol.preheader: 620; CHECK-NEXT: br label [[HEADER_PROL:%.*]] 621; CHECK: header.prol: 622; CHECK-NEXT: [[INDVARS_IV_PROL:%.*]] = phi i64 [ undef, [[HEADER_PROL_PREHEADER]] ], [ [[INDVARS_IV_NEXT_PROL:%.*]], [[LATCH_PROL:%.*]] ] 623; CHECK-NEXT: [[PROL_ITER:%.*]] = phi i64 [ 0, [[HEADER_PROL_PREHEADER]] ], [ [[PROL_ITER_NEXT:%.*]], [[LATCH_PROL]] ] 624; CHECK-NEXT: br i1 [[C:%.*]], label [[LATCH_PROL]], label [[OTHEREXIT_LOOPEXIT1:%.*]] 625; CHECK: latch.prol: 626; CHECK-NEXT: [[INDVARS_IV_NEXT_PROL]] = add nsw i64 [[INDVARS_IV_PROL]], 2 627; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT_PROL]], 616 628; CHECK-NEXT: [[PROL_ITER_NEXT]] = add i64 [[PROL_ITER]], 1 629; CHECK-NEXT: [[PROL_ITER_CMP:%.*]] = icmp ne i64 [[PROL_ITER_NEXT]], [[XTRAITER]] 630; CHECK-NEXT: br i1 [[PROL_ITER_CMP]], label [[HEADER_PROL]], label [[HEADER_PROL_LOOPEXIT_UNR_LCSSA:%.*]], !llvm.loop [[LOOP9:![0-9]+]] 631; CHECK: header.prol.loopexit.unr-lcssa: 632; CHECK-NEXT: [[INDVARS_IV_UNR_PH:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_PROL]], [[LATCH_PROL]] ] 633; CHECK-NEXT: br label [[HEADER_PROL_LOOPEXIT]] 634; CHECK: header.prol.loopexit: 635; CHECK-NEXT: [[INDVARS_IV_UNR:%.*]] = phi i64 [ undef, [[ENTRY:%.*]] ], [ [[INDVARS_IV_UNR_PH]], [[HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ] 636; CHECK-NEXT: [[TMP5:%.*]] = icmp ult i64 [[TMP2]], 3 637; CHECK-NEXT: br i1 [[TMP5]], label [[LATCHEXIT:%.*]], label [[ENTRY_NEW:%.*]] 638; CHECK: entry.new: 639; CHECK-NEXT: br label [[HEADER:%.*]] 640; CHECK: header: 641; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_UNR]], [[ENTRY_NEW]] ], [ [[INDVARS_IV_NEXT_3:%.*]], [[LATCH_3:%.*]] ] 642; CHECK-NEXT: br i1 [[C]], label [[LATCH:%.*]], label [[OTHEREXIT_LOOPEXIT:%.*]] 643; CHECK: latch: 644; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add nsw i64 [[INDVARS_IV]], 2 645; CHECK-NEXT: br i1 [[C]], label [[LATCH_1:%.*]], label [[OTHEREXIT_LOOPEXIT]] 646; CHECK: latch.1: 647; CHECK-NEXT: [[INDVARS_IV_NEXT_1:%.*]] = add nsw i64 [[INDVARS_IV_NEXT]], 2 648; CHECK-NEXT: br i1 [[C]], label [[LATCH_2:%.*]], label [[OTHEREXIT_LOOPEXIT]] 649; CHECK: latch.2: 650; CHECK-NEXT: [[INDVARS_IV_NEXT_2:%.*]] = add nsw i64 [[INDVARS_IV_NEXT_1]], 2 651; CHECK-NEXT: br i1 [[C]], label [[LATCH_3]], label [[OTHEREXIT_LOOPEXIT]] 652; CHECK: latch.3: 653; CHECK-NEXT: [[INDVARS_IV_NEXT_3]] = add nsw i64 [[INDVARS_IV_NEXT_2]], 2 654; CHECK-NEXT: [[TMP6:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT_3]], 616 655; CHECK-NEXT: br i1 [[TMP6]], label [[HEADER]], label [[LATCHEXIT_UNR_LCSSA:%.*]], !llvm.loop [[LOOP10:![0-9]+]] 656; CHECK: latchexit.unr-lcssa: 657; CHECK-NEXT: br label [[LATCHEXIT]] 658; CHECK: latchexit: 659; CHECK-NEXT: br label [[LATCHEXITSUCC:%.*]] 660; CHECK: otherexit.loopexit: 661; CHECK-NEXT: br label [[OTHEREXIT:%.*]] 662; CHECK: otherexit.loopexit1: 663; CHECK-NEXT: br label [[OTHEREXIT]] 664; CHECK: otherexit: 665; CHECK-NEXT: br label [[OTHEREXITSUCC:%.*]] 666; CHECK: otherexitsucc: 667; CHECK-NEXT: br label [[NOT_ZERO44:%.*]] 668; CHECK: not_zero44: 669; CHECK-NEXT: unreachable 670; CHECK: latchexitsucc: 671; CHECK-NEXT: br label [[NOT_ZERO44]] 672; 673entry: 674 br label %header 675 676header: ; preds = %latch, %entry 677 %indvars.iv = phi i64 [ undef, %entry ], [ %indvars.iv.next, %latch ] 678 br i1 %c, label %latch, label %otherexit 679 680latch: ; preds = %header 681 %indvars.iv.next = add nsw i64 %indvars.iv, 2 682 %0 = icmp slt i64 %indvars.iv.next, 616 683 br i1 %0, label %header, label %latchexit 684 685latchexit: ; preds = %latch 686 br label %latchexitsucc 687 688otherexit: ; preds = %header 689 br label %otherexitsucc 690 691otherexitsucc: ; preds = %otherexit 692 br label %not_zero44 693 694not_zero44: ; preds = %latchexitsucc, %otherexitsucc 695 unreachable 696 697latchexitsucc: ; preds = %latchexit 698 br label %not_zero44 699} 700 701