[cfe-commits] r94063 - /cfe/trunk/lib/Sema/SemaDecl.cpp
Mike Stump
mrs at apple.com
Wed Jan 20 18:55:37 PST 2010
Author: mrs
Date: Wed Jan 20 20:55:37 2010
New Revision: 94063
URL: http://llvm.org/viewvc/llvm-project?rev=94063&view=rev
Log:
When checking for unreachable blocks, we can trivially avoid extra
work, if we know we already marked all blocks as live.
Modified:
cfe/trunk/lib/Sema/SemaDecl.cpp
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=94063&r1=94062&r2=94063&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Jan 20 20:55:37 2010
@@ -1310,25 +1310,31 @@
New->setAccess(Old->getAccess());
}
-static void MarkLive(CFGBlock *e, llvm::BitVector &live) {
+// MarkLive - Mark all the blocks reachable from e as live. Returns the total
+// number of blocks marked live.
+static unsigned MarkLive(CFGBlock *e, llvm::BitVector &live) {
+ unsigned count = 0;
std::queue<CFGBlock*> workq;
// Prep work queue
+ live.set(e->getBlockID());
+ ++count;
workq.push(e);
// Solve
while (!workq.empty()) {
CFGBlock *item = workq.front();
workq.pop();
- live.set(item->getBlockID());
for (CFGBlock::succ_iterator I=item->succ_begin(),
E=item->succ_end();
I != E;
++I) {
if ((*I) && !live[(*I)->getBlockID()]) {
live.set((*I)->getBlockID());
+ ++count;
workq.push(*I);
}
}
}
+ return count;
}
static SourceLocation GetUnreachableLoc(CFGBlock &b) {
@@ -1432,7 +1438,9 @@
llvm::BitVector live(cfg->getNumBlockIDs());
// Mark all live things first.
- MarkLive(&cfg->getEntry(), live);
+ if (MarkLive(&cfg->getEntry(), live) == cfg->getNumBlockIDs())
+ // If there are no dead blocks, we're done.
+ return;
llvm::SmallVector<SourceLocation, 24> lines;
// First, give warnings for blocks with no predecessors, as they
More information about the cfe-commits
mailing list