* Convert InstWorkList to vector instead of set, because on big programs it

is empirically faster by a noticable margin, even though duplicates can
  happen.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2511 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2002-05-07 04:29:32 +00:00
parent 92deeaf7a3
commit 071d0ad2f1

View File

@ -92,7 +92,7 @@ class SCCP : public FunctionPass, public InstVisitor<SCCP> {
std::set<BasicBlock*> BBExecutable;// The basic blocks that are executable std::set<BasicBlock*> BBExecutable;// The basic blocks that are executable
std::map<Value*, InstVal> ValueState; // The state each value is in... std::map<Value*, InstVal> ValueState; // The state each value is in...
std::set<Instruction*> InstWorkList;// The instruction work list std::vector<Instruction*> InstWorkList;// The instruction work list
std::vector<BasicBlock*> BBWorkList; // The BasicBlock work list std::vector<BasicBlock*> BBWorkList; // The BasicBlock work list
public: public:
@ -124,7 +124,7 @@ private:
DEBUG_SCCP(cerr << "markConstant: " << V << " = " << I); DEBUG_SCCP(cerr << "markConstant: " << V << " = " << I);
if (ValueState[I].markConstant(V)) { if (ValueState[I].markConstant(V)) {
InstWorkList.insert(I); InstWorkList.push_back(I);
return true; return true;
} }
return false; return false;
@ -138,7 +138,7 @@ private:
if (ValueState[V].markOverdefined()) { if (ValueState[V].markOverdefined()) {
if (Instruction *I = dyn_cast<Instruction>(V)) { if (Instruction *I = dyn_cast<Instruction>(V)) {
DEBUG_SCCP(cerr << "markOverdefined: " << V); DEBUG_SCCP(cerr << "markOverdefined: " << V);
InstWorkList.insert(I); // Only instructions go on the work list InstWorkList.push_back(I); // Only instructions go on the work list
} }
return true; return true;
} }
@ -251,8 +251,8 @@ bool SCCP::runOnFunction(Function *F) {
while (!BBWorkList.empty() || !InstWorkList.empty()) { while (!BBWorkList.empty() || !InstWorkList.empty()) {
// Process the instruction work list... // Process the instruction work list...
while (!InstWorkList.empty()) { while (!InstWorkList.empty()) {
Instruction *I = *InstWorkList.begin(); Instruction *I = InstWorkList.back();
InstWorkList.erase(InstWorkList.begin()); InstWorkList.pop_back();
DEBUG_SCCP(cerr << "\nPopped off I-WL: " << I); DEBUG_SCCP(cerr << "\nPopped off I-WL: " << I);