Skip to content

Commit

Permalink
[LCG] Remove the use of the parent sets to compute connectivity when
Browse files Browse the repository at this point in the history
merging RefSCCs.

The logic to directly use the reference edges is simpler and not
substantially slower (despite the comments to the contrary) because this
is not actually an especially hot part of LCG in practice.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310161 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
chandlerc committed Aug 5, 2017
1 parent a64054e commit 854685a
Showing 1 changed file with 14 additions and 16 deletions.
30 changes: 14 additions & 16 deletions lib/Analysis/LazyCallGraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -957,22 +957,20 @@ LazyCallGraph::RefSCC::insertIncomingRefEdge(Node &SourceN, Node &TargetN) {
// RefSCCs (and their edges) are visited here.
auto ComputeSourceConnectedSet = [&](SmallPtrSetImpl<RefSCC *> &Set) {
Set.insert(&SourceC);
SmallVector<RefSCC *, 4> Worklist;
Worklist.push_back(&SourceC);
do {
RefSCC &RC = *Worklist.pop_back_val();
for (RefSCC &ParentRC : RC.parents()) {
// Skip any RefSCCs outside the range of source to target in the
// postorder sequence.
int ParentIdx = G->getRefSCCIndex(ParentRC);
assert(ParentIdx > SourceIdx && "Parent cannot precede source in postorder!");
if (ParentIdx > TargetIdx)
continue;
if (Set.insert(&ParentRC).second)
// First edge connecting to this parent, add it to our worklist.
Worklist.push_back(&ParentRC);
}
} while (!Worklist.empty());
auto IsConnected = [&](RefSCC &RC) {
for (SCC &C : RC)
for (Node &N : C)
for (Edge &E : *N)
if (Set.count(G->lookupRefSCC(E.getNode())))
return true;

return false;
};

for (RefSCC *C : make_range(G->PostOrderRefSCCs.begin() + SourceIdx + 1,
G->PostOrderRefSCCs.begin() + TargetIdx + 1))
if (IsConnected(*C))
Set.insert(C);
};

// Use a normal worklist to find which SCCs the target connects to. We still
Expand Down

0 comments on commit 854685a

Please sign in to comment.