mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[Analysis] Print out unreachable loops
Summary: When writing a loop pass I made a mistake and hit the assertion "Unreachable block in loop". Later, I hit an assertion when I called `BasicBlock::eraseFromParent()` incorrectly: "Use still stuck around after Def is destroyed". This latter assertion, however, printed out exactly which value is being deleted and what uses remain, which helped me debug the issue. To help people debugging their loop passes in the future, print out exactly which basic block is unreachable in a loop. Reviewers: sanjoy, hfinkel, mehdi_amini Reviewed By: mehdi_amini Subscribers: mzolotukhin Differential Revision: https://reviews.llvm.org/D32878 llvm-svn: 302354
This commit is contained in:
parent
12866b2f4e
commit
cac3cd7be1
@ -220,8 +220,8 @@ void LoopBase<BlockT, LoopT>::verifyLoop() const {
|
||||
BI = df_ext_begin(getHeader(), VisitSet),
|
||||
BE = df_ext_end(getHeader(), VisitSet);
|
||||
|
||||
// Keep track of the number of BBs visited.
|
||||
unsigned NumVisited = 0;
|
||||
// Keep track of the BBs visited.
|
||||
SmallPtrSet<BlockT*, 8> VisitedBBs;
|
||||
|
||||
// Check the individual blocks.
|
||||
for ( ; BI != BE; ++BI) {
|
||||
@ -259,10 +259,18 @@ void LoopBase<BlockT, LoopT>::verifyLoop() const {
|
||||
assert(BB != &getHeader()->getParent()->front() &&
|
||||
"Loop contains function entry block!");
|
||||
|
||||
NumVisited++;
|
||||
VisitedBBs.insert(BB);
|
||||
}
|
||||
|
||||
assert(NumVisited == getNumBlocks() && "Unreachable block in loop");
|
||||
if (VisitedBBs.size() != getNumBlocks()) {
|
||||
dbgs() << "The following blocks are unreachable in the loop: ";
|
||||
for (auto BB : Blocks) {
|
||||
if (!VisitedBBs.count(BB)) {
|
||||
dbgs() << *BB << "\n";
|
||||
}
|
||||
}
|
||||
assert(false && "Unreachable block in loop");
|
||||
}
|
||||
|
||||
// Check the subloops.
|
||||
for (iterator I = begin(), E = end(); I != E; ++I)
|
||||
|
Loading…
Reference in New Issue
Block a user