Index: llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp =================================================================== --- llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp +++ llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp @@ -320,30 +320,25 @@ // | with newbound | // +--------------------+ // | + // | /----------------\ + // +--------v----v------+ | + // | header2 |---\ | + // | conditional branch | | | + // |with false condition| | | + // +--------------------+ | | + // | | | + // +--------v-----------+ | | + // | if.then.BB2 | | | + // +--------------------+ | | + // | | | + // +--------v-----------<---/ | + // | latch2 >----------/ + // | with org bound | + // +--------v-----------+ + // | // +--------v-----------+ - // | preheader2 |--------------\ - // | if (AddRec i != | | - // | org bound) | | - // +--------------------+ | - // | /----------------\ | - // +--------v----v------+ | | - // | header2 |---\ | | - // | conditional branch | | | | - // |with false condition| | | | - // +--------------------+ | | | - // | | | | - // +--------v-----------+ | | | - // | if.then.BB2 | | | | - // +--------------------+ | | | - // | | | | - // +--------v-----------<---/ | | - // | latch2 >----------/ | - // | with org bound | | - // +--------v-----------+ | - // | | - // | +---------------+ | - // +--> exit <-------/ - // +---------------+ + // | exit | + // +--------------------+ // Let's create post loop. SmallVector PostLoopBlocks; @@ -389,14 +384,6 @@ ExitingCondLCSSAPhi = LCSSAPhi; } - // Add conditional branch to check we can skip post-loop in its preheader. - Instruction *OrigBI = PostLoopPreHeader->getTerminator(); - ICmpInst::Predicate Pred = ICmpInst::ICMP_NE; - Value *Cond = - Builder.CreateICmp(Pred, ExitingCondLCSSAPhi, ExitingCond.BoundValue); - Builder.CreateCondBr(Cond, PostLoop->getHeader(), PostLoop->getExitBlock()); - OrigBI->eraseFromParent(); - // Create new loop bound and add it into preheader of pre-loop. const SCEV *NewBoundSCEV = ExitingCond.BoundSCEV; const SCEV *SplitBoundSCEV = SplitCandidateCond.BoundSCEV; @@ -444,18 +431,16 @@ LCSSAPhi->addIncoming(IncomingValue, PN.getIncomingBlock(i)); // Replace pre-loop's exiting block by post-loop's preheader. - PN.setIncomingBlock(i, PostLoopPreHeader); + PN.setIncomingBlock(i, PostLoop->getExitingBlock()); // Replace incoming value by LCSSAPhi. PN.setIncomingValue(i, LCSSAPhi); - // Add a new incoming value with post-loop's exiting block. - PN.addIncoming(VMap[IncomingValue], PostLoop->getExitingBlock()); } } } // Update dominator tree. DT.changeImmediateDominator(PostLoopPreHeader, L.getExitingBlock()); - DT.changeImmediateDominator(PostLoop->getExitBlock(), PostLoopPreHeader); + DT.changeImmediateDominator(PostLoop->getExitBlock(), PostLoop->getExitingBlock()); // Invalidate cached SE information. SE.forgetLoop(&L); Index: llvm/test/Transforms/LoopBoundSplit/bug-loop-bound-split-phi-in-exit-block.ll =================================================================== --- llvm/test/Transforms/LoopBoundSplit/bug-loop-bound-split-phi-in-exit-block.ll +++ llvm/test/Transforms/LoopBoundSplit/bug-loop-bound-split-phi-in-exit-block.ll @@ -26,12 +26,9 @@ ; CHECK: entry.split.split: ; CHECK-NEXT: [[CALL_LCSSA_LCSSA:%.*]] = phi i16 [ [[CALL]], [[COND_END]] ] ; CHECK-NEXT: [[I_LCSSA:%.*]] = phi i16 [ [[ADD]], [[COND_END]] ] -; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i16 [[I_LCSSA]], 11 -; CHECK-NEXT: br i1 [[TMP0]], label [[FOR_BODY_SPLIT_PREHEADER:%.*]], label [[END:%.*]] -; CHECK: for.body.split.preheader: ; CHECK-NEXT: br label [[FOR_BODY_SPLIT:%.*]] ; CHECK: for.body.split: -; CHECK-NEXT: [[I_SPLIT:%.*]] = phi i16 [ [[ADD_SPLIT:%.*]], [[COND_END_SPLIT:%.*]] ], [ [[I_LCSSA]], [[FOR_BODY_SPLIT_PREHEADER]] ] +; CHECK-NEXT: [[I_SPLIT:%.*]] = phi i16 [ [[I_LCSSA]], [[ENTRY_SPLIT_SPLIT]] ], [ [[ADD_SPLIT:%.*]], [[COND_END_SPLIT:%.*]] ] ; CHECK-NEXT: [[CMP1_SPLIT:%.*]] = icmp ult i16 [[I_SPLIT]], 3 ; CHECK-NEXT: br i1 false, label [[COND_TRUE_SPLIT:%.*]], label [[COND_FALSE_SPLIT:%.*]] ; CHECK: cond.false.split: @@ -42,12 +39,9 @@ ; CHECK-NEXT: [[CALL_SPLIT:%.*]] = call i16 @foo() ; CHECK-NEXT: [[ADD_SPLIT]] = add nuw nsw i16 [[I_SPLIT]], 1 ; CHECK-NEXT: [[CMP2_SPLIT:%.*]] = icmp ult i16 [[I_SPLIT]], 11 -; CHECK-NEXT: br i1 [[CMP2_SPLIT]], label [[FOR_BODY_SPLIT]], label [[END_LOOPEXIT:%.*]] -; CHECK: end.loopexit: -; CHECK-NEXT: [[CALL_LCSSA_PH:%.*]] = phi i16 [ [[CALL_SPLIT]], [[COND_END_SPLIT]] ] -; CHECK-NEXT: br label [[END]] +; CHECK-NEXT: br i1 [[CMP2_SPLIT]], label [[FOR_BODY_SPLIT]], label [[END:%.*]] ; CHECK: end: -; CHECK-NEXT: [[CALL_LCSSA:%.*]] = phi i16 [ [[CALL_LCSSA_LCSSA]], [[ENTRY_SPLIT_SPLIT]] ], [ [[CALL_LCSSA_PH]], [[END_LOOPEXIT]] ] +; CHECK-NEXT: [[CALL_LCSSA:%.*]] = phi i16 [ [[CALL_LCSSA_LCSSA]], [[COND_END_SPLIT]] ] ; CHECK-NEXT: ret i16 [[CALL_LCSSA]] ; entry: Index: llvm/test/Transforms/LoopBoundSplit/bug51866.ll =================================================================== --- llvm/test/Transforms/LoopBoundSplit/bug51866.ll +++ llvm/test/Transforms/LoopBoundSplit/bug51866.ll @@ -36,34 +36,29 @@ ; CHECK-NEXT: [[I_1_LCSSA:%.*]] = phi i16 [ [[I_1]], [[FOR_COND]] ] ; CHECK-NEXT: [[I_2_LCSSA:%.*]] = phi i16 [ [[I_2]], [[FOR_COND]] ] ; CHECK-NEXT: [[I_3_LCSSA:%.*]] = phi i16 [ [[I_3]], [[FOR_COND]] ] -; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i16 [[I_0_LCSSA]], 10 -; CHECK-NEXT: br i1 [[TMP1]], label [[FOR_COND_SPLIT_PREHEADER:%.*]], label [[FOR_END:%.*]] -; CHECK: for.cond.split.preheader: ; CHECK-NEXT: br label [[FOR_COND_SPLIT:%.*]] ; CHECK: for.cond.split: -; CHECK-NEXT: [[I_0_SPLIT:%.*]] = phi i16 [ [[INC_0_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[I_0_LCSSA]], [[FOR_COND_SPLIT_PREHEADER]] ] -; CHECK-NEXT: [[I_1_SPLIT:%.*]] = phi i16 [ [[INC_0_SPLIT]], [[FOR_INC_SPLIT]] ], [ [[I_1_LCSSA]], [[FOR_COND_SPLIT_PREHEADER]] ] -; CHECK-NEXT: [[I_2_SPLIT:%.*]] = phi i16 [ [[INC_2_SPLIT:%.*]], [[FOR_INC_SPLIT]] ], [ [[I_2_LCSSA]], [[FOR_COND_SPLIT_PREHEADER]] ] -; CHECK-NEXT: [[I_3_SPLIT:%.*]] = phi i16 [ 30, [[FOR_INC_SPLIT]] ], [ [[I_3_LCSSA]], [[FOR_COND_SPLIT_PREHEADER]] ] +; CHECK-NEXT: [[I_0_SPLIT:%.*]] = phi i16 [ [[I_0_LCSSA]], [[ENTRY_SPLIT_SPLIT]] ], [ [[INC_0_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ] +; CHECK-NEXT: [[I_1_SPLIT:%.*]] = phi i16 [ [[I_1_LCSSA]], [[ENTRY_SPLIT_SPLIT]] ], [ [[INC_0_SPLIT]], [[FOR_INC_SPLIT]] ] +; CHECK-NEXT: [[I_2_SPLIT:%.*]] = phi i16 [ [[I_2_LCSSA]], [[ENTRY_SPLIT_SPLIT]] ], [ [[INC_2_SPLIT:%.*]], [[FOR_INC_SPLIT]] ] +; CHECK-NEXT: [[I_3_SPLIT:%.*]] = phi i16 [ [[I_3_LCSSA]], [[ENTRY_SPLIT_SPLIT]] ], [ 30, [[FOR_INC_SPLIT]] ] ; CHECK-NEXT: [[EXITCOND_NOT_SPLIT:%.*]] = icmp eq i16 [[I_0_SPLIT]], 10 -; CHECK-NEXT: br i1 [[EXITCOND_NOT_SPLIT]], label [[FOR_END_LOOPEXIT:%.*]], label [[FOR_BODY_SPLIT:%.*]] +; CHECK-NEXT: br i1 [[EXITCOND_NOT_SPLIT]], label [[FOR_END:%.*]], label [[FOR_BODY_SPLIT:%.*]] ; CHECK: for.body.split: ; CHECK-NEXT: [[CMP1_SPLIT:%.*]] = icmp ult i16 [[I_0_SPLIT]], 5 ; CHECK-NEXT: [[ARRAYIDX_SPLIT:%.*]] = getelementptr inbounds [10 x i16], ptr @B, i16 0, i16 [[I_0_SPLIT]] -; CHECK-NEXT: [[TMP2:%.*]] = load i16, ptr [[ARRAYIDX_SPLIT]], align 1 +; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr [[ARRAYIDX_SPLIT]], align 1 ; CHECK-NEXT: br i1 false, label [[IF_THEN_SPLIT:%.*]], label [[IF_ELSE_SPLIT:%.*]] ; CHECK: if.else.split: -; CHECK-NEXT: call void @bar(i16 [[TMP2]], i16 [[I_3_SPLIT]]) +; CHECK-NEXT: call void @bar(i16 [[TMP1]], i16 [[I_3_SPLIT]]) ; CHECK-NEXT: br label [[FOR_INC_SPLIT]] ; CHECK: if.then.split: -; CHECK-NEXT: call void @foo(i16 [[TMP2]], i16 [[I_3_SPLIT]]) +; CHECK-NEXT: call void @foo(i16 [[TMP1]], i16 [[I_3_SPLIT]]) ; CHECK-NEXT: br label [[FOR_INC_SPLIT]] ; CHECK: for.inc.split: ; CHECK-NEXT: [[INC_0_SPLIT]] = add nuw nsw i16 [[I_0_SPLIT]], 1 ; CHECK-NEXT: [[INC_2_SPLIT]] = add nuw nsw i16 [[I_2_SPLIT]], 2 ; CHECK-NEXT: br label [[FOR_COND_SPLIT]] -; CHECK: for.end.loopexit: -; CHECK-NEXT: br label [[FOR_END]] ; CHECK: for.end: ; CHECK-NEXT: ret void ; Index: llvm/test/Transforms/LoopBoundSplit/loop-bound-split.ll =================================================================== --- llvm/test/Transforms/LoopBoundSplit/loop-bound-split.ll +++ llvm/test/Transforms/LoopBoundSplit/loop-bound-split.ll @@ -82,12 +82,9 @@ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP_PH_SPLIT_SPLIT:%.*]], label [[LOOP]] ; CHECK: loop.ph.split.split: ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[INC]], [[FOR_INC]] ] -; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i64 [[IV_LCSSA]], [[N]] -; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP_SPLIT_PREHEADER:%.*]], label [[EXIT:%.*]] -; CHECK: loop.split.preheader: ; CHECK-NEXT: br label [[LOOP_SPLIT:%.*]] ; CHECK: loop.split: -; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[IV_LCSSA]], [[LOOP_SPLIT_PREHEADER]] ] +; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[IV_LCSSA]], [[LOOP_PH_SPLIT_SPLIT]] ] ; CHECK-NEXT: [[CMP_SPLIT:%.*]] = icmp ult i64 [[IV_SPLIT]], [[B]] ; CHECK-NEXT: br i1 false, label [[IF_THEN_SPLIT:%.*]], label [[IF_ELSE_SPLIT:%.*]] ; CHECK: if.else.split: @@ -101,9 +98,7 @@ ; CHECK: for.inc.split: ; CHECK-NEXT: [[INC_SPLIT]] = add nuw nsw i64 [[IV_SPLIT]], 1 ; CHECK-NEXT: [[COND_SPLIT:%.*]] = icmp sgt i64 [[INC_SPLIT]], [[N]] -; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT_LOOPEXIT:%.*]], label [[LOOP_SPLIT]] -; CHECK: exit.loopexit: -; CHECK-NEXT: br label [[EXIT]] +; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT:%.*]], label [[LOOP_SPLIT]] ; CHECK: exit: ; CHECK-NEXT: ret void ; @@ -163,12 +158,9 @@ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP_PH_SPLIT_SPLIT:%.*]], label [[LOOP]] ; CHECK: loop.ph.split.split: ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[INC]], [[FOR_INC]] ] -; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i64 [[IV_LCSSA]], [[N]] -; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP_SPLIT_PREHEADER:%.*]], label [[EXIT:%.*]] -; CHECK: loop.split.preheader: ; CHECK-NEXT: br label [[LOOP_SPLIT:%.*]] ; CHECK: loop.split: -; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[IV_LCSSA]], [[LOOP_SPLIT_PREHEADER]] ] +; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[IV_LCSSA]], [[LOOP_PH_SPLIT_SPLIT]] ] ; CHECK-NEXT: [[CMP_SPLIT:%.*]] = icmp ult i64 [[IV_SPLIT]], 10 ; CHECK-NEXT: br i1 false, label [[IF_THEN_SPLIT:%.*]], label [[IF_ELSE_SPLIT:%.*]] ; CHECK: if.else.split: @@ -182,9 +174,7 @@ ; CHECK: for.inc.split: ; CHECK-NEXT: [[INC_SPLIT]] = add nuw nsw i64 [[IV_SPLIT]], 1 ; CHECK-NEXT: [[COND_SPLIT:%.*]] = icmp sgt i64 [[INC_SPLIT]], [[N]] -; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT_LOOPEXIT:%.*]], label [[LOOP_SPLIT]] -; CHECK: exit.loopexit: -; CHECK-NEXT: br label [[EXIT]] +; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT:%.*]], label [[LOOP_SPLIT]] ; CHECK: exit: ; CHECK-NEXT: ret void ; @@ -291,12 +281,9 @@ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP_PH_SPLIT_SPLIT:%.*]], label [[LOOP]] ; CHECK: loop.ph.split.split: ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[INC]], [[FOR_INC]] ] -; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[IV_LCSSA]], [[N]] -; CHECK-NEXT: br i1 [[TMP1]], label [[LOOP_SPLIT_PREHEADER:%.*]], label [[EXIT:%.*]] -; CHECK: loop.split.preheader: ; CHECK-NEXT: br label [[LOOP_SPLIT:%.*]] ; CHECK: loop.split: -; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[IV_LCSSA]], [[LOOP_SPLIT_PREHEADER]] ] +; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[IV_LCSSA]], [[LOOP_PH_SPLIT_SPLIT]] ] ; CHECK-NEXT: [[CMP_SPLIT:%.*]] = icmp ult i64 [[IV_SPLIT]], 10 ; CHECK-NEXT: br i1 false, label [[IF_THEN_SPLIT:%.*]], label [[IF_ELSE_SPLIT:%.*]] ; CHECK: if.else.split: @@ -310,9 +297,7 @@ ; CHECK: for.inc.split: ; CHECK-NEXT: [[INC_SPLIT]] = add nuw nsw i64 [[IV_SPLIT]], 1 ; CHECK-NEXT: [[COND_SPLIT:%.*]] = icmp eq i64 [[INC_SPLIT]], [[N]] -; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT_LOOPEXIT:%.*]], label [[LOOP_SPLIT]] -; CHECK: exit.loopexit: -; CHECK-NEXT: br label [[EXIT]] +; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT:%.*]], label [[LOOP_SPLIT]] ; CHECK: exit: ; CHECK-NEXT: ret void ; @@ -420,12 +405,9 @@ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP_PH_SPLIT_SPLIT:%.*]], label [[LOOP]] ; CHECK: loop.ph.split.split: ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[INC]], [[FOR_INC]] ] -; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[IV_LCSSA]], [[N]] -; CHECK-NEXT: br i1 [[TMP1]], label [[LOOP_SPLIT_PREHEADER:%.*]], label [[EXIT:%.*]] -; CHECK: loop.split.preheader: ; CHECK-NEXT: br label [[LOOP_SPLIT:%.*]] ; CHECK: loop.split: -; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[IV_LCSSA]], [[LOOP_SPLIT_PREHEADER]] ] +; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[IV_LCSSA]], [[LOOP_PH_SPLIT_SPLIT]] ] ; CHECK-NEXT: [[CMP_SPLIT:%.*]] = icmp ult i64 [[IV_SPLIT]], 10 ; CHECK-NEXT: br i1 false, label [[IF_THEN_SPLIT:%.*]], label [[IF_ELSE_SPLIT:%.*]] ; CHECK: if.else.split: @@ -439,9 +421,7 @@ ; CHECK: for.inc.split: ; CHECK-NEXT: [[INC_SPLIT]] = add nuw nsw i64 [[IV_SPLIT]], 1 ; CHECK-NEXT: [[COND_SPLIT:%.*]] = icmp sge i64 [[INC_SPLIT]], [[N]] -; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT_LOOPEXIT:%.*]], label [[LOOP_SPLIT]] -; CHECK: exit.loopexit: -; CHECK-NEXT: br label [[EXIT]] +; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT:%.*]], label [[LOOP_SPLIT]] ; CHECK: exit: ; CHECK-NEXT: ret void ; @@ -549,12 +529,9 @@ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP_PH_SPLIT_SPLIT:%.*]], label [[LOOP]] ; CHECK: loop.ph.split.split: ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[INC]], [[FOR_INC]] ] -; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[IV_LCSSA]], [[N]] -; CHECK-NEXT: br i1 [[TMP1]], label [[LOOP_SPLIT_PREHEADER:%.*]], label [[EXIT:%.*]] -; CHECK: loop.split.preheader: ; CHECK-NEXT: br label [[LOOP_SPLIT:%.*]] ; CHECK: loop.split: -; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[IV_LCSSA]], [[LOOP_SPLIT_PREHEADER]] ] +; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT:%.*]] ], [ [[IV_LCSSA]], [[LOOP_PH_SPLIT_SPLIT]] ] ; CHECK-NEXT: [[CMP_SPLIT:%.*]] = icmp ult i64 [[IV_SPLIT]], 10 ; CHECK-NEXT: br i1 false, label [[IF_THEN_SPLIT:%.*]], label [[IF_ELSE_SPLIT:%.*]] ; CHECK: if.else.split: @@ -568,9 +545,7 @@ ; CHECK: for.inc.split: ; CHECK-NEXT: [[INC_SPLIT]] = add nuw nsw i64 [[IV_SPLIT]], 2 ; CHECK-NEXT: [[COND_SPLIT:%.*]] = icmp sgt i64 [[INC_SPLIT]], [[N]] -; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT_LOOPEXIT:%.*]], label [[LOOP_SPLIT]] -; CHECK: exit.loopexit: -; CHECK-NEXT: br label [[EXIT]] +; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT:%.*]], label [[LOOP_SPLIT]] ; CHECK: exit: ; CHECK-NEXT: ret void ; @@ -900,13 +875,10 @@ ; CHECK: loop.ph.split.split: ; CHECK-NEXT: [[IS_NOT_SCEVABLE_PHI_LCSSA:%.*]] = phi double [ 1.000000e+00, [[FOR_INC]] ] ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[INC]], [[FOR_INC]] ] -; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i64 [[IV_LCSSA]], [[N]] -; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP_SPLIT_PREHEADER:%.*]], label [[EXIT:%.*]] -; CHECK: loop.split.preheader: ; CHECK-NEXT: br label [[LOOP_SPLIT:%.*]] ; CHECK: loop.split: -; CHECK-NEXT: [[IS_NOT_SCEVABLE_PHI_SPLIT:%.*]] = phi double [ 1.000000e+00, [[FOR_INC_SPLIT:%.*]] ], [ [[IS_NOT_SCEVABLE_PHI_LCSSA]], [[LOOP_SPLIT_PREHEADER]] ] -; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT]] ], [ [[IV_LCSSA]], [[LOOP_SPLIT_PREHEADER]] ] +; CHECK-NEXT: [[IS_NOT_SCEVABLE_PHI_SPLIT:%.*]] = phi double [ 1.000000e+00, [[FOR_INC_SPLIT:%.*]] ], [ [[IS_NOT_SCEVABLE_PHI_LCSSA]], [[LOOP_PH_SPLIT_SPLIT]] ] +; CHECK-NEXT: [[IV_SPLIT:%.*]] = phi i64 [ [[INC_SPLIT:%.*]], [[FOR_INC_SPLIT]] ], [ [[IV_LCSSA]], [[LOOP_PH_SPLIT_SPLIT]] ] ; CHECK-NEXT: [[CMP_SPLIT:%.*]] = icmp ult i64 [[IV_SPLIT]], 10 ; CHECK-NEXT: br i1 false, label [[IF_THEN_SPLIT:%.*]], label [[IF_ELSE_SPLIT:%.*]] ; CHECK: if.else.split: @@ -920,9 +892,7 @@ ; CHECK: for.inc.split: ; CHECK-NEXT: [[INC_SPLIT]] = add nuw nsw i64 [[IV_SPLIT]], 1 ; CHECK-NEXT: [[COND_SPLIT:%.*]] = icmp sgt i64 [[INC_SPLIT]], [[N]] -; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT_LOOPEXIT:%.*]], label [[LOOP_SPLIT]] -; CHECK: exit.loopexit: -; CHECK-NEXT: br label [[EXIT]] +; CHECK-NEXT: br i1 [[COND_SPLIT]], label [[EXIT:%.*]], label [[LOOP_SPLIT]] ; CHECK: exit: ; CHECK-NEXT: ret void ;