From cac3cd7be164e8e6943f68e545995549b6151a63 Mon Sep 17 00:00:00 2001 From: Brian Gesiak Date: Sat, 6 May 2017 16:22:53 +0000 Subject: [PATCH] [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 --- include/llvm/Analysis/LoopInfoImpl.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/include/llvm/Analysis/LoopInfoImpl.h b/include/llvm/Analysis/LoopInfoImpl.h index 66c9f68afc6..249fa572c02 100644 --- a/include/llvm/Analysis/LoopInfoImpl.h +++ b/include/llvm/Analysis/LoopInfoImpl.h @@ -220,8 +220,8 @@ void LoopBase::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 VisitedBBs; // Check the individual blocks. for ( ; BI != BE; ++BI) { @@ -259,10 +259,18 @@ void LoopBase::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)