Skip to content

Commit fdea2e4

Browse files
committed
[loop-unroll] Factor out code to update LoopInfo (NFC).
Move the code to update LoopInfo for cloned basic blocks to addClonedBlockToLoopInfo, as suggested in https://reviews.llvm.org/D28482. llvm-svn: 291614
1 parent 443423e commit fdea2e4

File tree

2 files changed

+39
-17
lines changed

2 files changed

+39
-17
lines changed

llvm/include/llvm/Transforms/Utils/UnrollLoop.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ class Pass;
3333
class OptimizationRemarkEmitter;
3434
class ScalarEvolution;
3535

36+
typedef SmallDenseMap<const Loop *, Loop *, 4> NewLoopsMap;
37+
38+
const Loop* addClonedBlockToLoopInfo(BasicBlock *OriginalBB,
39+
BasicBlock *ClonedBB, LoopInfo *LI,
40+
NewLoopsMap &NewLoops);
41+
3642
bool UnrollLoop(Loop *L, unsigned Count, unsigned TripCount, bool Force,
3743
bool AllowRuntime, bool AllowExpensiveTripCount,
3844
bool PreserveCondBr, bool PreserveOnlyFirst,

llvm/lib/Transforms/Utils/LoopUnroll.cpp

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,36 @@ static bool needToInsertPhisForLCSSA(Loop *L, std::vector<BasicBlock *> Blocks,
172172
return false;
173173
}
174174

175+
/// Adds ClonedBB to LoopInfo, creates a new loop for ClonedBB if necessary
176+
/// and adds a mapping from the original loop to the new loop to NewLoops.
177+
/// Returns nullptr if no new loop was created and a pointer to the
178+
/// original loop OriginalBB was part of otherwise.
179+
const Loop* llvm::addClonedBlockToLoopInfo(BasicBlock *OriginalBB,
180+
BasicBlock *ClonedBB, LoopInfo *LI,
181+
NewLoopsMap &NewLoops) {
182+
// Figure out which loop New is in.
183+
const Loop *OldLoop = LI->getLoopFor(OriginalBB);
184+
assert(OldLoop && "Should (at least) be in the loop being unrolled!");
185+
186+
Loop *&NewLoop = NewLoops[OldLoop];
187+
if (!NewLoop) {
188+
// Found a new sub-loop.
189+
assert(OriginalBB == OldLoop->getHeader() &&
190+
"Header should be first in RPO");
191+
192+
Loop *NewLoopParent = NewLoops.lookup(OldLoop->getParentLoop());
193+
assert(NewLoopParent &&
194+
"Expected parent loop before sub-loop in RPO");
195+
NewLoop = new Loop;
196+
NewLoopParent->addChildLoop(NewLoop);
197+
NewLoop->addBasicBlockToLoop(ClonedBB, *LI);
198+
return OldLoop;
199+
} else {
200+
NewLoop->addBasicBlockToLoop(ClonedBB, *LI);
201+
return nullptr;
202+
}
203+
}
204+
175205
/// Unroll the given loop by Count. The loop must be in LCSSA form. Returns true
176206
/// if unrolling was successful, or false if the loop was unmodified. Unrolling
177207
/// can only fail when the loop's latch block is not terminated by a conditional
@@ -428,28 +458,14 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount, bool Force,
428458
assert(LI->getLoopFor(*BB) == L && "Header should not be in a sub-loop");
429459
L->addBasicBlockToLoop(New, *LI);
430460
} else {
431-
// Figure out which loop New is in.
432-
const Loop *OldLoop = LI->getLoopFor(*BB);
433-
assert(OldLoop && "Should (at least) be in the loop being unrolled!");
434-
435-
Loop *&NewLoop = NewLoops[OldLoop];
436-
if (!NewLoop) {
437-
// Found a new sub-loop.
438-
assert(*BB == OldLoop->getHeader() &&
439-
"Header should be first in RPO");
440-
441-
Loop *NewLoopParent = NewLoops.lookup(OldLoop->getParentLoop());
442-
assert(NewLoopParent &&
443-
"Expected parent loop before sub-loop in RPO");
444-
NewLoop = new Loop;
445-
NewLoopParent->addChildLoop(NewLoop);
446-
LoopsToSimplify.insert(NewLoop);
461+
const Loop *OldLoop = addClonedBlockToLoopInfo(*BB, New, LI, NewLoops);
462+
if (OldLoop) {
463+
LoopsToSimplify.insert(NewLoops[OldLoop]);
447464

448465
// Forget the old loop, since its inputs may have changed.
449466
if (SE)
450467
SE->forgetLoop(OldLoop);
451468
}
452-
NewLoop->addBasicBlockToLoop(New, *LI);
453469
}
454470

455471
if (*BB == Header)

0 commit comments

Comments
 (0)