brintos

brintos / llvm-project-archived public Read only

0
0
Text · 62.0 KiB · 65ef3e4 Raw
1066 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -unroll-runtime-other-exit-predictable=false -passes=loop-unroll,instcombine -unroll-runtime=true -verify-dom-info -verify-loop-info -S | FileCheck %s3; RUN: opt < %s -unroll-runtime-other-exit-predictable=false -passes=loop-unroll -unroll-runtime=true -verify-dom-info -unroll-runtime-multi-exit=false -verify-loop-info -S | FileCheck %s -check-prefix=NOUNROLL4; RUN: opt < %s -unroll-runtime-other-exit-predictable=false -passes=loop-unroll -unroll-runtime=true -verify-dom-info -unroll-runtime-multi-exit=true -verify-loop-info -S | FileCheck %s -check-prefix=ENABLED5 6; The purpose of these tests is to exercise the heuristics which decide whether7; to unroll multiple exit loops - specifically, the multiple exit reasoning.8; Currently, we have heuristics both at the pass level, and controlled by a9; flag in the implementation, so we need to test all three states of the flag10; to cover all the logic completely.  Note that the unroll factor is not11; manually specified in these tests - see runtime-loop-multiple-exits.ll for12; functional tests with forced unroll factors.13 14; the second exit block is a deopt block. The loop has one exiting block other than the latch.15define i32 @test1(ptr nocapture %a, i64 %n) {16; CHECK-LABEL: @test1(17; CHECK-NEXT:  entry:18; CHECK-NEXT:    [[TMP0:%.*]] = freeze i64 [[N:%.*]]19; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[TMP0]], -120; CHECK-NEXT:    [[XTRAITER:%.*]] = and i64 [[TMP0]], 721; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 722; CHECK-NEXT:    br i1 [[TMP2]], label [[HEADER_EPIL_PREHEADER:%.*]], label [[ENTRY_NEW:%.*]]23; CHECK:       entry.new:24; CHECK-NEXT:    [[UNROLL_ITER:%.*]] = and i64 [[TMP0]], -825; CHECK-NEXT:    br label [[HEADER:%.*]]26; CHECK:       header:27; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[INDVARS_IV_NEXT_7:%.*]], [[LATCH_7:%.*]] ]28; CHECK-NEXT:    [[SUM_02:%.*]] = phi i32 [ 0, [[ENTRY_NEW]] ], [ [[ADD_7:%.*]], [[LATCH_7]] ]29; CHECK-NEXT:    [[NITER:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[NITER_NEXT_7:%.*]], [[LATCH_7]] ]30; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]31; CHECK:       for.exiting_block:32; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[TMP0]], 4233; CHECK-NEXT:    br i1 [[CMP]], label [[OTHEREXIT_LOOPEXIT:%.*]], label [[LATCH:%.*]]34; CHECK:       latch:35; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]36; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ARRAYIDX]], align 437; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], [[SUM_02]]38; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_1:%.*]]39; CHECK:       for.exiting_block.1:40; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_1:%.*]]41; CHECK:       latch.1:42; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]43; CHECK-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr i8, ptr [[TMP13]], i64 444; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX_1]], align 445; CHECK-NEXT:    [[ADD_1:%.*]] = add nsw i32 [[TMP4]], [[ADD]]46; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_2:%.*]]47; CHECK:       for.exiting_block.2:48; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_2:%.*]]49; CHECK:       latch.2:50; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]51; CHECK-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr i8, ptr [[TMP15]], i64 852; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX_2]], align 453; CHECK-NEXT:    [[ADD_2:%.*]] = add nsw i32 [[TMP5]], [[ADD_1]]54; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_3:%.*]]55; CHECK:       for.exiting_block.3:56; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_3:%.*]]57; CHECK:       latch.3:58; CHECK-NEXT:    [[TMP17:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]59; CHECK-NEXT:    [[ARRAYIDX_3:%.*]] = getelementptr i8, ptr [[TMP17]], i64 1260; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX_3]], align 461; CHECK-NEXT:    [[ADD_3:%.*]] = add nsw i32 [[TMP6]], [[ADD_2]]62; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_4:%.*]]63; CHECK:       for.exiting_block.4:64; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_4:%.*]]65; CHECK:       latch.4:66; CHECK-NEXT:    [[TMP18:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]67; CHECK-NEXT:    [[ARRAYIDX_4:%.*]] = getelementptr i8, ptr [[TMP18]], i64 1668; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX_4]], align 469; CHECK-NEXT:    [[ADD_4:%.*]] = add nsw i32 [[TMP7]], [[ADD_3]]70; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_5:%.*]]71; CHECK:       for.exiting_block.5:72; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_5:%.*]]73; CHECK:       latch.5:74; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]75; CHECK-NEXT:    [[ARRAYIDX_5:%.*]] = getelementptr i8, ptr [[TMP12]], i64 2076; CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr [[ARRAYIDX_5]], align 477; CHECK-NEXT:    [[ADD_5:%.*]] = add nsw i32 [[TMP8]], [[ADD_4]]78; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_6:%.*]]79; CHECK:       for.exiting_block.6:80; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_6:%.*]]81; CHECK:       latch.6:82; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]83; CHECK-NEXT:    [[ARRAYIDX_6:%.*]] = getelementptr i8, ptr [[TMP14]], i64 2484; CHECK-NEXT:    [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX_6]], align 485; CHECK-NEXT:    [[ADD_6:%.*]] = add nsw i32 [[TMP9]], [[ADD_5]]86; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_7:%.*]]87; CHECK:       for.exiting_block.7:88; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_7]]89; CHECK:       latch.7:90; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]91; CHECK-NEXT:    [[ARRAYIDX_7:%.*]] = getelementptr i8, ptr [[TMP16]], i64 2892; CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr [[ARRAYIDX_7]], align 493; CHECK-NEXT:    [[ADD_7]] = add nsw i32 [[TMP10]], [[ADD_6]]94; CHECK-NEXT:    [[INDVARS_IV_NEXT_7]] = add i64 [[INDVARS_IV]], 895; CHECK-NEXT:    [[NITER_NEXT_7]] = add i64 [[NITER]], 896; CHECK-NEXT:    [[NITER_NCMP_7:%.*]] = icmp eq i64 [[NITER_NEXT_7]], [[UNROLL_ITER]]97; CHECK-NEXT:    br i1 [[NITER_NCMP_7]], label [[LATCHEXIT_UNR_LCSSA:%.*]], label [[HEADER]]98; CHECK:       latchexit.unr-lcssa:99; CHECK-NEXT:    [[LCMP_MOD_NOT:%.*]] = icmp eq i64 [[XTRAITER]], 0100; CHECK-NEXT:    br i1 [[LCMP_MOD_NOT]], label [[LATCHEXIT:%.*]], label [[HEADER_EPIL_PREHEADER]]101; CHECK:       header.epil.preheader:102; CHECK-NEXT:    [[INDVARS_IV_EPIL_INIT:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT_7]], [[LATCHEXIT_UNR_LCSSA]] ]103; CHECK-NEXT:    [[SUM_02_EPIL_INIT:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD_7]], [[LATCHEXIT_UNR_LCSSA]] ]104; CHECK-NEXT:    [[LCMP_MOD3:%.*]] = icmp ne i64 [[XTRAITER]], 0105; CHECK-NEXT:    call void @llvm.assume(i1 [[LCMP_MOD3]])106; CHECK-NEXT:    br label [[HEADER_EPIL:%.*]]107; CHECK:       header.epil:108; CHECK-NEXT:    [[INDVARS_IV_EPIL:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_EPIL:%.*]], [[LATCH_EPIL:%.*]] ], [ [[INDVARS_IV_EPIL_INIT]], [[HEADER_EPIL_PREHEADER]] ]109; CHECK-NEXT:    [[SUM_02_EPIL:%.*]] = phi i32 [ [[ADD_EPIL:%.*]], [[LATCH_EPIL]] ], [ [[SUM_02_EPIL_INIT]], [[HEADER_EPIL_PREHEADER]] ]110; CHECK-NEXT:    [[EPIL_ITER:%.*]] = phi i64 [ [[EPIL_ITER_NEXT:%.*]], [[LATCH_EPIL]] ], [ 0, [[HEADER_EPIL_PREHEADER]] ]111; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_EPIL:%.*]]112; CHECK:       for.exiting_block.epil:113; CHECK-NEXT:    [[CMP_EPIL:%.*]] = icmp eq i64 [[TMP0]], 42114; CHECK-NEXT:    br i1 [[CMP_EPIL]], label [[OTHEREXIT_LOOPEXIT3:%.*]], label [[LATCH_EPIL]]115; CHECK:       latch.epil:116; CHECK-NEXT:    [[ARRAYIDX_EPIL:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_EPIL]]117; CHECK-NEXT:    [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX_EPIL]], align 4118; CHECK-NEXT:    [[ADD_EPIL]] = add nsw i32 [[TMP11]], [[SUM_02_EPIL]]119; CHECK-NEXT:    [[INDVARS_IV_NEXT_EPIL]] = add i64 [[INDVARS_IV_EPIL]], 1120; CHECK-NEXT:    [[EPIL_ITER_NEXT]] = add i64 [[EPIL_ITER]], 1121; CHECK-NEXT:    [[EPIL_ITER_CMP_NOT:%.*]] = icmp eq i64 [[EPIL_ITER_NEXT]], [[XTRAITER]]122; CHECK-NEXT:    br i1 [[EPIL_ITER_CMP_NOT]], label [[LATCHEXIT_EPILOG_LCSSA:%.*]], label [[HEADER_EPIL]], !llvm.loop [[LOOP0:![0-9]+]]123; CHECK:       latchexit.epilog-lcssa:124; CHECK-NEXT:    br label [[LATCHEXIT]]125; CHECK:       latchexit:126; CHECK-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[ADD_7]], [[LATCHEXIT_UNR_LCSSA]] ], [ [[ADD_EPIL]], [[LATCHEXIT_EPILOG_LCSSA]] ]127; CHECK-NEXT:    ret i32 [[SUM_0_LCSSA]]128; CHECK:       otherexit.loopexit:129; CHECK-NEXT:    br label [[OTHEREXIT:%.*]]130; CHECK:       otherexit.loopexit4:131; CHECK-NEXT:    br label [[OTHEREXIT]]132; CHECK:       otherexit:133; CHECK-NEXT:    [[SUM_02_LCSSA:%.*]] = phi i32 [ [[SUM_02]], [[OTHEREXIT_LOOPEXIT]] ], [ [[SUM_02_EPIL]], [[OTHEREXIT_LOOPEXIT3]] ]134; CHECK-NEXT:    [[RVAL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 [[SUM_02_LCSSA]]) ]135; CHECK-NEXT:    ret i32 [[RVAL]]136;137; NOUNROLL-LABEL: @test1(138; NOUNROLL-NEXT:  entry:139; NOUNROLL-NEXT:    br label [[HEADER:%.*]]140; NOUNROLL:       header:141; NOUNROLL-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]142; NOUNROLL-NEXT:    [[SUM_02:%.*]] = phi i32 [ [[ADD:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]143; NOUNROLL-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]144; NOUNROLL:       for.exiting_block:145; NOUNROLL-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N:%.*]], 42146; NOUNROLL-NEXT:    br i1 [[CMP]], label [[OTHEREXIT:%.*]], label [[LATCH]]147; NOUNROLL:       latch:148; NOUNROLL-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]149; NOUNROLL-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4150; NOUNROLL-NEXT:    [[ADD]] = add nsw i32 [[TMP0]], [[SUM_02]]151; NOUNROLL-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1152; NOUNROLL-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]153; NOUNROLL-NEXT:    br i1 [[EXITCOND]], label [[LATCHEXIT:%.*]], label [[HEADER]]154; NOUNROLL:       latchexit:155; NOUNROLL-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[ADD]], [[LATCH]] ]156; NOUNROLL-NEXT:    ret i32 [[SUM_0_LCSSA]]157; NOUNROLL:       otherexit:158; NOUNROLL-NEXT:    [[SUM_02_LCSSA:%.*]] = phi i32 [ [[SUM_02]], [[FOR_EXITING_BLOCK]] ]159; NOUNROLL-NEXT:    [[RVAL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 [[SUM_02_LCSSA]]) ]160; NOUNROLL-NEXT:    ret i32 [[RVAL]]161;162; ENABLED-LABEL: @test1(163; ENABLED-NEXT:  entry:164; ENABLED-NEXT:    [[TMP0:%.*]] = freeze i64 [[N:%.*]]165; ENABLED-NEXT:    [[TMP1:%.*]] = add i64 [[TMP0]], -1166; ENABLED-NEXT:    [[XTRAITER:%.*]] = and i64 [[TMP0]], 7167; ENABLED-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 7168; ENABLED-NEXT:    br i1 [[TMP2]], label [[HEADER_EPIL_PREHEADER:%.*]], label [[ENTRY_NEW:%.*]]169; ENABLED:       entry.new:170; ENABLED-NEXT:    [[UNROLL_ITER:%.*]] = sub i64 [[TMP0]], [[XTRAITER]]171; ENABLED-NEXT:    br label [[HEADER:%.*]]172; ENABLED:       header:173; ENABLED-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[INDVARS_IV_NEXT_7:%.*]], [[LATCH_7:%.*]] ]174; ENABLED-NEXT:    [[SUM_02:%.*]] = phi i32 [ 0, [[ENTRY_NEW]] ], [ [[ADD_7:%.*]], [[LATCH_7]] ]175; ENABLED-NEXT:    [[NITER:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[NITER_NEXT_7:%.*]], [[LATCH_7]] ]176; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]177; ENABLED:       for.exiting_block:178; ENABLED-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N]], 42179; ENABLED-NEXT:    br i1 [[CMP]], label [[OTHEREXIT_LOOPEXIT:%.*]], label [[LATCH:%.*]]180; ENABLED:       latch:181; ENABLED-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]182; ENABLED-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ARRAYIDX]], align 4183; ENABLED-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], [[SUM_02]]184; ENABLED-NEXT:    [[INDVARS_IV_NEXT:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 1185; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_1:%.*]]186; ENABLED:       for.exiting_block.1:187; ENABLED-NEXT:    [[CMP_1:%.*]] = icmp eq i64 [[N]], 42188; ENABLED-NEXT:    br i1 [[CMP_1]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_1:%.*]]189; ENABLED:       latch.1:190; ENABLED-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT]]191; ENABLED-NEXT:    [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX_1]], align 4192; ENABLED-NEXT:    [[ADD_1:%.*]] = add nsw i32 [[TMP4]], [[ADD]]193; ENABLED-NEXT:    [[INDVARS_IV_NEXT_1:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 2194; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_2:%.*]]195; ENABLED:       for.exiting_block.2:196; ENABLED-NEXT:    [[CMP_2:%.*]] = icmp eq i64 [[N]], 42197; ENABLED-NEXT:    br i1 [[CMP_2]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_2:%.*]]198; ENABLED:       latch.2:199; ENABLED-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_1]]200; ENABLED-NEXT:    [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX_2]], align 4201; ENABLED-NEXT:    [[ADD_2:%.*]] = add nsw i32 [[TMP5]], [[ADD_1]]202; ENABLED-NEXT:    [[INDVARS_IV_NEXT_2:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 3203; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_3:%.*]]204; ENABLED:       for.exiting_block.3:205; ENABLED-NEXT:    [[CMP_3:%.*]] = icmp eq i64 [[N]], 42206; ENABLED-NEXT:    br i1 [[CMP_3]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_3:%.*]]207; ENABLED:       latch.3:208; ENABLED-NEXT:    [[ARRAYIDX_3:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_2]]209; ENABLED-NEXT:    [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX_3]], align 4210; ENABLED-NEXT:    [[ADD_3:%.*]] = add nsw i32 [[TMP6]], [[ADD_2]]211; ENABLED-NEXT:    [[INDVARS_IV_NEXT_3:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 4212; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_4:%.*]]213; ENABLED:       for.exiting_block.4:214; ENABLED-NEXT:    [[CMP_4:%.*]] = icmp eq i64 [[N]], 42215; ENABLED-NEXT:    br i1 [[CMP_4]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_4:%.*]]216; ENABLED:       latch.4:217; ENABLED-NEXT:    [[ARRAYIDX_4:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_3]]218; ENABLED-NEXT:    [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX_4]], align 4219; ENABLED-NEXT:    [[ADD_4:%.*]] = add nsw i32 [[TMP7]], [[ADD_3]]220; ENABLED-NEXT:    [[INDVARS_IV_NEXT_4:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 5221; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_5:%.*]]222; ENABLED:       for.exiting_block.5:223; ENABLED-NEXT:    [[CMP_5:%.*]] = icmp eq i64 [[N]], 42224; ENABLED-NEXT:    br i1 [[CMP_5]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_5:%.*]]225; ENABLED:       latch.5:226; ENABLED-NEXT:    [[ARRAYIDX_5:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_4]]227; ENABLED-NEXT:    [[TMP8:%.*]] = load i32, ptr [[ARRAYIDX_5]], align 4228; ENABLED-NEXT:    [[ADD_5:%.*]] = add nsw i32 [[TMP8]], [[ADD_4]]229; ENABLED-NEXT:    [[INDVARS_IV_NEXT_5:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 6230; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_6:%.*]]231; ENABLED:       for.exiting_block.6:232; ENABLED-NEXT:    [[CMP_6:%.*]] = icmp eq i64 [[N]], 42233; ENABLED-NEXT:    br i1 [[CMP_6]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_6:%.*]]234; ENABLED:       latch.6:235; ENABLED-NEXT:    [[ARRAYIDX_6:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_5]]236; ENABLED-NEXT:    [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX_6]], align 4237; ENABLED-NEXT:    [[ADD_6:%.*]] = add nsw i32 [[TMP9]], [[ADD_5]]238; ENABLED-NEXT:    [[INDVARS_IV_NEXT_6:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 7239; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_7:%.*]]240; ENABLED:       for.exiting_block.7:241; ENABLED-NEXT:    [[CMP_7:%.*]] = icmp eq i64 [[N]], 42242; ENABLED-NEXT:    br i1 [[CMP_7]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_7]]243; ENABLED:       latch.7:244; ENABLED-NEXT:    [[ARRAYIDX_7:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_6]]245; ENABLED-NEXT:    [[TMP10:%.*]] = load i32, ptr [[ARRAYIDX_7]], align 4246; ENABLED-NEXT:    [[ADD_7]] = add nsw i32 [[TMP10]], [[ADD_6]]247; ENABLED-NEXT:    [[INDVARS_IV_NEXT_7]] = add i64 [[INDVARS_IV]], 8248; ENABLED-NEXT:    [[NITER_NEXT_7]] = add i64 [[NITER]], 8249; ENABLED-NEXT:    [[NITER_NCMP_7:%.*]] = icmp eq i64 [[NITER_NEXT_7]], [[UNROLL_ITER]]250; ENABLED-NEXT:    br i1 [[NITER_NCMP_7]], label [[LATCHEXIT_UNR_LCSSA:%.*]], label [[HEADER]]251; ENABLED:       latchexit.unr-lcssa:252; ENABLED-NEXT:    [[SUM_0_LCSSA_PH_PH:%.*]] = phi i32 [ [[ADD_7]], [[LATCH_7]] ]253; ENABLED-NEXT:    [[INDVARS_IV_UNR_PH:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_7]], [[LATCH_7]] ]254; ENABLED-NEXT:    [[SUM_02_UNR_PH:%.*]] = phi i32 [ [[ADD_7]], [[LATCH_7]] ]255; ENABLED-NEXT:    [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0256; ENABLED-NEXT:    br i1 [[LCMP_MOD]], label [[HEADER_EPIL_PREHEADER]], label [[LATCHEXIT:%.*]]257; ENABLED:       header.epil.preheader:258; ENABLED-NEXT:    [[INDVARS_IV_EPIL_INIT:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_UNR_PH]], [[LATCHEXIT_UNR_LCSSA]] ]259; ENABLED-NEXT:    [[SUM_02_EPIL_INIT:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[SUM_02_UNR_PH]], [[LATCHEXIT_UNR_LCSSA]] ]260; ENABLED-NEXT:    [[LCMP_MOD3:%.*]] = icmp ne i64 [[XTRAITER]], 0261; ENABLED-NEXT:    call void @llvm.assume(i1 [[LCMP_MOD3]])262; ENABLED-NEXT:    br label [[HEADER_EPIL:%.*]]263; ENABLED:       header.epil:264; ENABLED-NEXT:    [[INDVARS_IV_EPIL:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_EPIL:%.*]], [[LATCH_EPIL:%.*]] ], [ [[INDVARS_IV_EPIL_INIT]], [[HEADER_EPIL_PREHEADER]] ]265; ENABLED-NEXT:    [[SUM_02_EPIL:%.*]] = phi i32 [ [[ADD_EPIL:%.*]], [[LATCH_EPIL]] ], [ [[SUM_02_EPIL_INIT]], [[HEADER_EPIL_PREHEADER]] ]266; ENABLED-NEXT:    [[EPIL_ITER:%.*]] = phi i64 [ 0, [[HEADER_EPIL_PREHEADER]] ], [ [[EPIL_ITER_NEXT:%.*]], [[LATCH_EPIL]] ]267; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_EPIL:%.*]]268; ENABLED:       for.exiting_block.epil:269; ENABLED-NEXT:    [[CMP_EPIL:%.*]] = icmp eq i64 [[N]], 42270; ENABLED-NEXT:    br i1 [[CMP_EPIL]], label [[OTHEREXIT_LOOPEXIT3:%.*]], label [[LATCH_EPIL]]271; ENABLED:       latch.epil:272; ENABLED-NEXT:    [[ARRAYIDX_EPIL:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_EPIL]]273; ENABLED-NEXT:    [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX_EPIL]], align 4274; ENABLED-NEXT:    [[ADD_EPIL]] = add nsw i32 [[TMP11]], [[SUM_02_EPIL]]275; ENABLED-NEXT:    [[INDVARS_IV_NEXT_EPIL]] = add i64 [[INDVARS_IV_EPIL]], 1276; ENABLED-NEXT:    [[EXITCOND_EPIL:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT_EPIL]], [[N]]277; ENABLED-NEXT:    [[EPIL_ITER_NEXT]] = add i64 [[EPIL_ITER]], 1278; ENABLED-NEXT:    [[EPIL_ITER_CMP:%.*]] = icmp ne i64 [[EPIL_ITER_NEXT]], [[XTRAITER]]279; ENABLED-NEXT:    br i1 [[EPIL_ITER_CMP]], label [[HEADER_EPIL]], label [[LATCHEXIT_EPILOG_LCSSA:%.*]], !llvm.loop [[LOOP0:![0-9]+]]280; ENABLED:       latchexit.epilog-lcssa:281; ENABLED-NEXT:    [[SUM_0_LCSSA_PH2:%.*]] = phi i32 [ [[ADD_EPIL]], [[LATCH_EPIL]] ]282; ENABLED-NEXT:    br label [[LATCHEXIT]]283; ENABLED:       latchexit:284; ENABLED-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[SUM_0_LCSSA_PH_PH]], [[LATCHEXIT_UNR_LCSSA]] ], [ [[SUM_0_LCSSA_PH2]], [[LATCHEXIT_EPILOG_LCSSA]] ]285; ENABLED-NEXT:    ret i32 [[SUM_0_LCSSA]]286; ENABLED:       otherexit.loopexit:287; ENABLED-NEXT:    [[SUM_02_LCSSA_PH:%.*]] = phi i32 [ [[SUM_02]], [[FOR_EXITING_BLOCK]] ], [ [[ADD]], [[FOR_EXITING_BLOCK_1]] ], [ [[ADD_1]], [[FOR_EXITING_BLOCK_2]] ], [ [[ADD_2]], [[FOR_EXITING_BLOCK_3]] ], [ [[ADD_3]], [[FOR_EXITING_BLOCK_4]] ], [ [[ADD_4]], [[FOR_EXITING_BLOCK_5]] ], [ [[ADD_5]], [[FOR_EXITING_BLOCK_6]] ], [ [[ADD_6]], [[FOR_EXITING_BLOCK_7]] ]288; ENABLED-NEXT:    br label [[OTHEREXIT:%.*]]289; ENABLED:       otherexit.loopexit4:290; ENABLED-NEXT:    [[SUM_02_LCSSA_PH4:%.*]] = phi i32 [ [[SUM_02_EPIL]], [[FOR_EXITING_BLOCK_EPIL]] ]291; ENABLED-NEXT:    br label [[OTHEREXIT]]292; ENABLED:       otherexit:293; ENABLED-NEXT:    [[SUM_02_LCSSA:%.*]] = phi i32 [ [[SUM_02_LCSSA_PH]], [[OTHEREXIT_LOOPEXIT]] ], [ [[SUM_02_LCSSA_PH4]], [[OTHEREXIT_LOOPEXIT3]] ]294; ENABLED-NEXT:    [[RVAL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 [[SUM_02_LCSSA]]) ]295; ENABLED-NEXT:    ret i32 [[RVAL]]296;297entry:298  br label %header299 300header:301  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]302  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]303  br label %for.exiting_block304 305for.exiting_block:306  %cmp = icmp eq i64 %n, 42307  br i1 %cmp, label %otherexit, label %latch308 309latch:310  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv311  %0 = load i32, ptr %arrayidx, align 4312  %add = add nsw i32 %0, %sum.02313  %indvars.iv.next = add i64 %indvars.iv, 1314  %exitcond = icmp eq i64 %indvars.iv.next, %n315  br i1 %exitcond, label %latchexit, label %header316 317latchexit:                                          ; preds = %latch318  %sum.0.lcssa = phi i32 [ %add, %latch ]319  ret i32 %sum.0.lcssa320 321otherexit:322  %rval = call i32(...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 %sum.02) ]323  ret i32 %rval324}325 326; the exit block is not a deopt block.327define i32 @test2(ptr nocapture %a, i64 %n) {328;329; CHECK-LABEL: @test2(330; CHECK-NEXT:  entry:331; CHECK-NEXT:    br label [[HEADER:%.*]]332; CHECK:       header:333; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]334; CHECK-NEXT:    [[SUM_02:%.*]] = phi i32 [ [[ADD:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]335; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]336; CHECK:       for.exiting_block:337; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N:%.*]], 42338; CHECK-NEXT:    br i1 [[CMP]], label [[OTHEREXIT:%.*]], label [[LATCH]]339; CHECK:       latch:340; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]341; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4342; CHECK-NEXT:    [[ADD]] = add nsw i32 [[TMP0]], [[SUM_02]]343; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1344; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]345; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LATCHEXIT:%.*]], label [[HEADER]]346; CHECK:       latchexit:347; CHECK-NEXT:    ret i32 [[ADD]]348; CHECK:       otherexit:349; CHECK-NEXT:    ret i32 [[SUM_02]]350;351; NOUNROLL-LABEL: @test2(352; NOUNROLL-NEXT:  entry:353; NOUNROLL-NEXT:    br label [[HEADER:%.*]]354; NOUNROLL:       header:355; NOUNROLL-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]356; NOUNROLL-NEXT:    [[SUM_02:%.*]] = phi i32 [ [[ADD:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]357; NOUNROLL-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]358; NOUNROLL:       for.exiting_block:359; NOUNROLL-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N:%.*]], 42360; NOUNROLL-NEXT:    br i1 [[CMP]], label [[OTHEREXIT:%.*]], label [[LATCH]]361; NOUNROLL:       latch:362; NOUNROLL-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]363; NOUNROLL-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4364; NOUNROLL-NEXT:    [[ADD]] = add nsw i32 [[TMP0]], [[SUM_02]]365; NOUNROLL-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1366; NOUNROLL-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]367; NOUNROLL-NEXT:    br i1 [[EXITCOND]], label [[LATCHEXIT:%.*]], label [[HEADER]]368; NOUNROLL:       latchexit:369; NOUNROLL-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[ADD]], [[LATCH]] ]370; NOUNROLL-NEXT:    ret i32 [[SUM_0_LCSSA]]371; NOUNROLL:       otherexit:372; NOUNROLL-NEXT:    [[RVAL:%.*]] = phi i32 [ [[SUM_02]], [[FOR_EXITING_BLOCK]] ]373; NOUNROLL-NEXT:    ret i32 [[RVAL]]374;375; ENABLED-LABEL: @test2(376; ENABLED-NEXT:  entry:377; ENABLED-NEXT:    [[TMP0:%.*]] = freeze i64 [[N:%.*]]378; ENABLED-NEXT:    [[TMP1:%.*]] = add i64 [[TMP0]], -1379; ENABLED-NEXT:    [[XTRAITER:%.*]] = and i64 [[TMP0]], 7380; ENABLED-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 7381; ENABLED-NEXT:    br i1 [[TMP2]], label [[HEADER_EPIL_PREHEADER:%.*]], label [[ENTRY_NEW:%.*]]382; ENABLED:       entry.new:383; ENABLED-NEXT:    [[UNROLL_ITER:%.*]] = sub i64 [[TMP0]], [[XTRAITER]]384; ENABLED-NEXT:    br label [[HEADER:%.*]]385; ENABLED:       header:386; ENABLED-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[INDVARS_IV_NEXT_7:%.*]], [[LATCH_7:%.*]] ]387; ENABLED-NEXT:    [[SUM_02:%.*]] = phi i32 [ 0, [[ENTRY_NEW]] ], [ [[ADD_7:%.*]], [[LATCH_7]] ]388; ENABLED-NEXT:    [[NITER:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[NITER_NEXT_7:%.*]], [[LATCH_7]] ]389; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]390; ENABLED:       for.exiting_block:391; ENABLED-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N]], 42392; ENABLED-NEXT:    br i1 [[CMP]], label [[OTHEREXIT_LOOPEXIT:%.*]], label [[LATCH:%.*]]393; ENABLED:       latch:394; ENABLED-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]395; ENABLED-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ARRAYIDX]], align 4396; ENABLED-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], [[SUM_02]]397; ENABLED-NEXT:    [[INDVARS_IV_NEXT:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 1398; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_1:%.*]]399; ENABLED:       for.exiting_block.1:400; ENABLED-NEXT:    [[CMP_1:%.*]] = icmp eq i64 [[N]], 42401; ENABLED-NEXT:    br i1 [[CMP_1]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_1:%.*]]402; ENABLED:       latch.1:403; ENABLED-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT]]404; ENABLED-NEXT:    [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX_1]], align 4405; ENABLED-NEXT:    [[ADD_1:%.*]] = add nsw i32 [[TMP4]], [[ADD]]406; ENABLED-NEXT:    [[INDVARS_IV_NEXT_1:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 2407; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_2:%.*]]408; ENABLED:       for.exiting_block.2:409; ENABLED-NEXT:    [[CMP_2:%.*]] = icmp eq i64 [[N]], 42410; ENABLED-NEXT:    br i1 [[CMP_2]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_2:%.*]]411; ENABLED:       latch.2:412; ENABLED-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_1]]413; ENABLED-NEXT:    [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX_2]], align 4414; ENABLED-NEXT:    [[ADD_2:%.*]] = add nsw i32 [[TMP5]], [[ADD_1]]415; ENABLED-NEXT:    [[INDVARS_IV_NEXT_2:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 3416; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_3:%.*]]417; ENABLED:       for.exiting_block.3:418; ENABLED-NEXT:    [[CMP_3:%.*]] = icmp eq i64 [[N]], 42419; ENABLED-NEXT:    br i1 [[CMP_3]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_3:%.*]]420; ENABLED:       latch.3:421; ENABLED-NEXT:    [[ARRAYIDX_3:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_2]]422; ENABLED-NEXT:    [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX_3]], align 4423; ENABLED-NEXT:    [[ADD_3:%.*]] = add nsw i32 [[TMP6]], [[ADD_2]]424; ENABLED-NEXT:    [[INDVARS_IV_NEXT_3:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 4425; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_4:%.*]]426; ENABLED:       for.exiting_block.4:427; ENABLED-NEXT:    [[CMP_4:%.*]] = icmp eq i64 [[N]], 42428; ENABLED-NEXT:    br i1 [[CMP_4]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_4:%.*]]429; ENABLED:       latch.4:430; ENABLED-NEXT:    [[ARRAYIDX_4:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_3]]431; ENABLED-NEXT:    [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX_4]], align 4432; ENABLED-NEXT:    [[ADD_4:%.*]] = add nsw i32 [[TMP7]], [[ADD_3]]433; ENABLED-NEXT:    [[INDVARS_IV_NEXT_4:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 5434; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_5:%.*]]435; ENABLED:       for.exiting_block.5:436; ENABLED-NEXT:    [[CMP_5:%.*]] = icmp eq i64 [[N]], 42437; ENABLED-NEXT:    br i1 [[CMP_5]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_5:%.*]]438; ENABLED:       latch.5:439; ENABLED-NEXT:    [[ARRAYIDX_5:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_4]]440; ENABLED-NEXT:    [[TMP8:%.*]] = load i32, ptr [[ARRAYIDX_5]], align 4441; ENABLED-NEXT:    [[ADD_5:%.*]] = add nsw i32 [[TMP8]], [[ADD_4]]442; ENABLED-NEXT:    [[INDVARS_IV_NEXT_5:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 6443; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_6:%.*]]444; ENABLED:       for.exiting_block.6:445; ENABLED-NEXT:    [[CMP_6:%.*]] = icmp eq i64 [[N]], 42446; ENABLED-NEXT:    br i1 [[CMP_6]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_6:%.*]]447; ENABLED:       latch.6:448; ENABLED-NEXT:    [[ARRAYIDX_6:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_5]]449; ENABLED-NEXT:    [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX_6]], align 4450; ENABLED-NEXT:    [[ADD_6:%.*]] = add nsw i32 [[TMP9]], [[ADD_5]]451; ENABLED-NEXT:    [[INDVARS_IV_NEXT_6:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 7452; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_7:%.*]]453; ENABLED:       for.exiting_block.7:454; ENABLED-NEXT:    [[CMP_7:%.*]] = icmp eq i64 [[N]], 42455; ENABLED-NEXT:    br i1 [[CMP_7]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_7]]456; ENABLED:       latch.7:457; ENABLED-NEXT:    [[ARRAYIDX_7:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_6]]458; ENABLED-NEXT:    [[TMP10:%.*]] = load i32, ptr [[ARRAYIDX_7]], align 4459; ENABLED-NEXT:    [[ADD_7]] = add nsw i32 [[TMP10]], [[ADD_6]]460; ENABLED-NEXT:    [[INDVARS_IV_NEXT_7]] = add i64 [[INDVARS_IV]], 8461; ENABLED-NEXT:    [[NITER_NEXT_7]] = add i64 [[NITER]], 8462; ENABLED-NEXT:    [[NITER_NCMP_7:%.*]] = icmp eq i64 [[NITER_NEXT_7]], [[UNROLL_ITER]]463; ENABLED-NEXT:    br i1 [[NITER_NCMP_7]], label [[LATCHEXIT_UNR_LCSSA:%.*]], label [[HEADER]]464; ENABLED:       latchexit.unr-lcssa:465; ENABLED-NEXT:    [[SUM_0_LCSSA_PH_PH:%.*]] = phi i32 [ [[ADD_7]], [[LATCH_7]] ]466; ENABLED-NEXT:    [[INDVARS_IV_UNR_PH:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_7]], [[LATCH_7]] ]467; ENABLED-NEXT:    [[SUM_02_UNR_PH:%.*]] = phi i32 [ [[ADD_7]], [[LATCH_7]] ]468; ENABLED-NEXT:    [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0469; ENABLED-NEXT:    br i1 [[LCMP_MOD]], label [[HEADER_EPIL_PREHEADER]], label [[LATCHEXIT:%.*]]470; ENABLED:       header.epil.preheader:471; ENABLED-NEXT:    [[INDVARS_IV_EPIL_INIT:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_UNR_PH]], [[LATCHEXIT_UNR_LCSSA]] ]472; ENABLED-NEXT:    [[SUM_02_EPIL_INIT:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[SUM_02_UNR_PH]], [[LATCHEXIT_UNR_LCSSA]] ]473; ENABLED-NEXT:    [[LCMP_MOD2:%.*]] = icmp ne i64 [[XTRAITER]], 0474; ENABLED-NEXT:    call void @llvm.assume(i1 [[LCMP_MOD2]])475; ENABLED-NEXT:    br label [[HEADER_EPIL:%.*]]476; ENABLED:       header.epil:477; ENABLED-NEXT:    [[INDVARS_IV_EPIL:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_EPIL:%.*]], [[LATCH_EPIL:%.*]] ], [ [[INDVARS_IV_EPIL_INIT]], [[HEADER_EPIL_PREHEADER]] ]478; ENABLED-NEXT:    [[SUM_02_EPIL:%.*]] = phi i32 [ [[ADD_EPIL:%.*]], [[LATCH_EPIL]] ], [ [[SUM_02_EPIL_INIT]], [[HEADER_EPIL_PREHEADER]] ]479; ENABLED-NEXT:    [[EPIL_ITER:%.*]] = phi i64 [ 0, [[HEADER_EPIL_PREHEADER]] ], [ [[EPIL_ITER_NEXT:%.*]], [[LATCH_EPIL]] ]480; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_EPIL:%.*]]481; ENABLED:       for.exiting_block.epil:482; ENABLED-NEXT:    [[CMP_EPIL:%.*]] = icmp eq i64 [[N]], 42483; ENABLED-NEXT:    br i1 [[CMP_EPIL]], label [[OTHEREXIT_LOOPEXIT2:%.*]], label [[LATCH_EPIL]]484; ENABLED:       latch.epil:485; ENABLED-NEXT:    [[ARRAYIDX_EPIL:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_EPIL]]486; ENABLED-NEXT:    [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX_EPIL]], align 4487; ENABLED-NEXT:    [[ADD_EPIL]] = add nsw i32 [[TMP11]], [[SUM_02_EPIL]]488; ENABLED-NEXT:    [[INDVARS_IV_NEXT_EPIL]] = add i64 [[INDVARS_IV_EPIL]], 1489; ENABLED-NEXT:    [[EXITCOND_EPIL:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT_EPIL]], [[N]]490; ENABLED-NEXT:    [[EPIL_ITER_NEXT]] = add i64 [[EPIL_ITER]], 1491; ENABLED-NEXT:    [[EPIL_ITER_CMP:%.*]] = icmp ne i64 [[EPIL_ITER_NEXT]], [[XTRAITER]]492; ENABLED-NEXT:    br i1 [[EPIL_ITER_CMP]], label [[HEADER_EPIL]], label [[LATCHEXIT_EPILOG_LCSSA:%.*]], !llvm.loop [[LOOP2:![0-9]+]]493; ENABLED:       latchexit.epilog-lcssa:494; ENABLED-NEXT:    [[SUM_0_LCSSA_PH1:%.*]] = phi i32 [ [[ADD_EPIL]], [[LATCH_EPIL]] ]495; ENABLED-NEXT:    br label [[LATCHEXIT]]496; ENABLED:       latchexit:497; ENABLED-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[SUM_0_LCSSA_PH_PH]], [[LATCHEXIT_UNR_LCSSA]] ], [ [[SUM_0_LCSSA_PH1]], [[LATCHEXIT_EPILOG_LCSSA]] ]498; ENABLED-NEXT:    ret i32 [[SUM_0_LCSSA]]499; ENABLED:       otherexit.loopexit:500; ENABLED-NEXT:    [[RVAL_PH:%.*]] = phi i32 [ [[SUM_02]], [[FOR_EXITING_BLOCK]] ], [ [[ADD]], [[FOR_EXITING_BLOCK_1]] ], [ [[ADD_1]], [[FOR_EXITING_BLOCK_2]] ], [ [[ADD_2]], [[FOR_EXITING_BLOCK_3]] ], [ [[ADD_3]], [[FOR_EXITING_BLOCK_4]] ], [ [[ADD_4]], [[FOR_EXITING_BLOCK_5]] ], [ [[ADD_5]], [[FOR_EXITING_BLOCK_6]] ], [ [[ADD_6]], [[FOR_EXITING_BLOCK_7]] ]501; ENABLED-NEXT:    br label [[OTHEREXIT:%.*]]502; ENABLED:       otherexit.loopexit3:503; ENABLED-NEXT:    [[RVAL_PH3:%.*]] = phi i32 [ [[SUM_02_EPIL]], [[FOR_EXITING_BLOCK_EPIL]] ]504; ENABLED-NEXT:    br label [[OTHEREXIT]]505; ENABLED:       otherexit:506; ENABLED-NEXT:    [[RVAL:%.*]] = phi i32 [ [[RVAL_PH]], [[OTHEREXIT_LOOPEXIT]] ], [ [[RVAL_PH3]], [[OTHEREXIT_LOOPEXIT2]] ]507; ENABLED-NEXT:    ret i32 [[RVAL]]508;509entry:510  br label %header511 512header:513  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]514  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]515  br label %for.exiting_block516 517for.exiting_block:518  %cmp = icmp eq i64 %n, 42519  br i1 %cmp, label %otherexit, label %latch520 521latch:522  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv523  %0 = load i32, ptr %arrayidx, align 4524  %add = add nsw i32 %0, %sum.02525  %indvars.iv.next = add i64 %indvars.iv, 1526  %exitcond = icmp eq i64 %indvars.iv.next, %n527  br i1 %exitcond, label %latchexit, label %header528 529latchexit:                                          ; preds = %latch530  %sum.0.lcssa = phi i32 [ %add, %latch ]531  ret i32 %sum.0.lcssa532 533otherexit:534  %rval = phi i32 [%sum.02, %for.exiting_block ]535  ret i32 %rval536}537 538; A multiple exit loop with an estimated trip count which is small, and thus539; the loop is not worth unrolling.  We probably should peel said loop, but540; currently don't.541define i32 @test3(ptr nocapture %a, i64 %n) !prof !{!"function_entry_count", i64 2048} {542; CHECK-LABEL: @test3(543; CHECK-NEXT:  entry:544; CHECK-NEXT:    br label [[HEADER:%.*]]545; CHECK:       header:546; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]547; CHECK-NEXT:    [[SUM_02:%.*]] = phi i32 [ [[ADD:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]548; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]549; CHECK:       for.exiting_block:550; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N:%.*]], 42551; CHECK-NEXT:    br i1 [[CMP]], label [[OTHEREXIT:%.*]], label [[LATCH]]552; CHECK:       latch:553; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]554; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4555; CHECK-NEXT:    [[ADD]] = add nsw i32 [[TMP0]], [[SUM_02]]556; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1557; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]558; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LATCHEXIT:%.*]], label [[HEADER]], !prof [[PROF3:![0-9]+]]559; CHECK:       latchexit:560; CHECK-NEXT:    ret i32 [[ADD]]561; CHECK:       otherexit:562; CHECK-NEXT:    ret i32 57563;564; NOUNROLL-LABEL: @test3(565; NOUNROLL-NEXT:  entry:566; NOUNROLL-NEXT:    br label [[HEADER:%.*]]567; NOUNROLL:       header:568; NOUNROLL-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]569; NOUNROLL-NEXT:    [[SUM_02:%.*]] = phi i32 [ [[ADD:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]570; NOUNROLL-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]571; NOUNROLL:       for.exiting_block:572; NOUNROLL-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N:%.*]], 42573; NOUNROLL-NEXT:    br i1 [[CMP]], label [[OTHEREXIT:%.*]], label [[LATCH]]574; NOUNROLL:       latch:575; NOUNROLL-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]576; NOUNROLL-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4577; NOUNROLL-NEXT:    [[ADD]] = add nsw i32 [[TMP0]], [[SUM_02]]578; NOUNROLL-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1579; NOUNROLL-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]580; NOUNROLL-NEXT:    br i1 [[EXITCOND]], label [[LATCHEXIT:%.*]], label [[HEADER]], !prof [[PROF1:![0-9]+]]581; NOUNROLL:       latchexit:582; NOUNROLL-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[ADD]], [[LATCH]] ]583; NOUNROLL-NEXT:    ret i32 [[SUM_0_LCSSA]]584; NOUNROLL:       otherexit:585; NOUNROLL-NEXT:    ret i32 57586;587; ENABLED-LABEL: @test3(588; ENABLED-NEXT:  entry:589; ENABLED-NEXT:    br label [[HEADER:%.*]]590; ENABLED:       header:591; ENABLED-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]592; ENABLED-NEXT:    [[SUM_02:%.*]] = phi i32 [ [[ADD:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]593; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]594; ENABLED:       for.exiting_block:595; ENABLED-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N:%.*]], 42596; ENABLED-NEXT:    br i1 [[CMP]], label [[OTHEREXIT:%.*]], label [[LATCH]]597; ENABLED:       latch:598; ENABLED-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]599; ENABLED-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4600; ENABLED-NEXT:    [[ADD]] = add nsw i32 [[TMP0]], [[SUM_02]]601; ENABLED-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1602; ENABLED-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]603; ENABLED-NEXT:    br i1 [[EXITCOND]], label [[LATCHEXIT:%.*]], label [[HEADER]], !prof [[PROF4:![0-9]+]]604; ENABLED:       latchexit:605; ENABLED-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[ADD]], [[LATCH]] ]606; ENABLED-NEXT:    ret i32 [[SUM_0_LCSSA]]607; ENABLED:       otherexit:608; ENABLED-NEXT:    ret i32 57609;610entry:611  br label %header612 613header:614  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]615  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]616  br label %for.exiting_block617 618for.exiting_block:619  %cmp = icmp eq i64 %n, 42620  br i1 %cmp, label %otherexit, label %latch621 622latch:623  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv624  %0 = load i32, ptr %arrayidx, align 4625  %add = add nsw i32 %0, %sum.02626  %indvars.iv.next = add i64 %indvars.iv, 1627  %exitcond = icmp eq i64 %indvars.iv.next, %n628  br i1 %exitcond, label %latchexit, label %header, !prof !{!"branch_weights", i64 1, i64 2}629 630latchexit:                                          ; preds = %latch631  %sum.0.lcssa = phi i32 [ %add, %latch ]632  ret i32 %sum.0.lcssa633 634otherexit:635  ret i32 57636}637 638; A case noticed while writing test3 where changing the early exit condition639; seems to inhibit unrolling for some unclear reason.640define i32 @test4(ptr nocapture %a, i64 %n) !prof !{!"function_entry_count", i64 2048} {641;642; CHECK-LABEL: @test4(643; CHECK-NEXT:  entry:644; CHECK-NEXT:    br label [[HEADER:%.*]]645; CHECK:       header:646; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]647; CHECK-NEXT:    [[SUM_02:%.*]] = phi i32 [ [[ADD:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]648; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]649; CHECK:       for.exiting_block:650; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[INDVARS_IV]], 4096651; CHECK-NEXT:    br i1 [[CMP]], label [[OTHEREXIT:%.*]], label [[LATCH]]652; CHECK:       latch:653; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]654; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4655; CHECK-NEXT:    [[ADD]] = add nsw i32 [[TMP0]], [[SUM_02]]656; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1657; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N:%.*]]658; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LATCHEXIT:%.*]], label [[HEADER]]659; CHECK:       latchexit:660; CHECK-NEXT:    ret i32 [[ADD]]661; CHECK:       otherexit:662; CHECK-NEXT:    ret i32 57663;664; NOUNROLL-LABEL: @test4(665; NOUNROLL-NEXT:  entry:666; NOUNROLL-NEXT:    br label [[HEADER:%.*]]667; NOUNROLL:       header:668; NOUNROLL-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]669; NOUNROLL-NEXT:    [[SUM_02:%.*]] = phi i32 [ [[ADD:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]670; NOUNROLL-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]671; NOUNROLL:       for.exiting_block:672; NOUNROLL-NEXT:    [[CMP:%.*]] = icmp eq i64 [[INDVARS_IV]], 4096673; NOUNROLL-NEXT:    br i1 [[CMP]], label [[OTHEREXIT:%.*]], label [[LATCH]]674; NOUNROLL:       latch:675; NOUNROLL-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]676; NOUNROLL-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4677; NOUNROLL-NEXT:    [[ADD]] = add nsw i32 [[TMP0]], [[SUM_02]]678; NOUNROLL-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1679; NOUNROLL-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N:%.*]]680; NOUNROLL-NEXT:    br i1 [[EXITCOND]], label [[LATCHEXIT:%.*]], label [[HEADER]]681; NOUNROLL:       latchexit:682; NOUNROLL-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[ADD]], [[LATCH]] ]683; NOUNROLL-NEXT:    ret i32 [[SUM_0_LCSSA]]684; NOUNROLL:       otherexit:685; NOUNROLL-NEXT:    ret i32 57686;687; ENABLED-LABEL: @test4(688; ENABLED-NEXT:  entry:689; ENABLED-NEXT:    br label [[HEADER:%.*]]690; ENABLED:       header:691; ENABLED-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]692; ENABLED-NEXT:    [[SUM_02:%.*]] = phi i32 [ [[ADD:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]693; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]694; ENABLED:       for.exiting_block:695; ENABLED-NEXT:    [[CMP:%.*]] = icmp eq i64 [[INDVARS_IV]], 4096696; ENABLED-NEXT:    br i1 [[CMP]], label [[OTHEREXIT:%.*]], label [[LATCH]]697; ENABLED:       latch:698; ENABLED-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]699; ENABLED-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4700; ENABLED-NEXT:    [[ADD]] = add nsw i32 [[TMP0]], [[SUM_02]]701; ENABLED-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1702; ENABLED-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N:%.*]]703; ENABLED-NEXT:    br i1 [[EXITCOND]], label [[LATCHEXIT:%.*]], label [[HEADER]]704; ENABLED:       latchexit:705; ENABLED-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[ADD]], [[LATCH]] ]706; ENABLED-NEXT:    ret i32 [[SUM_0_LCSSA]]707; ENABLED:       otherexit:708; ENABLED-NEXT:    ret i32 57709;710entry:711  br label %header712 713header:714  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]715  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]716  br label %for.exiting_block717 718for.exiting_block:719  %cmp = icmp eq i64 %indvars.iv, 4096720  br i1 %cmp, label %otherexit, label %latch721 722latch:723  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv724  %0 = load i32, ptr %arrayidx, align 4725  %add = add nsw i32 %0, %sum.02726  %indvars.iv.next = add i64 %indvars.iv, 1727  %exitcond = icmp eq i64 %indvars.iv.next, %n728  br i1 %exitcond, label %latchexit, label %header729 730latchexit:                                          ; preds = %latch731  %sum.0.lcssa = phi i32 [ %add, %latch ]732  ret i32 %sum.0.lcssa733 734otherexit:735  ret i32 57736}737 738; the exit block is not a deopt block but it leads to deopt one.739define i32 @test5(ptr nocapture %a, i64 %n) {740;741; CHECK-LABEL: @test5(742; CHECK-NEXT:  entry:743; CHECK-NEXT:    [[TMP0:%.*]] = freeze i64 [[N:%.*]]744; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[TMP0]], -1745; CHECK-NEXT:    [[XTRAITER:%.*]] = and i64 [[TMP0]], 7746; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 7747; CHECK-NEXT:    br i1 [[TMP2]], label [[HEADER_EPIL_PREHEADER:%.*]], label [[ENTRY_NEW:%.*]]748; CHECK:       entry.new:749; CHECK-NEXT:    [[UNROLL_ITER:%.*]] = and i64 [[TMP0]], -8750; CHECK-NEXT:    br label [[HEADER:%.*]]751; CHECK:       header:752; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[INDVARS_IV_NEXT_7:%.*]], [[LATCH_7:%.*]] ]753; CHECK-NEXT:    [[SUM_02:%.*]] = phi i32 [ 0, [[ENTRY_NEW]] ], [ [[ADD_7:%.*]], [[LATCH_7]] ]754; CHECK-NEXT:    [[NITER:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[NITER_NEXT_7:%.*]], [[LATCH_7]] ]755; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]756; CHECK:       for.exiting_block:757; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[TMP0]], 42758; CHECK-NEXT:    br i1 [[CMP]], label [[OTHEREXIT_LOOPEXIT:%.*]], label [[LATCH:%.*]]759; CHECK:       latch:760; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]761; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ARRAYIDX]], align 4762; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], [[SUM_02]]763; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_1:%.*]]764; CHECK:       for.exiting_block.1:765; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_1:%.*]]766; CHECK:       latch.1:767; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]768; CHECK-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr i8, ptr [[TMP13]], i64 4769; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX_1]], align 4770; CHECK-NEXT:    [[ADD_1:%.*]] = add nsw i32 [[TMP4]], [[ADD]]771; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_2:%.*]]772; CHECK:       for.exiting_block.2:773; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_2:%.*]]774; CHECK:       latch.2:775; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]776; CHECK-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr i8, ptr [[TMP15]], i64 8777; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX_2]], align 4778; CHECK-NEXT:    [[ADD_2:%.*]] = add nsw i32 [[TMP5]], [[ADD_1]]779; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_3:%.*]]780; CHECK:       for.exiting_block.3:781; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_3:%.*]]782; CHECK:       latch.3:783; CHECK-NEXT:    [[TMP17:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]784; CHECK-NEXT:    [[ARRAYIDX_3:%.*]] = getelementptr i8, ptr [[TMP17]], i64 12785; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX_3]], align 4786; CHECK-NEXT:    [[ADD_3:%.*]] = add nsw i32 [[TMP6]], [[ADD_2]]787; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_4:%.*]]788; CHECK:       for.exiting_block.4:789; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_4:%.*]]790; CHECK:       latch.4:791; CHECK-NEXT:    [[TMP18:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]792; CHECK-NEXT:    [[ARRAYIDX_4:%.*]] = getelementptr i8, ptr [[TMP18]], i64 16793; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX_4]], align 4794; CHECK-NEXT:    [[ADD_4:%.*]] = add nsw i32 [[TMP7]], [[ADD_3]]795; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_5:%.*]]796; CHECK:       for.exiting_block.5:797; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_5:%.*]]798; CHECK:       latch.5:799; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]800; CHECK-NEXT:    [[ARRAYIDX_5:%.*]] = getelementptr i8, ptr [[TMP12]], i64 20801; CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr [[ARRAYIDX_5]], align 4802; CHECK-NEXT:    [[ADD_5:%.*]] = add nsw i32 [[TMP8]], [[ADD_4]]803; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_6:%.*]]804; CHECK:       for.exiting_block.6:805; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_6:%.*]]806; CHECK:       latch.6:807; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]808; CHECK-NEXT:    [[ARRAYIDX_6:%.*]] = getelementptr i8, ptr [[TMP14]], i64 24809; CHECK-NEXT:    [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX_6]], align 4810; CHECK-NEXT:    [[ADD_6:%.*]] = add nsw i32 [[TMP9]], [[ADD_5]]811; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_7:%.*]]812; CHECK:       for.exiting_block.7:813; CHECK-NEXT:    br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_7]]814; CHECK:       latch.7:815; CHECK-NEXT:    [[TMP16:%.*]] = getelementptr i32, ptr [[A]], i64 [[INDVARS_IV]]816; CHECK-NEXT:    [[ARRAYIDX_7:%.*]] = getelementptr i8, ptr [[TMP16]], i64 28817; CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr [[ARRAYIDX_7]], align 4818; CHECK-NEXT:    [[ADD_7]] = add nsw i32 [[TMP10]], [[ADD_6]]819; CHECK-NEXT:    [[INDVARS_IV_NEXT_7]] = add i64 [[INDVARS_IV]], 8820; CHECK-NEXT:    [[NITER_NEXT_7]] = add i64 [[NITER]], 8821; CHECK-NEXT:    [[NITER_NCMP_7:%.*]] = icmp eq i64 [[NITER_NEXT_7]], [[UNROLL_ITER]]822; CHECK-NEXT:    br i1 [[NITER_NCMP_7]], label [[LATCHEXIT_UNR_LCSSA:%.*]], label [[HEADER]]823; CHECK:       latchexit.unr-lcssa:824; CHECK-NEXT:    [[LCMP_MOD_NOT:%.*]] = icmp eq i64 [[XTRAITER]], 0825; CHECK-NEXT:    br i1 [[LCMP_MOD_NOT]], label [[LATCHEXIT:%.*]], label [[HEADER_EPIL_PREHEADER]]826; CHECK:       header.epil.preheader:827; CHECK-NEXT:    [[INDVARS_IV_EPIL_INIT:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT_7]], [[LATCHEXIT_UNR_LCSSA]] ]828; CHECK-NEXT:    [[SUM_02_EPIL_INIT:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[ADD_7]], [[LATCHEXIT_UNR_LCSSA]] ]829; CHECK-NEXT:    [[LCMP_MOD3:%.*]] = icmp ne i64 [[XTRAITER]], 0830; CHECK-NEXT:    call void @llvm.assume(i1 [[LCMP_MOD3]])831; CHECK-NEXT:    br label [[HEADER_EPIL:%.*]]832; CHECK:       header.epil:833; CHECK-NEXT:    [[INDVARS_IV_EPIL:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_EPIL:%.*]], [[LATCH_EPIL:%.*]] ], [ [[INDVARS_IV_EPIL_INIT]], [[HEADER_EPIL_PREHEADER]] ]834; CHECK-NEXT:    [[SUM_02_EPIL:%.*]] = phi i32 [ [[ADD_EPIL:%.*]], [[LATCH_EPIL]] ], [ [[SUM_02_EPIL_INIT]], [[HEADER_EPIL_PREHEADER]] ]835; CHECK-NEXT:    [[EPIL_ITER:%.*]] = phi i64 [ [[EPIL_ITER_NEXT:%.*]], [[LATCH_EPIL]] ], [ 0, [[HEADER_EPIL_PREHEADER]] ]836; CHECK-NEXT:    br label [[FOR_EXITING_BLOCK_EPIL:%.*]]837; CHECK:       for.exiting_block.epil:838; CHECK-NEXT:    [[CMP_EPIL:%.*]] = icmp eq i64 [[TMP0]], 42839; CHECK-NEXT:    br i1 [[CMP_EPIL]], label [[OTHEREXIT_LOOPEXIT3:%.*]], label [[LATCH_EPIL]]840; CHECK:       latch.epil:841; CHECK-NEXT:    [[ARRAYIDX_EPIL:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_EPIL]]842; CHECK-NEXT:    [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX_EPIL]], align 4843; CHECK-NEXT:    [[ADD_EPIL]] = add nsw i32 [[TMP11]], [[SUM_02_EPIL]]844; CHECK-NEXT:    [[INDVARS_IV_NEXT_EPIL]] = add i64 [[INDVARS_IV_EPIL]], 1845; CHECK-NEXT:    [[EPIL_ITER_NEXT]] = add i64 [[EPIL_ITER]], 1846; CHECK-NEXT:    [[EPIL_ITER_CMP_NOT:%.*]] = icmp eq i64 [[EPIL_ITER_NEXT]], [[XTRAITER]]847; CHECK-NEXT:    br i1 [[EPIL_ITER_CMP_NOT]], label [[LATCHEXIT_EPILOG_LCSSA:%.*]], label [[HEADER_EPIL]], !llvm.loop [[LOOP4:![0-9]+]]848; CHECK:       latchexit.epilog-lcssa:849; CHECK-NEXT:    br label [[LATCHEXIT]]850; CHECK:       latchexit:851; CHECK-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[ADD_7]], [[LATCHEXIT_UNR_LCSSA]] ], [ [[ADD_EPIL]], [[LATCHEXIT_EPILOG_LCSSA]] ]852; CHECK-NEXT:    ret i32 [[SUM_0_LCSSA]]853; CHECK:       otherexit.loopexit:854; CHECK-NEXT:    br label [[OTHEREXIT:%.*]]855; CHECK:       otherexit.loopexit4:856; CHECK-NEXT:    br label [[OTHEREXIT]]857; CHECK:       otherexit:858; CHECK-NEXT:    [[SUM_02_LCSSA:%.*]] = phi i32 [ [[SUM_02]], [[OTHEREXIT_LOOPEXIT]] ], [ [[SUM_02_EPIL]], [[OTHEREXIT_LOOPEXIT3]] ]859; CHECK-NEXT:    br label [[OTHEREXIT2:%.*]]860; CHECK:       otherexit2:861; CHECK-NEXT:    [[RVAL2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 [[SUM_02_LCSSA]]) ]862; CHECK-NEXT:    ret i32 [[RVAL2]]863;864; NOUNROLL-LABEL: @test5(865; NOUNROLL-NEXT:  entry:866; NOUNROLL-NEXT:    br label [[HEADER:%.*]]867; NOUNROLL:       header:868; NOUNROLL-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]869; NOUNROLL-NEXT:    [[SUM_02:%.*]] = phi i32 [ [[ADD:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]870; NOUNROLL-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]871; NOUNROLL:       for.exiting_block:872; NOUNROLL-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N:%.*]], 42873; NOUNROLL-NEXT:    br i1 [[CMP]], label [[OTHEREXIT:%.*]], label [[LATCH]]874; NOUNROLL:       latch:875; NOUNROLL-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]876; NOUNROLL-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4877; NOUNROLL-NEXT:    [[ADD]] = add nsw i32 [[TMP0]], [[SUM_02]]878; NOUNROLL-NEXT:    [[INDVARS_IV_NEXT]] = add i64 [[INDVARS_IV]], 1879; NOUNROLL-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[N]]880; NOUNROLL-NEXT:    br i1 [[EXITCOND]], label [[LATCHEXIT:%.*]], label [[HEADER]]881; NOUNROLL:       latchexit:882; NOUNROLL-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[ADD]], [[LATCH]] ]883; NOUNROLL-NEXT:    ret i32 [[SUM_0_LCSSA]]884; NOUNROLL:       otherexit:885; NOUNROLL-NEXT:    [[SUM_02_LCSSA:%.*]] = phi i32 [ [[SUM_02]], [[FOR_EXITING_BLOCK]] ]886; NOUNROLL-NEXT:    [[RVAL:%.*]] = phi i32 [ [[SUM_02]], [[FOR_EXITING_BLOCK]] ]887; NOUNROLL-NEXT:    br label [[OTHEREXIT2:%.*]]888; NOUNROLL:       otherexit2:889; NOUNROLL-NEXT:    [[RVAL2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 [[SUM_02_LCSSA]]) ]890; NOUNROLL-NEXT:    ret i32 [[RVAL2]]891;892; ENABLED-LABEL: @test5(893; ENABLED-NEXT:  entry:894; ENABLED-NEXT:    [[TMP0:%.*]] = freeze i64 [[N:%.*]]895; ENABLED-NEXT:    [[TMP1:%.*]] = add i64 [[TMP0]], -1896; ENABLED-NEXT:    [[XTRAITER:%.*]] = and i64 [[TMP0]], 7897; ENABLED-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 7898; ENABLED-NEXT:    br i1 [[TMP2]], label [[HEADER_EPIL_PREHEADER:%.*]], label [[ENTRY_NEW:%.*]]899; ENABLED:       entry.new:900; ENABLED-NEXT:    [[UNROLL_ITER:%.*]] = sub i64 [[TMP0]], [[XTRAITER]]901; ENABLED-NEXT:    br label [[HEADER:%.*]]902; ENABLED:       header:903; ENABLED-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[INDVARS_IV_NEXT_7:%.*]], [[LATCH_7:%.*]] ]904; ENABLED-NEXT:    [[SUM_02:%.*]] = phi i32 [ 0, [[ENTRY_NEW]] ], [ [[ADD_7:%.*]], [[LATCH_7]] ]905; ENABLED-NEXT:    [[NITER:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[NITER_NEXT_7:%.*]], [[LATCH_7]] ]906; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK:%.*]]907; ENABLED:       for.exiting_block:908; ENABLED-NEXT:    [[CMP:%.*]] = icmp eq i64 [[N]], 42909; ENABLED-NEXT:    br i1 [[CMP]], label [[OTHEREXIT_LOOPEXIT:%.*]], label [[LATCH:%.*]]910; ENABLED:       latch:911; ENABLED-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i64 [[INDVARS_IV]]912; ENABLED-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ARRAYIDX]], align 4913; ENABLED-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP3]], [[SUM_02]]914; ENABLED-NEXT:    [[INDVARS_IV_NEXT:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 1915; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_1:%.*]]916; ENABLED:       for.exiting_block.1:917; ENABLED-NEXT:    [[CMP_1:%.*]] = icmp eq i64 [[N]], 42918; ENABLED-NEXT:    br i1 [[CMP_1]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_1:%.*]]919; ENABLED:       latch.1:920; ENABLED-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT]]921; ENABLED-NEXT:    [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX_1]], align 4922; ENABLED-NEXT:    [[ADD_1:%.*]] = add nsw i32 [[TMP4]], [[ADD]]923; ENABLED-NEXT:    [[INDVARS_IV_NEXT_1:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 2924; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_2:%.*]]925; ENABLED:       for.exiting_block.2:926; ENABLED-NEXT:    [[CMP_2:%.*]] = icmp eq i64 [[N]], 42927; ENABLED-NEXT:    br i1 [[CMP_2]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_2:%.*]]928; ENABLED:       latch.2:929; ENABLED-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_1]]930; ENABLED-NEXT:    [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX_2]], align 4931; ENABLED-NEXT:    [[ADD_2:%.*]] = add nsw i32 [[TMP5]], [[ADD_1]]932; ENABLED-NEXT:    [[INDVARS_IV_NEXT_2:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 3933; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_3:%.*]]934; ENABLED:       for.exiting_block.3:935; ENABLED-NEXT:    [[CMP_3:%.*]] = icmp eq i64 [[N]], 42936; ENABLED-NEXT:    br i1 [[CMP_3]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_3:%.*]]937; ENABLED:       latch.3:938; ENABLED-NEXT:    [[ARRAYIDX_3:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_2]]939; ENABLED-NEXT:    [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX_3]], align 4940; ENABLED-NEXT:    [[ADD_3:%.*]] = add nsw i32 [[TMP6]], [[ADD_2]]941; ENABLED-NEXT:    [[INDVARS_IV_NEXT_3:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 4942; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_4:%.*]]943; ENABLED:       for.exiting_block.4:944; ENABLED-NEXT:    [[CMP_4:%.*]] = icmp eq i64 [[N]], 42945; ENABLED-NEXT:    br i1 [[CMP_4]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_4:%.*]]946; ENABLED:       latch.4:947; ENABLED-NEXT:    [[ARRAYIDX_4:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_3]]948; ENABLED-NEXT:    [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX_4]], align 4949; ENABLED-NEXT:    [[ADD_4:%.*]] = add nsw i32 [[TMP7]], [[ADD_3]]950; ENABLED-NEXT:    [[INDVARS_IV_NEXT_4:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 5951; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_5:%.*]]952; ENABLED:       for.exiting_block.5:953; ENABLED-NEXT:    [[CMP_5:%.*]] = icmp eq i64 [[N]], 42954; ENABLED-NEXT:    br i1 [[CMP_5]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_5:%.*]]955; ENABLED:       latch.5:956; ENABLED-NEXT:    [[ARRAYIDX_5:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_4]]957; ENABLED-NEXT:    [[TMP8:%.*]] = load i32, ptr [[ARRAYIDX_5]], align 4958; ENABLED-NEXT:    [[ADD_5:%.*]] = add nsw i32 [[TMP8]], [[ADD_4]]959; ENABLED-NEXT:    [[INDVARS_IV_NEXT_5:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 6960; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_6:%.*]]961; ENABLED:       for.exiting_block.6:962; ENABLED-NEXT:    [[CMP_6:%.*]] = icmp eq i64 [[N]], 42963; ENABLED-NEXT:    br i1 [[CMP_6]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_6:%.*]]964; ENABLED:       latch.6:965; ENABLED-NEXT:    [[ARRAYIDX_6:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_5]]966; ENABLED-NEXT:    [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX_6]], align 4967; ENABLED-NEXT:    [[ADD_6:%.*]] = add nsw i32 [[TMP9]], [[ADD_5]]968; ENABLED-NEXT:    [[INDVARS_IV_NEXT_6:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 7969; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_7:%.*]]970; ENABLED:       for.exiting_block.7:971; ENABLED-NEXT:    [[CMP_7:%.*]] = icmp eq i64 [[N]], 42972; ENABLED-NEXT:    br i1 [[CMP_7]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_7]]973; ENABLED:       latch.7:974; ENABLED-NEXT:    [[ARRAYIDX_7:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_6]]975; ENABLED-NEXT:    [[TMP10:%.*]] = load i32, ptr [[ARRAYIDX_7]], align 4976; ENABLED-NEXT:    [[ADD_7]] = add nsw i32 [[TMP10]], [[ADD_6]]977; ENABLED-NEXT:    [[INDVARS_IV_NEXT_7]] = add i64 [[INDVARS_IV]], 8978; ENABLED-NEXT:    [[NITER_NEXT_7]] = add i64 [[NITER]], 8979; ENABLED-NEXT:    [[NITER_NCMP_7:%.*]] = icmp eq i64 [[NITER_NEXT_7]], [[UNROLL_ITER]]980; ENABLED-NEXT:    br i1 [[NITER_NCMP_7]], label [[LATCHEXIT_UNR_LCSSA:%.*]], label [[HEADER]]981; ENABLED:       latchexit.unr-lcssa:982; ENABLED-NEXT:    [[SUM_0_LCSSA_PH_PH:%.*]] = phi i32 [ [[ADD_7]], [[LATCH_7]] ]983; ENABLED-NEXT:    [[INDVARS_IV_UNR_PH:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_7]], [[LATCH_7]] ]984; ENABLED-NEXT:    [[SUM_02_UNR_PH:%.*]] = phi i32 [ [[ADD_7]], [[LATCH_7]] ]985; ENABLED-NEXT:    [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0986; ENABLED-NEXT:    br i1 [[LCMP_MOD]], label [[HEADER_EPIL_PREHEADER]], label [[LATCHEXIT:%.*]]987; ENABLED:       header.epil.preheader:988; ENABLED-NEXT:    [[INDVARS_IV_EPIL_INIT:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_UNR_PH]], [[LATCHEXIT_UNR_LCSSA]] ]989; ENABLED-NEXT:    [[SUM_02_EPIL_INIT:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[SUM_02_UNR_PH]], [[LATCHEXIT_UNR_LCSSA]] ]990; ENABLED-NEXT:    [[LCMP_MOD3:%.*]] = icmp ne i64 [[XTRAITER]], 0991; ENABLED-NEXT:    call void @llvm.assume(i1 [[LCMP_MOD3]])992; ENABLED-NEXT:    br label [[HEADER_EPIL:%.*]]993; ENABLED:       header.epil:994; ENABLED-NEXT:    [[INDVARS_IV_EPIL:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_EPIL:%.*]], [[LATCH_EPIL:%.*]] ], [ [[INDVARS_IV_EPIL_INIT]], [[HEADER_EPIL_PREHEADER]] ]995; ENABLED-NEXT:    [[SUM_02_EPIL:%.*]] = phi i32 [ [[ADD_EPIL:%.*]], [[LATCH_EPIL]] ], [ [[SUM_02_EPIL_INIT]], [[HEADER_EPIL_PREHEADER]] ]996; ENABLED-NEXT:    [[EPIL_ITER:%.*]] = phi i64 [ 0, [[HEADER_EPIL_PREHEADER]] ], [ [[EPIL_ITER_NEXT:%.*]], [[LATCH_EPIL]] ]997; ENABLED-NEXT:    br label [[FOR_EXITING_BLOCK_EPIL:%.*]]998; ENABLED:       for.exiting_block.epil:999; ENABLED-NEXT:    [[CMP_EPIL:%.*]] = icmp eq i64 [[N]], 421000; ENABLED-NEXT:    br i1 [[CMP_EPIL]], label [[OTHEREXIT_LOOPEXIT3:%.*]], label [[LATCH_EPIL]]1001; ENABLED:       latch.epil:1002; ENABLED-NEXT:    [[ARRAYIDX_EPIL:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_EPIL]]1003; ENABLED-NEXT:    [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX_EPIL]], align 41004; ENABLED-NEXT:    [[ADD_EPIL]] = add nsw i32 [[TMP11]], [[SUM_02_EPIL]]1005; ENABLED-NEXT:    [[INDVARS_IV_NEXT_EPIL]] = add i64 [[INDVARS_IV_EPIL]], 11006; ENABLED-NEXT:    [[EXITCOND_EPIL:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT_EPIL]], [[N]]1007; ENABLED-NEXT:    [[EPIL_ITER_NEXT]] = add i64 [[EPIL_ITER]], 11008; ENABLED-NEXT:    [[EPIL_ITER_CMP:%.*]] = icmp ne i64 [[EPIL_ITER_NEXT]], [[XTRAITER]]1009; ENABLED-NEXT:    br i1 [[EPIL_ITER_CMP]], label [[HEADER_EPIL]], label [[LATCHEXIT_EPILOG_LCSSA:%.*]], !llvm.loop [[LOOP5:![0-9]+]]1010; ENABLED:       latchexit.epilog-lcssa:1011; ENABLED-NEXT:    [[SUM_0_LCSSA_PH2:%.*]] = phi i32 [ [[ADD_EPIL]], [[LATCH_EPIL]] ]1012; ENABLED-NEXT:    br label [[LATCHEXIT]]1013; ENABLED:       latchexit:1014; ENABLED-NEXT:    [[SUM_0_LCSSA:%.*]] = phi i32 [ [[SUM_0_LCSSA_PH_PH]], [[LATCHEXIT_UNR_LCSSA]] ], [ [[SUM_0_LCSSA_PH2]], [[LATCHEXIT_EPILOG_LCSSA]] ]1015; ENABLED-NEXT:    ret i32 [[SUM_0_LCSSA]]1016; ENABLED:       otherexit.loopexit:1017; ENABLED-NEXT:    [[SUM_02_LCSSA_PH:%.*]] = phi i32 [ [[SUM_02]], [[FOR_EXITING_BLOCK]] ], [ [[ADD]], [[FOR_EXITING_BLOCK_1]] ], [ [[ADD_1]], [[FOR_EXITING_BLOCK_2]] ], [ [[ADD_2]], [[FOR_EXITING_BLOCK_3]] ], [ [[ADD_3]], [[FOR_EXITING_BLOCK_4]] ], [ [[ADD_4]], [[FOR_EXITING_BLOCK_5]] ], [ [[ADD_5]], [[FOR_EXITING_BLOCK_6]] ], [ [[ADD_6]], [[FOR_EXITING_BLOCK_7]] ]1018; ENABLED-NEXT:    [[RVAL_PH:%.*]] = phi i32 [ [[SUM_02]], [[FOR_EXITING_BLOCK]] ], [ [[ADD]], [[FOR_EXITING_BLOCK_1]] ], [ [[ADD_1]], [[FOR_EXITING_BLOCK_2]] ], [ [[ADD_2]], [[FOR_EXITING_BLOCK_3]] ], [ [[ADD_3]], [[FOR_EXITING_BLOCK_4]] ], [ [[ADD_4]], [[FOR_EXITING_BLOCK_5]] ], [ [[ADD_5]], [[FOR_EXITING_BLOCK_6]] ], [ [[ADD_6]], [[FOR_EXITING_BLOCK_7]] ]1019; ENABLED-NEXT:    br label [[OTHEREXIT:%.*]]1020; ENABLED:       otherexit.loopexit4:1021; ENABLED-NEXT:    [[SUM_02_LCSSA_PH4:%.*]] = phi i32 [ [[SUM_02_EPIL]], [[FOR_EXITING_BLOCK_EPIL]] ]1022; ENABLED-NEXT:    [[RVAL_PH5:%.*]] = phi i32 [ [[SUM_02_EPIL]], [[FOR_EXITING_BLOCK_EPIL]] ]1023; ENABLED-NEXT:    br label [[OTHEREXIT]]1024; ENABLED:       otherexit:1025; ENABLED-NEXT:    [[SUM_02_LCSSA:%.*]] = phi i32 [ [[SUM_02_LCSSA_PH]], [[OTHEREXIT_LOOPEXIT]] ], [ [[SUM_02_LCSSA_PH4]], [[OTHEREXIT_LOOPEXIT3]] ]1026; ENABLED-NEXT:    [[RVAL:%.*]] = phi i32 [ [[RVAL_PH]], [[OTHEREXIT_LOOPEXIT]] ], [ [[RVAL_PH5]], [[OTHEREXIT_LOOPEXIT3]] ]1027; ENABLED-NEXT:    br label [[OTHEREXIT2:%.*]]1028; ENABLED:       otherexit2:1029; ENABLED-NEXT:    [[RVAL2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 [[SUM_02_LCSSA]]) ]1030; ENABLED-NEXT:    ret i32 [[RVAL2]]1031;1032entry:1033  br label %header1034 1035header:1036  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]1037  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]1038  br label %for.exiting_block1039 1040for.exiting_block:1041  %cmp = icmp eq i64 %n, 421042  br i1 %cmp, label %otherexit, label %latch1043 1044latch:1045  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1046  %0 = load i32, ptr %arrayidx, align 41047  %add = add nsw i32 %0, %sum.021048  %indvars.iv.next = add i64 %indvars.iv, 11049  %exitcond = icmp eq i64 %indvars.iv.next, %n1050  br i1 %exitcond, label %latchexit, label %header1051 1052latchexit:                                          ; preds = %latch1053  %sum.0.lcssa = phi i32 [ %add, %latch ]1054  ret i32 %sum.0.lcssa1055 1056otherexit:1057  %rval = phi i32 [%sum.02, %for.exiting_block ]1058  br label %otherexit21059 1060otherexit2:1061  %rval2 = call i32(...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 %sum.02) ]1062  ret i32 %rval21063}1064 1065declare i32 @llvm.experimental.deoptimize.i32(...)1066