mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +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:
@@ -376,11 +376,73 @@ public:
|
||||
/// verifyLoop - Verify loop structure
|
||||
void verifyLoop() const {
|
||||
#ifndef NDEBUG
|
||||
assert (getHeader() && "Loop header is missing");
|
||||
assert (getLoopPreheader() && "Loop preheader is missing");
|
||||
assert (getLoopLatch() && "Loop latch is missing");
|
||||
for (iterator I = SubLoops.begin(), E = SubLoops.end(); I != E; ++I)
|
||||
assert(!Blocks.empty() && "Loop header is missing");
|
||||
assert(getHeader() && "Loop header is missing");
|
||||
|
||||
// Verify the individual blocks.
|
||||
for (block_iterator I = block_begin(), E = block_end(); I != E; ++I) {
|
||||
BlockT *BB = *I;
|
||||
bool HasInsideLoopSuccs = false;
|
||||
bool HasInsideLoopPreds = false;
|
||||
SmallVector<BlockT *, 2> OutsideLoopPreds;
|
||||
|
||||
typedef GraphTraits<BlockT*> BlockTraits;
|
||||
for (typename BlockTraits::ChildIteratorType SI =
|
||||
BlockTraits::child_begin(BB), SE = BlockTraits::child_end(BB);
|
||||
SI != SE; ++SI)
|
||||
if (contains(*SI))
|
||||
HasInsideLoopSuccs = true;
|
||||
typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits;
|
||||
for (typename InvBlockTraits::ChildIteratorType PI =
|
||||
InvBlockTraits::child_begin(BB), PE = InvBlockTraits::child_end(BB);
|
||||
PI != PE; ++PI) {
|
||||
if (contains(*PI))
|
||||
HasInsideLoopPreds = true;
|
||||
else
|
||||
OutsideLoopPreds.push_back(*PI);
|
||||
}
|
||||
|
||||
if (BB == getHeader()) {
|
||||
assert(!OutsideLoopPreds.empty() && "Loop is unreachable!");
|
||||
} else if (!OutsideLoopPreds.empty()) {
|
||||
// A non-header loop shouldn't be reachable from outside the loop,
|
||||
// though it is permitted if the predecessor is not itself actually
|
||||
// reachable.
|
||||
BlockT *EntryBB = BB->getParent()->begin();
|
||||
for (df_iterator<BlockT *> NI = df_begin(EntryBB),
|
||||
NE = df_end(EntryBB); NI != NE; ++NI)
|
||||
for (unsigned i = 0, e = OutsideLoopPreds.size(); i != e; ++i)
|
||||
assert(*NI != OutsideLoopPreds[i] &&
|
||||
"Loop has multiple entry points!");
|
||||
}
|
||||
assert(HasInsideLoopPreds && "Loop block has no in-loop predecessors!");
|
||||
assert(HasInsideLoopSuccs && "Loop block has no in-loop successors!");
|
||||
assert(BB != getHeader()->getParent()->begin() &&
|
||||
"Loop contains function entry block!");
|
||||
}
|
||||
|
||||
// Verify the subloops.
|
||||
for (iterator I = begin(), E = end(); I != E; ++I) {
|
||||
// Each block in each subloop should be contained within this loop.
|
||||
for (block_iterator BI = (*I)->block_begin(), BE = (*I)->block_end();
|
||||
BI != BE; ++BI) {
|
||||
assert(contains(*BI) &&
|
||||
"Loop does not contain all the blocks of a subloop!");
|
||||
}
|
||||
// Recursively check the subloop.
|
||||
(*I)->verifyLoop();
|
||||
}
|
||||
|
||||
// Verify the parent loop.
|
||||
if (ParentLoop) {
|
||||
bool FoundSelf = false;
|
||||
for (iterator I = ParentLoop->begin(), E = ParentLoop->end(); I != E; ++I)
|
||||
if (*I == this) {
|
||||
FoundSelf = true;
|
||||
break;
|
||||
}
|
||||
assert(FoundSelf && "Loop is not a subloop of its parent!");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -873,6 +935,8 @@ public:
|
||||
///
|
||||
virtual bool runOnFunction(Function &F);
|
||||
|
||||
virtual void verifyAnalysis() const;
|
||||
|
||||
virtual void releaseMemory() { LI.releaseMemory(); }
|
||||
|
||||
virtual void print(raw_ostream &O, const Module* M = 0) const;
|
||||
|
Reference in New Issue
Block a user