From 45cd157a1e7687d90374a66339c1b076c678d0ac Mon Sep 17 00:00:00 2001 From: Max Kazantsev Date: Fri, 15 Feb 2019 12:18:10 +0000 Subject: [PATCH] [NFCI] Factor out block removal from stack of nested loops git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354124 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopSimplifyCFG.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/lib/Transforms/Scalar/LoopSimplifyCFG.cpp index c623f94d0de..0db5d9e772d 100644 --- a/lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ b/lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -79,6 +79,17 @@ static BasicBlock *getOnlyLiveSuccessor(BasicBlock *BB) { return nullptr; } +/// Removes \p BB from all loops from [FirstLoop, LastLoop) in parent chain. +static void removeBlockFromLoops(BasicBlock *BB, Loop *FirstLoop, + Loop *LastLoop = nullptr) { + assert((!LastLoop || LastLoop->contains(FirstLoop->getHeader())) && + "First loop is supposed to be inside of last loop!"); + assert(FirstLoop->contains(BB) && "Must be a loop block!"); + for (Loop *Current = FirstLoop; Current != LastLoop; + Current = Current->getParentLoop()) + Current->removeBlockFromLoop(BB); +} + namespace { /// Helper class that can turn branches and switches with constant conditions /// into unconditional branches. @@ -371,12 +382,9 @@ private: // its parents as well). Make the fixup. if (StillReachable != OuterLoop) { LI.changeLoopFor(NewPreheader, StillReachable); - for (Loop *NotContaining = OuterLoop; NotContaining != StillReachable; - NotContaining = NotContaining->getParentLoop()) { - NotContaining->removeBlockFromLoop(NewPreheader); - for (auto *BB : L.blocks()) - NotContaining->removeBlockFromLoop(BB); - } + removeBlockFromLoops(NewPreheader, OuterLoop, StillReachable); + for (auto *BB : L.blocks()) + removeBlockFromLoops(BB, OuterLoop, StillReachable); OuterLoop->removeChildLoop(&L); if (StillReachable) StillReachable->addChildLoop(&L); -- 2.11.0