OSDN Git Service

[NFC] Factor out a function for future reuse
authorMax Kazantsev <max.kazantsev@azul.com>
Sun, 17 Feb 2019 15:04:09 +0000 (15:04 +0000)
committerMax Kazantsev <max.kazantsev@azul.com>
Sun, 17 Feb 2019 15:04:09 +0000 (15:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354218 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopSimplifyCFG.cpp

index 0db5d9e..124c55e 100644 (file)
@@ -90,6 +90,20 @@ static void removeBlockFromLoops(BasicBlock *BB, Loop *FirstLoop,
     Current->removeBlockFromLoop(BB);
 }
 
+/// Find innermost loop that is reachable from \p BBs and contains loop \p L.
+static Loop *getInnermostSuccessorLoop(SmallPtrSetImpl<BasicBlock *> &BBs,
+                                       Loop &L, LoopInfo &LI) {
+  Loop *StillReachable = nullptr;
+  for (BasicBlock *BB : BBs) {
+    Loop *BBL = LI.getLoopFor(BB);
+    if (BBL && BBL->contains(L.getHeader()))
+      if (!StillReachable ||
+          BBL->getLoopDepth() > StillReachable->getLoopDepth())
+        StillReachable = BBL;
+  }
+  return StillReachable;
+}
+
 namespace {
 /// Helper class that can turn branches and switches with constant conditions
 /// into unconditional branches.
@@ -369,14 +383,7 @@ private:
       // the current loop. We need to fix loop info accordingly. For this, we
       // find the most nested loop that still contains L and remove L from all
       // loops that are inside of it.
-      Loop *StillReachable = nullptr;
-      for (BasicBlock *BB : LiveExitBlocks) {
-        Loop *BBL = LI.getLoopFor(BB);
-        if (BBL && BBL->contains(L.getHeader()))
-          if (!StillReachable ||
-              BBL->getLoopDepth() > StillReachable->getLoopDepth())
-            StillReachable = BBL;
-      }
+      Loop *StillReachable = getInnermostSuccessorLoop(LiveExitBlocks, L, LI);
 
       // Okay, our loop is no longer in the outer loop (and maybe not in some of
       // its parents as well). Make the fixup.