mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-09 13:41:47 +00: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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302354 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
88a4e3bee5
commit
8a886c7975
@ -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