<div dir="ltr">Please include some details in the commit message about why a patch is being reverted (helps folks know if the revert will address any issues they're seeing and any future work can learn from previous issues)</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 28, 2021 at 10:26 AM Stefan Pintilie via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Stefan Pintilie<br>
Date: 2021-05-28T12:21:22-05:00<br>
New Revision: 0159652058ca555b05db6a209fe9cf660c3bf8e6<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/0159652058ca555b05db6a209fe9cf660c3bf8e6" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/0159652058ca555b05db6a209fe9cf660c3bf8e6</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/0159652058ca555b05db6a209fe9cf660c3bf8e6.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/0159652058ca555b05db6a209fe9cf660c3bf8e6.diff</a><br>
<br>
LOG: Revert "Return "[LoopDeletion] Break backedge if we can prove that the loop is exited on 1st iteration" (try 2)"<br>
<br>
This reverts commit be1a23203b1de655b8c7dac7549818d975a0cbbf.<br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
llvm/lib/Transforms/Scalar/LoopDeletion.cpp<br>
llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll<br>
llvm/test/Transforms/LoopDeletion/zero-btc.ll<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff --git a/llvm/lib/Transforms/Scalar/LoopDeletion.cpp b/llvm/lib/Transforms/Scalar/LoopDeletion.cpp<br>
index 41be776ec141..fd0e983b6199 100644<br>
--- a/llvm/lib/Transforms/Scalar/LoopDeletion.cpp<br>
+++ b/llvm/lib/Transforms/Scalar/LoopDeletion.cpp<br>
@@ -17,7 +17,6 @@<br>
#include "llvm/ADT/SmallVector.h"<br>
#include "llvm/ADT/Statistic.h"<br>
#include "llvm/Analysis/GlobalsModRef.h"<br>
-#include "llvm/Analysis/LoopIterator.h"<br>
#include "llvm/Analysis/LoopPass.h"<br>
#include "llvm/Analysis/MemorySSA.h"<br>
#include "llvm/Analysis/OptimizationRemarkEmitter.h"<br>
@@ -136,168 +135,6 @@ static bool isLoopNeverExecuted(Loop *L) {<br>
return true;<br>
}<br>
<br>
-static const SCEV *<br>
-getSCEVOnFirstIteration(Value *V, Loop *L, ScalarEvolution &SE,<br>
- DenseMap<Value *, const SCEV *> &FirstIterSCEV) {<br>
- // Fist, check in cache.<br>
- auto Existing = FirstIterSCEV.find(V);<br>
- if (Existing != FirstIterSCEV.end())<br>
- return Existing->second;<br>
- const SCEV *S = nullptr;<br>
- // TODO: Once ScalarEvolution supports getValueOnNthIteration for anything<br>
- // else but AddRecs, it's a good use case for it. So far, just consider some<br>
- // simple cases, like arithmetic operations.<br>
- Value *LHS, *RHS;<br>
- using namespace PatternMatch;<br>
- if (match(V, m_Add(m_Value(LHS), m_Value(RHS)))) {<br>
- const SCEV *LHSS = getSCEVOnFirstIteration(LHS, L, SE, FirstIterSCEV);<br>
- const SCEV *RHSS = getSCEVOnFirstIteration(RHS, L, SE, FirstIterSCEV);<br>
- S = SE.getAddExpr(LHSS, RHSS);<br>
- } else if (match(V, m_Sub(m_Value(LHS), m_Value(RHS)))) {<br>
- const SCEV *LHSS = getSCEVOnFirstIteration(LHS, L, SE, FirstIterSCEV);<br>
- const SCEV *RHSS = getSCEVOnFirstIteration(RHS, L, SE, FirstIterSCEV);<br>
- S = SE.getMinusSCEV(LHSS, RHSS);<br>
- } else if (match(V, m_Mul(m_Value(LHS), m_Value(RHS)))) {<br>
- const SCEV *LHSS = getSCEVOnFirstIteration(LHS, L, SE, FirstIterSCEV);<br>
- const SCEV *RHSS = getSCEVOnFirstIteration(RHS, L, SE, FirstIterSCEV);<br>
- S = SE.getMulExpr(LHSS, RHSS);<br>
- } else<br>
- S = SE.getSCEV(V);<br>
- assert(S && "Case not handled?");<br>
- FirstIterSCEV[V] = S;<br>
- return S;<br>
-}<br>
-<br>
-// Try to prove that one of conditions that dominates the latch must exit on 1st<br>
-// iteration.<br>
-static bool canProveExitOnFirstIteration(Loop *L, DominatorTree &DT,<br>
- ScalarEvolution &SE, LoopInfo &LI) {<br>
- BasicBlock *Latch = L->getLoopLatch();<br>
-<br>
- if (!Latch)<br>
- return false;<br>
-<br>
- LoopBlocksRPO RPOT(L);<br>
- RPOT.perform(&LI);<br>
-<br>
- BasicBlock *Header = L->getHeader();<br>
- // Blocks that are reachable on the 1st iteration.<br>
- SmallPtrSet<BasicBlock *, 4> LiveBlocks;<br>
- // Edges that are reachable on the 1st iteration.<br>
- DenseSet<BasicBlockEdge> LiveEdges;<br>
- LiveBlocks.insert(L->getHeader());<br>
-<br>
- auto MarkLiveEdge = [&](BasicBlock *From, BasicBlock *To) {<br>
- assert(LiveBlocks.count(From) && "Must be live!");<br>
- LiveBlocks.insert(To);<br>
- LiveEdges.insert({ From, To });<br>
- };<br>
-<br>
- auto MarkAllSuccessorsLive = [&](BasicBlock *BB) {<br>
- for (auto *Succ : successors(BB))<br>
- MarkLiveEdge(BB, Succ);<br>
- };<br>
-<br>
- // Check if there is only one predecessor on 1st iteration. Note that because<br>
- // we iterate in RPOT, we have already visited all its (non-latch)<br>
- // predecessors.<br>
- auto GetSolePredecessorOnFirstIteration = [&](BasicBlock * BB)->BasicBlock * {<br>
- if (BB == Header)<br>
- return L->getLoopPredecessor();<br>
- BasicBlock *OnlyPred = nullptr;<br>
- for (auto *Pred : predecessors(BB))<br>
- if (OnlyPred != Pred && LiveEdges.count({ Pred, BB })) {<br>
- // 2 live preds.<br>
- if (OnlyPred)<br>
- return nullptr;<br>
- OnlyPred = Pred;<br>
- }<br>
-<br>
- assert(OnlyPred && "No live predecessors?");<br>
- return OnlyPred;<br>
- };<br>
- DenseMap<Value *, const SCEV *> FirstIterSCEV;<br>
- SmallPtrSet<BasicBlock *, 4> Visited;<br>
-<br>
- // Use the following algorithm to prove we never take the latch on the 1st<br>
- // iteration:<br>
- // 1. Traverse in topological order, so that whenever we visit a block, all<br>
- // its predecessors are already visited.<br>
- // 2. If we can prove that the block may have only 1 predecessor on the 1st<br>
- // iteration, map all its phis onto input from this predecessor.<br>
- // 3a. If we can prove which successor of out block is taken on the 1st<br>
- // iteration, mark this successor live.<br>
- // 3b. If we cannot prove it, conservatively assume that all successors are<br>
- // live.<br>
- for (auto *BB : RPOT) {<br>
- Visited.insert(BB);<br>
-<br>
- // This block is not reachable on the 1st iterations.<br>
- if (!LiveBlocks.count(BB))<br>
- continue;<br>
-<br>
- // Skip inner loops.<br>
- if (LI.getLoopFor(BB) != L) {<br>
- MarkAllSuccessorsLive(BB);<br>
- continue;<br>
- }<br>
-<br>
- // If RPOT exists, we should never visit a block before all of its<br>
- // predecessors are visited. The only situation when this can be broken is<br>
- // irreducible CFG. Do not deal with such cases.<br>
- if (BB != Header)<br>
- for (auto *Pred : predecessors(BB))<br>
- if (!Visited.count(Pred))<br>
- return false;<br>
-<br>
- // If this block has only one live pred, map its phis onto their SCEVs.<br>
- if (auto *OnlyPred = GetSolePredecessorOnFirstIteration(BB))<br>
- for (auto &PN : BB->phis()) {<br>
- if (!SE.isSCEVable(PN.getType()))<br>
- continue;<br>
- auto *Incoming = PN.getIncomingValueForBlock(OnlyPred);<br>
- if (DT.dominates(Incoming, BB->getTerminator())) {<br>
- const SCEV *IncSCEV =<br>
- getSCEVOnFirstIteration(Incoming, L, SE, FirstIterSCEV);<br>
- FirstIterSCEV[&PN] = IncSCEV;<br>
- }<br>
- }<br>
-<br>
- using namespace PatternMatch;<br>
- ICmpInst::Predicate Pred;<br>
- Value *LHS, *RHS;<br>
- const BasicBlock *IfTrue, *IfFalse;<br>
- // TODO: Handle switches.<br>
- if (!match(BB->getTerminator(),<br>
- m_Br(m_ICmp(Pred, m_Value(LHS), m_Value(RHS)),<br>
- m_BasicBlock(IfTrue), m_BasicBlock(IfFalse)))) {<br>
- MarkAllSuccessorsLive(BB);<br>
- continue;<br>
- }<br>
-<br>
- if (!SE.isSCEVable(LHS->getType())) {<br>
- MarkAllSuccessorsLive(BB);<br>
- continue;<br>
- }<br>
-<br>
- // Can we prove constant true or false for this condition?<br>
- const SCEV *LHSS = getSCEVOnFirstIteration(LHS, L, SE, FirstIterSCEV);<br>
- const SCEV *RHSS = getSCEVOnFirstIteration(RHS, L, SE, FirstIterSCEV);<br>
- // TODO: isKnownPredicateAt is more powerful, but it's too compile time<br>
- // consuming. So we avoid using it here.<br>
- if (SE.isKnownPredicate(Pred, LHSS, RHSS))<br>
- MarkLiveEdge(BB, BB->getTerminator()->getSuccessor(0));<br>
- else if (SE.isKnownPredicate(ICmpInst::getInversePredicate(Pred), LHSS,<br>
- RHSS))<br>
- MarkLiveEdge(BB, BB->getTerminator()->getSuccessor(1));<br>
- else<br>
- MarkAllSuccessorsLive(BB);<br>
- }<br>
-<br>
- // We can break the latch if it wasn't live.<br>
- return !LiveEdges.count({ Latch, Header });<br>
-}<br>
-<br>
/// If we can prove the backedge is untaken, remove it. This destroys the<br>
/// loop, but leaves the (now trivially loop invariant) control flow and<br>
/// side effects (if any) in place.<br>
@@ -311,7 +148,7 @@ breakBackedgeIfNotTaken(Loop *L, DominatorTree &DT, ScalarEvolution &SE,<br>
return LoopDeletionResult::Unmodified;<br>
<br>
auto *BTC = SE.getBackedgeTakenCount(L);<br>
- if (!BTC->isZero() && !canProveExitOnFirstIteration(L, DT, SE, LI))<br>
+ if (!BTC->isZero())<br>
return LoopDeletionResult::Unmodified;<br>
<br>
breakLoopBackedge(L, DT, SE, LI, MSSA);<br>
<br>
diff --git a/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll b/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll<br>
index bed479e408eb..98dafebe0df0 100644<br>
--- a/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll<br>
+++ b/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll<br>
@@ -344,19 +344,17 @@ define i32 @test_ne_const() {<br>
; CHECK-NEXT: entry:<br>
; CHECK-NEXT: br label [[LOOP:%.*]]<br>
; CHECK: loop:<br>
-; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]<br>
; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]<br>
; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0<br>
-; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]]<br>
+; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]]<br>
; CHECK: if.false:<br>
; CHECK-NEXT: br label [[BACKEDGE]]<br>
; CHECK: backedge:<br>
; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ]<br>
-; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4<br>
-; CHECK-NEXT: br i1 [[LOOP_COND]], label [[BACKEDGE_LOOP_CRIT_EDGE:%.*]], label [[DONE:%.*]]<br>
-; CHECK: backedge.loop_crit_edge:<br>
-; CHECK-NEXT: unreachable<br>
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]<br>
; CHECK: done:<br>
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]<br>
; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]<br>
@@ -396,19 +394,17 @@ define i32 @test_slt_const() {<br>
; CHECK-NEXT: entry:<br>
; CHECK-NEXT: br label [[LOOP:%.*]]<br>
; CHECK: loop:<br>
-; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]<br>
; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]<br>
; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0<br>
-; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]]<br>
+; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]]<br>
; CHECK: if.false:<br>
; CHECK-NEXT: br label [[BACKEDGE]]<br>
; CHECK: backedge:<br>
; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ]<br>
-; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[SUM_NEXT]], 4<br>
-; CHECK-NEXT: br i1 [[LOOP_COND]], label [[BACKEDGE_LOOP_CRIT_EDGE:%.*]], label [[DONE:%.*]]<br>
-; CHECK: backedge.loop_crit_edge:<br>
-; CHECK-NEXT: unreachable<br>
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]<br>
; CHECK: done:<br>
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]<br>
; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]<br>
@@ -448,19 +444,17 @@ define i32 @test_ult_const() {<br>
; CHECK-NEXT: entry:<br>
; CHECK-NEXT: br label [[LOOP:%.*]]<br>
; CHECK: loop:<br>
-; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]<br>
; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]<br>
; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0<br>
-; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]]<br>
+; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]]<br>
; CHECK: if.false:<br>
; CHECK-NEXT: br label [[BACKEDGE]]<br>
; CHECK: backedge:<br>
; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ]<br>
-; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ult i32 [[SUM_NEXT]], 4<br>
-; CHECK-NEXT: br i1 [[LOOP_COND]], label [[BACKEDGE_LOOP_CRIT_EDGE:%.*]], label [[DONE:%.*]]<br>
-; CHECK: backedge.loop_crit_edge:<br>
-; CHECK-NEXT: unreachable<br>
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]<br>
; CHECK: done:<br>
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]<br>
; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]<br>
@@ -500,19 +494,17 @@ define i32 @test_sgt_const() {<br>
; CHECK-NEXT: entry:<br>
; CHECK-NEXT: br label [[LOOP:%.*]]<br>
; CHECK: loop:<br>
-; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]<br>
; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]<br>
; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0<br>
-; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]]<br>
+; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]]<br>
; CHECK: if.false:<br>
; CHECK-NEXT: br label [[BACKEDGE]]<br>
; CHECK: backedge:<br>
; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ]<br>
-; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp sgt i32 [[SUM_NEXT]], 4<br>
-; CHECK-NEXT: br i1 [[LOOP_COND]], label [[BACKEDGE_LOOP_CRIT_EDGE:%.*]], label [[DONE:%.*]]<br>
-; CHECK: backedge.loop_crit_edge:<br>
-; CHECK-NEXT: unreachable<br>
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]<br>
; CHECK: done:<br>
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]<br>
; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]<br>
@@ -552,19 +544,17 @@ define i32 @test_ugt_const() {<br>
; CHECK-NEXT: entry:<br>
; CHECK-NEXT: br label [[LOOP:%.*]]<br>
; CHECK: loop:<br>
-; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]<br>
; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]<br>
; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0<br>
-; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]]<br>
+; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]]<br>
; CHECK: if.false:<br>
; CHECK-NEXT: br label [[BACKEDGE]]<br>
; CHECK: backedge:<br>
; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ]<br>
-; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ugt i32 [[SUM_NEXT]], 4<br>
-; CHECK-NEXT: br i1 [[LOOP_COND]], label [[BACKEDGE_LOOP_CRIT_EDGE:%.*]], label [[DONE:%.*]]<br>
-; CHECK: backedge.loop_crit_edge:<br>
-; CHECK-NEXT: unreachable<br>
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]<br>
; CHECK: done:<br>
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]<br>
; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]<br>
@@ -604,24 +594,22 @@ define i32 @test_multiple_pred_const() {<br>
; CHECK-NEXT: entry:<br>
; CHECK-NEXT: br label [[LOOP:%.*]]<br>
; CHECK: loop:<br>
-; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]<br>
; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]<br>
; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0<br>
; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
; CHECK: if.true:<br>
; CHECK-NEXT: switch i32 4, label [[FAILURE:%.*]] [<br>
-; CHECK-NEXT: i32 100, label [[BACKEDGE:%.*]]<br>
+; CHECK-NEXT: i32 100, label [[BACKEDGE]]<br>
; CHECK-NEXT: i32 200, label [[BACKEDGE]]<br>
; CHECK-NEXT: ]<br>
; CHECK: if.false:<br>
; CHECK-NEXT: br label [[BACKEDGE]]<br>
; CHECK: backedge:<br>
; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[IF_TRUE]] ], [ [[SUB]], [[IF_TRUE]] ]<br>
-; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
+; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]<br>
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4<br>
-; CHECK-NEXT: br i1 [[LOOP_COND]], label [[BACKEDGE_LOOP_CRIT_EDGE:%.*]], label [[DONE:%.*]]<br>
-; CHECK: backedge.loop_crit_edge:<br>
-; CHECK-NEXT: unreachable<br>
+; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]<br>
; CHECK: done:<br>
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]<br>
; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]<br>
<br>
diff --git a/llvm/test/Transforms/LoopDeletion/zero-btc.ll b/llvm/test/Transforms/LoopDeletion/zero-btc.ll<br>
index 958de0505af7..413b0a877dd4 100644<br>
--- a/llvm/test/Transforms/LoopDeletion/zero-btc.ll<br>
+++ b/llvm/test/Transforms/LoopDeletion/zero-btc.ll<br>
@@ -161,16 +161,14 @@ define void @test_multi_exit3(i1 %cond1) {<br>
; CHECK-NEXT: entry:<br>
; CHECK-NEXT: br label [[LOOP:%.*]]<br>
; CHECK: loop:<br>
-; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_INC:%.*]], [[LATCH:%.*]] ]<br>
; CHECK-NEXT: store i32 0, i32* @G, align 4<br>
-; CHECK-NEXT: br i1 [[COND1:%.*]], label [[LATCH:%.*]], label [[EXIT:%.*]]<br>
+; CHECK-NEXT: br i1 [[COND1:%.*]], label [[LATCH]], label [[EXIT:%.*]]<br>
; CHECK: latch:<br>
; CHECK-NEXT: store i32 1, i32* @G, align 4<br>
-; CHECK-NEXT: [[IV_INC:%.*]] = add i32 [[IV]], 1<br>
+; CHECK-NEXT: [[IV_INC]] = add i32 [[IV]], 1<br>
; CHECK-NEXT: [[BE_TAKEN:%.*]] = icmp ne i32 [[IV_INC]], 1<br>
-; CHECK-NEXT: br i1 [[BE_TAKEN]], label [[LATCH_LOOP_CRIT_EDGE:%.*]], label [[EXIT]]<br>
-; CHECK: latch.loop_crit_edge:<br>
-; CHECK-NEXT: unreachable<br>
+; CHECK-NEXT: br i1 [[BE_TAKEN]], label [[LOOP]], label [[EXIT]]<br>
; CHECK: exit:<br>
; CHECK-NEXT: ret void<br>
;<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>