summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-11-02 06:11:23 +0000
committerChris Lattner <sabre@nondot.org>2009-11-02 06:11:23 +0000
commit809aee2f401a63ee81e185ab41e393ffc61b654e (patch)
tree8180e4b6d6441022eb19fcdb5dcbdd699547b519 /llvm/lib
parente77c9aa04af17c042c8cf128a5b559573f47a1ad (diff)
downloadbcm5719-llvm-809aee2f401a63ee81e185ab41e393ffc61b654e.tar.gz
bcm5719-llvm-809aee2f401a63ee81e185ab41e393ffc61b654e.zip
avoid redundant lookups in BBExecutable, and make it a SmallPtrSet.
llvm-svn: 85790
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Scalar/SCCP.cpp30
1 files changed, 16 insertions, 14 deletions
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp
index dd9f7651a5d..f58fead5197 100644
--- a/llvm/lib/Transforms/Scalar/SCCP.cpp
+++ b/llvm/lib/Transforms/Scalar/SCCP.cpp
@@ -37,6 +37,7 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/PointerIntPair.h"
+#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/STLExtras.h"
@@ -156,7 +157,7 @@ namespace {
///
class SCCPSolver : public InstVisitor<SCCPSolver> {
const TargetData *TD;
- DenseSet<BasicBlock*> BBExecutable;// The basic blocks that are executable
+ SmallPtrSet<BasicBlock*, 8> BBExecutable;// The BBs that are executable.
DenseMap<Value*, LatticeVal> ValueState; // The state each value is in.
/// GlobalValue - If we are tracking any values for the contents of a global
@@ -200,10 +201,13 @@ public:
/// MarkBlockExecutable - This method can be used by clients to mark all of
/// the blocks that are known to be intrinsically live in the processed unit.
- void MarkBlockExecutable(BasicBlock *BB) {
+ ///
+ /// This returns true if the block was not considered live before.
+ bool MarkBlockExecutable(BasicBlock *BB) {
+ if (!BBExecutable.insert(BB)) return false;
DEBUG(errs() << "Marking Block Executable: " << BB->getName() << "\n");
- BBExecutable.insert(BB); // Basic block is executable!
BBWorkList.push_back(BB); // Add the block to the work list!
+ return true;
}
/// TrackValueOfGlobalVariable - Clients can use this method to
@@ -348,18 +352,17 @@ private:
if (!KnownFeasibleEdges.insert(Edge(Source, Dest)).second)
return; // This edge is already known to be executable!
- if (BBExecutable.count(Dest)) {
- DEBUG(errs() << "Marking Edge Executable: " << Source->getName()
- << " -> " << Dest->getName() << "\n");
-
- // The destination is already executable, but we just made an edge
+ if (!MarkBlockExecutable(Dest)) {
+ // If the destination is already executable, we just made an *edge*
// feasible that wasn't before. Revisit the PHI nodes in the block
// because they have potentially new operands.
- for (BasicBlock::iterator I = Dest->begin(); isa<PHINode>(I); ++I)
- visitPHINode(*cast<PHINode>(I));
+ DEBUG(errs() << "Marking Edge Executable: " << Source->getName()
+ << " -> " << Dest->getName() << "\n");
- } else {
- MarkBlockExecutable(Dest);
+ PHINode *PN;
+ for (BasicBlock::iterator I = Dest->begin();
+ (PN = dyn_cast<PHINode>(I)); ++I)
+ visitPHINode(*PN);
}
}
@@ -1229,8 +1232,7 @@ CallOverdefined:
// Finally, if this is the first call to the function hit, mark its entry
// block executable.
- if (!BBExecutable.count(F->begin()))
- MarkBlockExecutable(F->begin());
+ MarkBlockExecutable(F->begin());
// Propagate information from this call site into the callee.
CallSite::arg_iterator CAI = CS.arg_begin();
OpenPOWER on IntegriCloud