mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
Add a verifyAnalysis to LoopInfo, LoopSimplify, and LCSSA form that verify
that these passes are properly preserved. Fix several transformation passes that claimed to preserve LoopSimplify form but weren't. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80926 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -69,8 +69,8 @@ namespace {
|
||||
|
||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
// We need loop information to identify the loops...
|
||||
AU.addRequired<LoopInfo>();
|
||||
AU.addRequired<DominatorTree>();
|
||||
AU.addRequiredTransitive<LoopInfo>();
|
||||
AU.addRequiredTransitive<DominatorTree>();
|
||||
|
||||
AU.addPreserved<LoopInfo>();
|
||||
AU.addPreserved<DominatorTree>();
|
||||
@ -83,9 +83,13 @@ namespace {
|
||||
void verifyAnalysis() const {
|
||||
#ifndef NDEBUG
|
||||
LoopInfo *NLI = &getAnalysis<LoopInfo>();
|
||||
for (LoopInfo::iterator I = NLI->begin(), E = NLI->end(); I != E; ++I)
|
||||
for (LoopInfo::iterator I = NLI->begin(), E = NLI->end(); I != E; ++I) {
|
||||
// Sanity check: Check basic loop invariants.
|
||||
(*I)->verifyLoop();
|
||||
#endif
|
||||
// Check the special guarantees that LoopSimplify makes.
|
||||
assert((*I)->isLoopSimplifyForm());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
@ -346,15 +350,6 @@ BasicBlock *LoopSimplify::InsertPreheaderForLoop(Loop *L) {
|
||||
BasicBlock *NewBB =
|
||||
SplitBlockPredecessors(Header, &OutsideBlocks[0], OutsideBlocks.size(),
|
||||
".preheader", this);
|
||||
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Update analysis results now that we have performed the transformation
|
||||
//
|
||||
|
||||
// We know that we have loop information to update... update it now.
|
||||
if (Loop *Parent = L->getParentLoop())
|
||||
Parent->addBasicBlockToLoop(NewBB, LI->getBase());
|
||||
|
||||
// Make sure that NewBB is put someplace intelligent, which doesn't mess up
|
||||
// code layout too horribly.
|
||||
@ -377,17 +372,6 @@ BasicBlock *LoopSimplify::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) {
|
||||
LoopBlocks.size(), ".loopexit",
|
||||
this);
|
||||
|
||||
// Update Loop Information - we know that the new block will be in whichever
|
||||
// loop the Exit block is in. Note that it may not be in that immediate loop,
|
||||
// if the successor is some other loop header. In that case, we continue
|
||||
// walking up the loop tree to find a loop that contains both the successor
|
||||
// block and the predecessor block.
|
||||
Loop *SuccLoop = LI->getLoopFor(Exit);
|
||||
while (SuccLoop && !SuccLoop->contains(L->getHeader()))
|
||||
SuccLoop = SuccLoop->getParentLoop();
|
||||
if (SuccLoop)
|
||||
SuccLoop->addBasicBlockToLoop(NewBB, LI->getBase());
|
||||
|
||||
return NewBB;
|
||||
}
|
||||
|
||||
@ -521,10 +505,6 @@ Loop *LoopSimplify::SeparateNestedLoop(Loop *L) {
|
||||
else
|
||||
LI->changeTopLevelLoop(L, NewOuter);
|
||||
|
||||
// This block is going to be our new header block: add it to this loop and all
|
||||
// parent loops.
|
||||
NewOuter->addBasicBlockToLoop(NewBB, LI->getBase());
|
||||
|
||||
// L is now a subloop of our outer loop.
|
||||
NewOuter->addChildLoop(L);
|
||||
|
||||
@ -532,6 +512,10 @@ Loop *LoopSimplify::SeparateNestedLoop(Loop *L) {
|
||||
I != E; ++I)
|
||||
NewOuter->addBlockEntry(*I);
|
||||
|
||||
// Now reset the header in L, which had been moved by
|
||||
// SplitBlockPredecessors for the outer loop.
|
||||
L->moveToHeader(Header);
|
||||
|
||||
// Determine which blocks should stay in L and which should be moved out to
|
||||
// the Outer loop now.
|
||||
std::set<BasicBlock*> BlocksInL;
|
||||
|
Reference in New Issue
Block a user