mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:49:45 +00:00
[NFC] Fix quadratic LexicalScopes::constructScopeNest
We sometimes have functions with large numbers of sibling basic blocks (usually with an error path exit from each one). This was triggering the qudratic behavior in this function - after visiting each child llvm would re-scan the parent from the beginning again. We modify the work stack to record the next index to be worked on alongside the pointer. This avoids the need to linearly search for the next unfinished child. Differential Revision: https://reviews.llvm.org/D80029
This commit is contained in:
parent
c4c014f213
commit
088194d6a5
@ -230,24 +230,24 @@ LexicalScopes::getOrCreateAbstractScope(const DILocalScope *Scope) {
|
||||
return &I->second;
|
||||
}
|
||||
|
||||
/// constructScopeNest
|
||||
/// constructScopeNest - Traverse the Scope tree depth-first, storing
|
||||
/// traversal state in WorkStack and recording the depth-first
|
||||
/// numbering (setDFSIn, setDFSOut) for edge classification.
|
||||
void LexicalScopes::constructScopeNest(LexicalScope *Scope) {
|
||||
assert(Scope && "Unable to calculate scope dominance graph!");
|
||||
SmallVector<LexicalScope *, 4> WorkStack;
|
||||
WorkStack.push_back(Scope);
|
||||
SmallVector<std::pair<LexicalScope *, size_t>, 4> WorkStack;
|
||||
WorkStack.push_back(std::make_pair(Scope, 0));
|
||||
unsigned Counter = 0;
|
||||
while (!WorkStack.empty()) {
|
||||
LexicalScope *WS = WorkStack.back();
|
||||
auto &ScopePosition = WorkStack.back();
|
||||
LexicalScope *WS = ScopePosition.first;
|
||||
size_t ChildNum = ScopePosition.second++;
|
||||
const SmallVectorImpl<LexicalScope *> &Children = WS->getChildren();
|
||||
bool visitedChildren = false;
|
||||
for (auto &ChildScope : Children)
|
||||
if (!ChildScope->getDFSOut()) {
|
||||
WorkStack.push_back(ChildScope);
|
||||
visitedChildren = true;
|
||||
ChildScope->setDFSIn(++Counter);
|
||||
break;
|
||||
}
|
||||
if (!visitedChildren) {
|
||||
if (ChildNum < Children.size()) {
|
||||
auto &ChildScope = Children[ChildNum];
|
||||
WorkStack.push_back(std::make_pair(ChildScope, 0));
|
||||
ChildScope->setDFSIn(++Counter);
|
||||
} else {
|
||||
WorkStack.pop_back();
|
||||
WS->setDFSOut(++Counter);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user