mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-23 04:28:30 +00:00
Add a DominatorTree argument to isLCSSA so that it doesn't have to
compute a set of reachable blocks for itself each time it is called, which is fairly frequently. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98179 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0891d752a6
commit
bbf81d8811
@ -571,7 +571,7 @@ public:
|
||||
unsigned getSmallConstantTripMultiple() const;
|
||||
|
||||
/// isLCSSAForm - Return true if the Loop is in LCSSA form
|
||||
bool isLCSSAForm() const;
|
||||
bool isLCSSAForm(DominatorTree &DT) const;
|
||||
|
||||
/// isLoopSimplifyForm - Return true if the Loop is in the form that
|
||||
/// the LoopSimplify form transforms loops to, which is sometimes called
|
||||
|
@ -263,14 +263,7 @@ unsigned Loop::getSmallConstantTripMultiple() const {
|
||||
}
|
||||
|
||||
/// isLCSSAForm - Return true if the Loop is in LCSSA form
|
||||
bool Loop::isLCSSAForm() const {
|
||||
// Collect all the reachable blocks in the function, for fast lookups.
|
||||
SmallPtrSet<BasicBlock *, 32> ReachableBBs;
|
||||
BasicBlock *EntryBB = getHeader()->getParent()->begin();
|
||||
for (df_iterator<BasicBlock *> NI = df_begin(EntryBB),
|
||||
NE = df_end(EntryBB); NI != NE; ++NI)
|
||||
ReachableBBs.insert(*NI);
|
||||
|
||||
bool Loop::isLCSSAForm(DominatorTree &DT) const {
|
||||
// Sort the blocks vector so that we can use binary search to do quick
|
||||
// lookups.
|
||||
SmallPtrSet<BasicBlock *, 16> LoopBBs(block_begin(), block_end());
|
||||
@ -290,7 +283,7 @@ bool Loop::isLCSSAForm() const {
|
||||
// entry are special; uses in them don't need to go through PHIs.
|
||||
if (UserBB != BB &&
|
||||
!LoopBBs.count(UserBB) &&
|
||||
ReachableBBs.count(UserBB))
|
||||
DT.isReachableFromEntry(UserBB))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -215,7 +215,7 @@ ICmpInst *IndVarSimplify::LinearFunctionTestReplace(Loop *L,
|
||||
void IndVarSimplify::RewriteLoopExitValues(Loop *L,
|
||||
SCEVExpander &Rewriter) {
|
||||
// Verify the input to the pass in already in LCSSA form.
|
||||
assert(L->isLCSSAForm());
|
||||
assert(L->isLCSSAForm(*DT));
|
||||
|
||||
SmallVector<BasicBlock*, 8> ExitBlocks;
|
||||
L->getUniqueExitBlocks(ExitBlocks);
|
||||
@ -445,7 +445,7 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
// Clean up dead instructions.
|
||||
Changed |= DeleteDeadPHIs(L->getHeader());
|
||||
// Check a post-condition.
|
||||
assert(L->isLCSSAForm() && "Indvars did not leave the loop in lcssa form!");
|
||||
assert(L->isLCSSAForm(*DT) && "Indvars did not leave the loop in lcssa form!");
|
||||
return Changed;
|
||||
}
|
||||
|
||||
|
@ -86,7 +86,6 @@ static unsigned ApproximateLoopSize(const Loop *L, unsigned &NumCalls) {
|
||||
}
|
||||
|
||||
bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
assert(L->isLCSSAForm());
|
||||
LoopInfo *LI = &getAnalysis<LoopInfo>();
|
||||
|
||||
BasicBlock *Header = L->getHeader();
|
||||
|
@ -206,7 +206,7 @@ bool LoopUnswitch::runOnLoop(Loop *L, LPPassManager &LPM_Ref) {
|
||||
Function *F = currentLoop->getHeader()->getParent();
|
||||
bool Changed = false;
|
||||
do {
|
||||
assert(currentLoop->isLCSSAForm());
|
||||
assert(currentLoop->isLCSSAForm(*DT));
|
||||
redoLoop = false;
|
||||
Changed |= processCurrentLoop();
|
||||
} while(redoLoop);
|
||||
|
@ -88,7 +88,7 @@ namespace {
|
||||
/// verifyAnalysis() - Verify loop nest.
|
||||
virtual void verifyAnalysis() const {
|
||||
// Check the special guarantees that LCSSA makes.
|
||||
assert(L->isLCSSAForm() && "LCSSA form not preserved!");
|
||||
assert(L->isLCSSAForm(*DT) && "LCSSA form not preserved!");
|
||||
}
|
||||
|
||||
/// inLoop - returns true if the given block is within the current loop
|
||||
@ -164,7 +164,7 @@ bool LCSSA::runOnLoop(Loop *TheLoop, LPPassManager &LPM) {
|
||||
}
|
||||
}
|
||||
|
||||
assert(L->isLCSSAForm());
|
||||
assert(L->isLCSSAForm(*DT));
|
||||
PredCache.clear();
|
||||
|
||||
return MadeChange;
|
||||
|
@ -105,8 +105,6 @@ static BasicBlock *FoldBlockIntoPredecessor(BasicBlock *BB, LoopInfo* LI) {
|
||||
/// If a LoopPassManager is passed in, and the loop is fully removed, it will be
|
||||
/// removed from the LoopPassManager as well. LPM can also be NULL.
|
||||
bool llvm::UnrollLoop(Loop *L, unsigned Count, LoopInfo* LI, LPPassManager* LPM) {
|
||||
assert(L->isLCSSAForm());
|
||||
|
||||
BasicBlock *Preheader = L->getLoopPreheader();
|
||||
if (!Preheader) {
|
||||
DEBUG(dbgs() << " Can't unroll; loop preheader-insertion failed.\n");
|
||||
@ -370,9 +368,5 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count, LoopInfo* LI, LPPassManager* LPM)
|
||||
if (CompletelyUnroll && LPM != NULL)
|
||||
LPM->deleteLoopFromQueue(L);
|
||||
|
||||
// If we didn't completely unroll the loop, it should still be in LCSSA form.
|
||||
if (!CompletelyUnroll)
|
||||
assert(L->isLCSSAForm());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user