mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
Eliminate O(n^2) worst-case behavior in SSA construction
The code uses a priority queue and a worklist, which share the same visited set, but the visited set is only updated when inserting into the priority queue. Instead, switch to using separate visited sets for the priority queue and worklist. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234425 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cd13a3808a
commit
011438b1c7
@ -872,8 +872,10 @@ void PromoteMem2Reg::DetermineInsertionPoint(AllocaInst *AI, unsigned AllocaNum,
|
||||
}
|
||||
|
||||
SmallVector<std::pair<unsigned, BasicBlock *>, 32> DFBlocks;
|
||||
SmallPtrSet<DomTreeNode *, 32> Visited;
|
||||
SmallVector<DomTreeNode *, 32> Worklist;
|
||||
SmallPtrSet<DomTreeNode *, 32> VisitedPQ;
|
||||
SmallPtrSet<DomTreeNode *, 32> VisitedWorklist;
|
||||
|
||||
while (!PQ.empty()) {
|
||||
DomTreeNodePair RootPair = PQ.top();
|
||||
PQ.pop();
|
||||
@ -887,6 +889,7 @@ void PromoteMem2Reg::DetermineInsertionPoint(AllocaInst *AI, unsigned AllocaNum,
|
||||
|
||||
Worklist.clear();
|
||||
Worklist.push_back(Root);
|
||||
VisitedWorklist.insert(Root);
|
||||
|
||||
while (!Worklist.empty()) {
|
||||
DomTreeNode *Node = Worklist.pop_back_val();
|
||||
@ -905,7 +908,7 @@ void PromoteMem2Reg::DetermineInsertionPoint(AllocaInst *AI, unsigned AllocaNum,
|
||||
if (SuccLevel > RootLevel)
|
||||
continue;
|
||||
|
||||
if (!Visited.insert(SuccNode).second)
|
||||
if (!VisitedPQ.insert(SuccNode).second)
|
||||
continue;
|
||||
|
||||
BasicBlock *SuccBB = SuccNode->getBlock();
|
||||
@ -919,7 +922,7 @@ void PromoteMem2Reg::DetermineInsertionPoint(AllocaInst *AI, unsigned AllocaNum,
|
||||
|
||||
for (DomTreeNode::iterator CI = Node->begin(), CE = Node->end(); CI != CE;
|
||||
++CI) {
|
||||
if (!Visited.count(*CI))
|
||||
if (VisitedWorklist.insert(*CI).second)
|
||||
Worklist.push_back(*CI);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user