Skip to content

Commit

Permalink
LoopPass: Simplify the API for adding a new loop. NFC
Browse files Browse the repository at this point in the history
The insertLoop() API is only used to add new loops, and has confusing
ownership semantics. Simplify it by replacing it with addLoop().

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251064 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
bogner committed Oct 22, 2015
1 parent f4a0ff0 commit ca9d3aa
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 38 deletions.
9 changes: 3 additions & 6 deletions include/llvm/Analysis/LoopPass.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,12 +130,9 @@ class LPPassManager : public FunctionPass, public PMDataManager {
// Delete loop from the loop queue and loop nest (LoopInfo).
void deleteLoopFromQueue(Loop *L);

// Insert loop into the loop queue and add it as a child of the
// given parent.
void insertLoop(Loop *L, Loop *ParentLoop);

// Insert a loop into the loop queue.
void insertLoopIntoQueue(Loop *L);
// Add a new loop into the loop queue as a child of the given parent, or at
// the top level if \c ParentLoop is null.
Loop &addLoop(Loop *ParentLoop);

// Reoptimize this loop. LPPassManager will re-insert this loop into the
// queue. This allows LoopPass to change loop nest for the loop. This
Expand Down
45 changes: 18 additions & 27 deletions lib/Analysis/LoopPass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,38 +101,29 @@ void LPPassManager::deleteLoopFromQueue(Loop *L) {
}

// Inset loop into loop nest (LoopInfo) and loop queue (LQ).
void LPPassManager::insertLoop(Loop *L, Loop *ParentLoop) {
Loop &LPPassManager::addLoop(Loop *ParentLoop) {
// Create a new loop. LI will take ownership.
Loop *L = new Loop();

assert (CurrentLoop != L && "Cannot insert CurrentLoop");

// Insert into loop nest
if (ParentLoop)
ParentLoop->addChildLoop(L);
else
// Insert into the loop nest and the loop queue.
if (!ParentLoop) {
// This is the top level loop.
LI->addTopLevelLoop(L);

insertLoopIntoQueue(L);
}

void LPPassManager::insertLoopIntoQueue(Loop *L) {
// Insert L into loop queue
if (L == CurrentLoop)
redoLoop(L);
else if (!L->getParentLoop())
// This is top level loop.
LQ.push_front(L);
else {
// Insert L after the parent loop.
for (std::deque<Loop *>::iterator I = LQ.begin(),
E = LQ.end(); I != E; ++I) {
if (*I == L->getParentLoop()) {
// deque does not support insert after.
++I;
LQ.insert(I, 1, L);
break;
}
return *L;
}

ParentLoop->addChildLoop(L);
// Insert L into the loop queue after the parent loop.
for (auto I = LQ.begin(), E = LQ.end(); I != E; ++I) {
if (*I == L->getParentLoop()) {
// deque does not support insert after.
++I;
LQ.insert(I, 1, L);
break;
}
}
return *L;
}

// Reoptimize this loop. LPPassManager will re-insert this loop into the
Expand Down
9 changes: 4 additions & 5 deletions lib/Transforms/Scalar/LoopUnswitch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -670,20 +670,19 @@ bool LoopUnswitch::UnswitchIfProfitable(Value *LoopCond, Constant *Val,
/// mapping the blocks with the specified map.
static Loop *CloneLoop(Loop *L, Loop *PL, ValueToValueMapTy &VM,
LoopInfo *LI, LPPassManager *LPM) {
Loop *New = new Loop();
LPM->insertLoop(New, PL);
Loop &New = LPM->addLoop(PL);

// Add all of the blocks in L to the new loop.
for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
I != E; ++I)
if (LI->getLoopFor(*I) == L)
New->addBasicBlockToLoop(cast<BasicBlock>(VM[*I]), *LI);
New.addBasicBlockToLoop(cast<BasicBlock>(VM[*I]), *LI);

// Add all of the subloops to the new loop.
for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
CloneLoop(*I, New, VM, LI, LPM);
CloneLoop(*I, &New, VM, LI, LPM);

return New;
return &New;
}

static void copyMetadata(Instruction *DstInst, const Instruction *SrcInst,
Expand Down

0 comments on commit ca9d3aa

Please sign in to comment.