From 8ded5852fe0dd317d9903809b49060248003d365 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Fri, 23 Feb 2007 00:16:44 +0000 Subject: [PATCH] Add facility that allows LoopPass to re-insert a loop into Loop Pass Manager's queue. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34509 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/LoopPass.h | 7 ++++++- lib/Analysis/LoopPass.cpp | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/include/llvm/Analysis/LoopPass.h b/include/llvm/Analysis/LoopPass.h index 046da6f13d8..b3d4c6e8972 100644 --- a/include/llvm/Analysis/LoopPass.h +++ b/include/llvm/Analysis/LoopPass.h @@ -85,10 +85,15 @@ public: // Delete loop from the loop queue. This is used by Loop pass to inform // Loop Pass Manager that it should skip rest of the passes for this loop. void deleteLoopFromQueue(Loop *L); + + // Reoptimize this loop. LPPassManager will re-insert this loop into the + // queue. This allows LoopPass to change loop nest for the loop. This + // utility may send LPPassManager into infinite loops so use caution. + void redoLoop(Loop *L); private: LoopQueue *LQ; bool skipThisLoop; - + bool redoThisLoop; }; } // End llvm namespace diff --git a/lib/Analysis/LoopPass.cpp b/lib/Analysis/LoopPass.cpp index 22d542b05ba..dc5c5683fb2 100644 --- a/lib/Analysis/LoopPass.cpp +++ b/lib/Analysis/LoopPass.cpp @@ -50,6 +50,8 @@ private: /// LPPassManager manages FPPassManagers and CalLGraphSCCPasses. LPPassManager::LPPassManager(int Depth) : PMDataManager(Depth) { + skipThisLoop = false; + redoThisLoop = false; LQ = new LoopQueue(); } @@ -64,6 +66,13 @@ void LPPassManager::deleteLoopFromQueue(Loop *L) { skipThisLoop = true; } +// Reoptimize this loop. LPPassManager will re-insert this loop into the +// queue. This allows LoopPass to change loop nest for the loop. This +// utility may send LPPassManager into infinite loops so use caution. +void LPPassManager::redoLoop(Loop *L) { + redoThisLoop = true; +} + // Recurse through all subloops and all loops into LQ. static void addLoopIntoQueue(Loop *L, LoopQueue *LQ) { for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I) @@ -89,6 +98,7 @@ bool LPPassManager::runOnFunction(Function &F) { Loop *L = LQ->top(); skipThisLoop = false; + redoThisLoop = false; // Run all passes on current SCC for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { @@ -124,6 +134,9 @@ bool LPPassManager::runOnFunction(Function &F) { // Pop the loop from queue after running all passes. LQ->pop(); + + if (redoThisLoop) + LQ->push(L); } return Changed; -- 2.11.0