<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>