1 //===- LazyCallGraph.cpp - Analysis of a Module's call graph --------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/Analysis/LazyCallGraph.h"
11 #include "llvm/ADT/ArrayRef.h"
12 #include "llvm/ADT/STLExtras.h"
13 #include "llvm/ADT/Sequence.h"
14 #include "llvm/ADT/SmallPtrSet.h"
15 #include "llvm/ADT/SmallVector.h"
16 #include "llvm/ADT/iterator_range.h"
17 #include "llvm/Analysis/TargetLibraryInfo.h"
18 #include "llvm/IR/Constants.h"
19 #include "llvm/IR/Function.h"
20 #include "llvm/IR/GlobalVariable.h"
21 #include "llvm/IR/InstIterator.h"
22 #include "llvm/IR/Instruction.h"
23 #include "llvm/IR/Module.h"
24 #include "llvm/IR/PassManager.h"
25 #include "llvm/Support/Casting.h"
26 #include "llvm/Support/Compiler.h"
27 #include "llvm/Support/Debug.h"
28 #include "llvm/Support/GraphWriter.h"
29 #include "llvm/Support/raw_ostream.h"
32 #ifdef EXPENSIVE_CHECKS
33 #include "llvm/ADT/ScopeExit.h"
38 #define DEBUG_TYPE "lcg"
40 void LazyCallGraph::EdgeSequence::insertEdgeInternal(Node
&TargetN
,
42 EdgeIndexMap
.try_emplace(&TargetN
, Edges
.size());
43 Edges
.emplace_back(TargetN
, EK
);
46 void LazyCallGraph::EdgeSequence::setEdgeKind(Node
&TargetN
, Edge::Kind EK
) {
47 Edges
[EdgeIndexMap
.find(&TargetN
)->second
].setKind(EK
);
50 bool LazyCallGraph::EdgeSequence::removeEdgeInternal(Node
&TargetN
) {
51 auto IndexMapI
= EdgeIndexMap
.find(&TargetN
);
52 if (IndexMapI
== EdgeIndexMap
.end())
55 Edges
[IndexMapI
->second
] = Edge();
56 EdgeIndexMap
.erase(IndexMapI
);
60 static void addEdge(SmallVectorImpl
<LazyCallGraph::Edge
> &Edges
,
61 DenseMap
<LazyCallGraph::Node
*, int> &EdgeIndexMap
,
62 LazyCallGraph::Node
&N
, LazyCallGraph::Edge::Kind EK
) {
63 if (!EdgeIndexMap
.try_emplace(&N
, Edges
.size()).second
)
66 LLVM_DEBUG(dbgs() << " Added callable function: " << N
.getName() << "\n");
67 Edges
.emplace_back(LazyCallGraph::Edge(N
, EK
));
70 LazyCallGraph::EdgeSequence
&LazyCallGraph::Node::populateSlow() {
71 assert(!Edges
&& "Must not have already populated the edges for this node!");
73 LLVM_DEBUG(dbgs() << " Adding functions called by '" << getName()
74 << "' to the graph.\n");
76 Edges
= EdgeSequence();
78 SmallVector
<Constant
*, 16> Worklist
;
79 SmallPtrSet
<Function
*, 4> Callees
;
80 SmallPtrSet
<Constant
*, 16> Visited
;
82 // Find all the potential call graph edges in this function. We track both
83 // actual call edges and indirect references to functions. The direct calls
84 // are trivially added, but to accumulate the latter we walk the instructions
85 // and add every operand which is a constant to the worklist to process
88 // Note that we consider *any* function with a definition to be a viable
89 // edge. Even if the function's definition is subject to replacement by
90 // some other module (say, a weak definition) there may still be
91 // optimizations which essentially speculate based on the definition and
92 // a way to check that the specific definition is in fact the one being
93 // used. For example, this could be done by moving the weak definition to
94 // a strong (internal) definition and making the weak definition be an
95 // alias. Then a test of the address of the weak function against the new
96 // strong definition's address would be an effective way to determine the
97 // safety of optimizing a direct call edge.
98 for (BasicBlock
&BB
: *F
)
99 for (Instruction
&I
: BB
) {
100 if (auto *CB
= dyn_cast
<CallBase
>(&I
))
101 if (Function
*Callee
= CB
->getCalledFunction())
102 if (!Callee
->isDeclaration())
103 if (Callees
.insert(Callee
).second
) {
104 Visited
.insert(Callee
);
105 addEdge(Edges
->Edges
, Edges
->EdgeIndexMap
, G
->get(*Callee
),
106 LazyCallGraph::Edge::Call
);
109 for (Value
*Op
: I
.operand_values())
110 if (Constant
*C
= dyn_cast
<Constant
>(Op
))
111 if (Visited
.insert(C
).second
)
112 Worklist
.push_back(C
);
115 // We've collected all the constant (and thus potentially function or
116 // function containing) operands to all the instructions in the function.
117 // Process them (recursively) collecting every function found.
118 visitReferences(Worklist
, Visited
, [&](Function
&F
) {
119 addEdge(Edges
->Edges
, Edges
->EdgeIndexMap
, G
->get(F
),
120 LazyCallGraph::Edge::Ref
);
123 // Add implicit reference edges to any defined libcall functions (if we
124 // haven't found an explicit edge).
125 for (auto *F
: G
->LibFunctions
)
126 if (!Visited
.count(F
))
127 addEdge(Edges
->Edges
, Edges
->EdgeIndexMap
, G
->get(*F
),
128 LazyCallGraph::Edge::Ref
);
133 void LazyCallGraph::Node::replaceFunction(Function
&NewF
) {
134 assert(F
!= &NewF
&& "Must not replace a function with itself!");
138 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
139 LLVM_DUMP_METHOD
void LazyCallGraph::Node::dump() const {
140 dbgs() << *this << '\n';
144 static bool isKnownLibFunction(Function
&F
, TargetLibraryInfo
&TLI
) {
147 // Either this is a normal library function or a "vectorizable"
148 // function. Not using the VFDatabase here because this query
149 // is related only to libraries handled via the TLI.
150 return TLI
.getLibFunc(F
, LF
) ||
151 TLI
.isKnownVectorFunctionInLibrary(F
.getName());
154 LazyCallGraph::LazyCallGraph(
155 Module
&M
, function_ref
<TargetLibraryInfo
&(Function
&)> GetTLI
) {
156 LLVM_DEBUG(dbgs() << "Building CG for module: " << M
.getModuleIdentifier()
158 for (Function
&F
: M
) {
159 if (F
.isDeclaration())
161 // If this function is a known lib function to LLVM then we want to
162 // synthesize reference edges to it to model the fact that LLVM can turn
163 // arbitrary code into a library function call.
164 if (isKnownLibFunction(F
, GetTLI(F
)))
165 LibFunctions
.insert(&F
);
167 if (F
.hasLocalLinkage())
170 // External linkage defined functions have edges to them from other
172 LLVM_DEBUG(dbgs() << " Adding '" << F
.getName()
173 << "' to entry set of the graph.\n");
174 addEdge(EntryEdges
.Edges
, EntryEdges
.EdgeIndexMap
, get(F
), Edge::Ref
);
177 // Externally visible aliases of internal functions are also viable entry
178 // edges to the module.
179 for (auto &A
: M
.aliases()) {
180 if (A
.hasLocalLinkage())
182 if (Function
* F
= dyn_cast
<Function
>(A
.getAliasee())) {
183 LLVM_DEBUG(dbgs() << " Adding '" << F
->getName()
184 << "' with alias '" << A
.getName()
185 << "' to entry set of the graph.\n");
186 addEdge(EntryEdges
.Edges
, EntryEdges
.EdgeIndexMap
, get(*F
), Edge::Ref
);
190 // Now add entry nodes for functions reachable via initializers to globals.
191 SmallVector
<Constant
*, 16> Worklist
;
192 SmallPtrSet
<Constant
*, 16> Visited
;
193 for (GlobalVariable
&GV
: M
.globals())
194 if (GV
.hasInitializer())
195 if (Visited
.insert(GV
.getInitializer()).second
)
196 Worklist
.push_back(GV
.getInitializer());
199 dbgs() << " Adding functions referenced by global initializers to the "
201 visitReferences(Worklist
, Visited
, [&](Function
&F
) {
202 addEdge(EntryEdges
.Edges
, EntryEdges
.EdgeIndexMap
, get(F
),
203 LazyCallGraph::Edge::Ref
);
207 LazyCallGraph::LazyCallGraph(LazyCallGraph
&&G
)
208 : BPA(std::move(G
.BPA
)), NodeMap(std::move(G
.NodeMap
)),
209 EntryEdges(std::move(G
.EntryEdges
)), SCCBPA(std::move(G
.SCCBPA
)),
210 SCCMap(std::move(G
.SCCMap
)), LibFunctions(std::move(G
.LibFunctions
)) {
214 bool LazyCallGraph::invalidate(Module
&, const PreservedAnalyses
&PA
,
215 ModuleAnalysisManager::Invalidator
&) {
216 // Check whether the analysis, all analyses on functions, or the function's
217 // CFG have been preserved.
218 auto PAC
= PA
.getChecker
<llvm::LazyCallGraphAnalysis
>();
219 return !(PAC
.preserved() || PAC
.preservedSet
<AllAnalysesOn
<Module
>>());
222 LazyCallGraph
&LazyCallGraph::operator=(LazyCallGraph
&&G
) {
223 BPA
= std::move(G
.BPA
);
224 NodeMap
= std::move(G
.NodeMap
);
225 EntryEdges
= std::move(G
.EntryEdges
);
226 SCCBPA
= std::move(G
.SCCBPA
);
227 SCCMap
= std::move(G
.SCCMap
);
228 LibFunctions
= std::move(G
.LibFunctions
);
233 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
234 LLVM_DUMP_METHOD
void LazyCallGraph::SCC::dump() const {
235 dbgs() << *this << '\n';
239 #if !defined(NDEBUG) || defined(EXPENSIVE_CHECKS)
240 void LazyCallGraph::SCC::verify() {
241 assert(OuterRefSCC
&& "Can't have a null RefSCC!");
242 assert(!Nodes
.empty() && "Can't have an empty SCC!");
244 for (Node
*N
: Nodes
) {
245 assert(N
&& "Can't have a null node!");
246 assert(OuterRefSCC
->G
->lookupSCC(*N
) == this &&
247 "Node does not map to this SCC!");
248 assert(N
->DFSNumber
== -1 &&
249 "Must set DFS numbers to -1 when adding a node to an SCC!");
250 assert(N
->LowLink
== -1 &&
251 "Must set low link to -1 when adding a node to an SCC!");
253 assert(E
.getNode().isPopulated() && "Can't have an unpopulated node!");
255 #ifdef EXPENSIVE_CHECKS
256 // Verify that all nodes in this SCC can reach all other nodes.
257 SmallVector
<Node
*, 4> Worklist
;
258 SmallPtrSet
<Node
*, 4> Visited
;
259 Worklist
.push_back(N
);
260 while (!Worklist
.empty()) {
261 Node
*VisitingNode
= Worklist
.pop_back_val();
262 if (!Visited
.insert(VisitingNode
).second
)
264 for (Edge
&E
: (*VisitingNode
)->calls())
265 Worklist
.push_back(&E
.getNode());
267 for (Node
*NodeToVisit
: Nodes
) {
268 assert(Visited
.contains(NodeToVisit
) &&
269 "Cannot reach all nodes within SCC");
276 bool LazyCallGraph::SCC::isParentOf(const SCC
&C
) const {
280 for (Node
&N
: *this)
281 for (Edge
&E
: N
->calls())
282 if (OuterRefSCC
->G
->lookupSCC(E
.getNode()) == &C
)
289 bool LazyCallGraph::SCC::isAncestorOf(const SCC
&TargetC
) const {
290 if (this == &TargetC
)
293 LazyCallGraph
&G
= *OuterRefSCC
->G
;
295 // Start with this SCC.
296 SmallPtrSet
<const SCC
*, 16> Visited
= {this};
297 SmallVector
<const SCC
*, 16> Worklist
= {this};
299 // Walk down the graph until we run out of edges or find a path to TargetC.
301 const SCC
&C
= *Worklist
.pop_back_val();
303 for (Edge
&E
: N
->calls()) {
304 SCC
*CalleeC
= G
.lookupSCC(E
.getNode());
308 // If the callee's SCC is the TargetC, we're done.
309 if (CalleeC
== &TargetC
)
312 // If this is the first time we've reached this SCC, put it on the
313 // worklist to recurse through.
314 if (Visited
.insert(CalleeC
).second
)
315 Worklist
.push_back(CalleeC
);
317 } while (!Worklist
.empty());
323 LazyCallGraph::RefSCC::RefSCC(LazyCallGraph
&G
) : G(&G
) {}
325 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
326 LLVM_DUMP_METHOD
void LazyCallGraph::RefSCC::dump() const {
327 dbgs() << *this << '\n';
331 #if !defined(NDEBUG) || defined(EXPENSIVE_CHECKS)
332 void LazyCallGraph::RefSCC::verify() {
333 assert(G
&& "Can't have a null graph!");
334 assert(!SCCs
.empty() && "Can't have an empty SCC!");
336 // Verify basic properties of the SCCs.
337 SmallPtrSet
<SCC
*, 4> SCCSet
;
338 for (SCC
*C
: SCCs
) {
339 assert(C
&& "Can't have a null SCC!");
341 assert(&C
->getOuterRefSCC() == this &&
342 "SCC doesn't think it is inside this RefSCC!");
343 bool Inserted
= SCCSet
.insert(C
).second
;
344 assert(Inserted
&& "Found a duplicate SCC!");
345 auto IndexIt
= SCCIndices
.find(C
);
346 assert(IndexIt
!= SCCIndices
.end() &&
347 "Found an SCC that doesn't have an index!");
350 // Check that our indices map correctly.
351 for (auto [C
, I
] : SCCIndices
) {
352 assert(C
&& "Can't have a null SCC in the indices!");
353 assert(SCCSet
.count(C
) && "Found an index for an SCC not in the RefSCC!");
354 assert(SCCs
[I
] == C
&& "Index doesn't point to SCC!");
357 // Check that the SCCs are in fact in post-order.
358 for (int I
= 0, Size
= SCCs
.size(); I
< Size
; ++I
) {
359 SCC
&SourceSCC
= *SCCs
[I
];
360 for (Node
&N
: SourceSCC
)
364 SCC
&TargetSCC
= *G
->lookupSCC(E
.getNode());
365 if (&TargetSCC
.getOuterRefSCC() == this) {
366 assert(SCCIndices
.find(&TargetSCC
)->second
<= I
&&
367 "Edge between SCCs violates post-order relationship.");
373 #ifdef EXPENSIVE_CHECKS
374 // Verify that all nodes in this RefSCC can reach all other nodes.
375 SmallVector
<Node
*> Nodes
;
376 for (SCC
*C
: SCCs
) {
380 for (Node
*N
: Nodes
) {
381 SmallVector
<Node
*, 4> Worklist
;
382 SmallPtrSet
<Node
*, 4> Visited
;
383 Worklist
.push_back(N
);
384 while (!Worklist
.empty()) {
385 Node
*VisitingNode
= Worklist
.pop_back_val();
386 if (!Visited
.insert(VisitingNode
).second
)
388 for (Edge
&E
: **VisitingNode
)
389 Worklist
.push_back(&E
.getNode());
391 for (Node
*NodeToVisit
: Nodes
) {
392 assert(Visited
.contains(NodeToVisit
) &&
393 "Cannot reach all nodes within RefSCC");
400 bool LazyCallGraph::RefSCC::isParentOf(const RefSCC
&RC
) const {
404 // Search all edges to see if this is a parent.
408 if (G
->lookupRefSCC(E
.getNode()) == &RC
)
414 bool LazyCallGraph::RefSCC::isAncestorOf(const RefSCC
&RC
) const {
418 // For each descendant of this RefSCC, see if one of its children is the
419 // argument. If not, add that descendant to the worklist and continue
421 SmallVector
<const RefSCC
*, 4> Worklist
;
422 SmallPtrSet
<const RefSCC
*, 4> Visited
;
423 Worklist
.push_back(this);
424 Visited
.insert(this);
426 const RefSCC
&DescendantRC
= *Worklist
.pop_back_val();
427 for (SCC
&C
: DescendantRC
)
430 auto *ChildRC
= G
->lookupRefSCC(E
.getNode());
433 if (!ChildRC
|| !Visited
.insert(ChildRC
).second
)
435 Worklist
.push_back(ChildRC
);
437 } while (!Worklist
.empty());
442 /// Generic helper that updates a postorder sequence of SCCs for a potentially
443 /// cycle-introducing edge insertion.
445 /// A postorder sequence of SCCs of a directed graph has one fundamental
446 /// property: all deges in the DAG of SCCs point "up" the sequence. That is,
447 /// all edges in the SCC DAG point to prior SCCs in the sequence.
449 /// This routine both updates a postorder sequence and uses that sequence to
450 /// compute the set of SCCs connected into a cycle. It should only be called to
451 /// insert a "downward" edge which will require changing the sequence to
452 /// restore it to a postorder.
454 /// When inserting an edge from an earlier SCC to a later SCC in some postorder
455 /// sequence, all of the SCCs which may be impacted are in the closed range of
456 /// those two within the postorder sequence. The algorithm used here to restore
457 /// the state is as follows:
459 /// 1) Starting from the source SCC, construct a set of SCCs which reach the
460 /// source SCC consisting of just the source SCC. Then scan toward the
461 /// target SCC in postorder and for each SCC, if it has an edge to an SCC
462 /// in the set, add it to the set. Otherwise, the source SCC is not
463 /// a successor, move it in the postorder sequence to immediately before
464 /// the source SCC, shifting the source SCC and all SCCs in the set one
465 /// position toward the target SCC. Stop scanning after processing the
467 /// 2) If the source SCC is now past the target SCC in the postorder sequence,
468 /// and thus the new edge will flow toward the start, we are done.
469 /// 3) Otherwise, starting from the target SCC, walk all edges which reach an
470 /// SCC between the source and the target, and add them to the set of
471 /// connected SCCs, then recurse through them. Once a complete set of the
472 /// SCCs the target connects to is known, hoist the remaining SCCs between
473 /// the source and the target to be above the target. Note that there is no
474 /// need to process the source SCC, it is already known to connect.
475 /// 4) At this point, all of the SCCs in the closed range between the source
476 /// SCC and the target SCC in the postorder sequence are connected,
477 /// including the target SCC and the source SCC. Inserting the edge from
478 /// the source SCC to the target SCC will form a cycle out of precisely
479 /// these SCCs. Thus we can merge all of the SCCs in this closed range into
482 /// This process has various important properties:
483 /// - Only mutates the SCCs when adding the edge actually changes the SCC
485 /// - Never mutates SCCs which are unaffected by the change.
486 /// - Updates the postorder sequence to correctly satisfy the postorder
487 /// constraint after the edge is inserted.
488 /// - Only reorders SCCs in the closed postorder sequence from the source to
489 /// the target, so easy to bound how much has changed even in the ordering.
490 /// - Big-O is the number of edges in the closed postorder range of SCCs from
491 /// source to target.
493 /// This helper routine, in addition to updating the postorder sequence itself
494 /// will also update a map from SCCs to indices within that sequence.
496 /// The sequence and the map must operate on pointers to the SCC type.
498 /// Two callbacks must be provided. The first computes the subset of SCCs in
499 /// the postorder closed range from the source to the target which connect to
500 /// the source SCC via some (transitive) set of edges. The second computes the
501 /// subset of the same range which the target SCC connects to via some
502 /// (transitive) set of edges. Both callbacks should populate the set argument
504 template <typename SCCT
, typename PostorderSequenceT
, typename SCCIndexMapT
,
505 typename ComputeSourceConnectedSetCallableT
,
506 typename ComputeTargetConnectedSetCallableT
>
507 static iterator_range
<typename
PostorderSequenceT::iterator
>
508 updatePostorderSequenceForEdgeInsertion(
509 SCCT
&SourceSCC
, SCCT
&TargetSCC
, PostorderSequenceT
&SCCs
,
510 SCCIndexMapT
&SCCIndices
,
511 ComputeSourceConnectedSetCallableT ComputeSourceConnectedSet
,
512 ComputeTargetConnectedSetCallableT ComputeTargetConnectedSet
) {
513 int SourceIdx
= SCCIndices
[&SourceSCC
];
514 int TargetIdx
= SCCIndices
[&TargetSCC
];
515 assert(SourceIdx
< TargetIdx
&& "Cannot have equal indices here!");
517 SmallPtrSet
<SCCT
*, 4> ConnectedSet
;
519 // Compute the SCCs which (transitively) reach the source.
520 ComputeSourceConnectedSet(ConnectedSet
);
522 // Partition the SCCs in this part of the port-order sequence so only SCCs
523 // connecting to the source remain between it and the target. This is
524 // a benign partition as it preserves postorder.
525 auto SourceI
= std::stable_partition(
526 SCCs
.begin() + SourceIdx
, SCCs
.begin() + TargetIdx
+ 1,
527 [&ConnectedSet
](SCCT
*C
) { return !ConnectedSet
.count(C
); });
528 for (int I
= SourceIdx
, E
= TargetIdx
+ 1; I
< E
; ++I
)
529 SCCIndices
.find(SCCs
[I
])->second
= I
;
531 // If the target doesn't connect to the source, then we've corrected the
532 // post-order and there are no cycles formed.
533 if (!ConnectedSet
.count(&TargetSCC
)) {
534 assert(SourceI
> (SCCs
.begin() + SourceIdx
) &&
535 "Must have moved the source to fix the post-order.");
536 assert(*std::prev(SourceI
) == &TargetSCC
&&
537 "Last SCC to move should have bene the target.");
539 // Return an empty range at the target SCC indicating there is nothing to
541 return make_range(std::prev(SourceI
), std::prev(SourceI
));
544 assert(SCCs
[TargetIdx
] == &TargetSCC
&&
545 "Should not have moved target if connected!");
546 SourceIdx
= SourceI
- SCCs
.begin();
547 assert(SCCs
[SourceIdx
] == &SourceSCC
&&
548 "Bad updated index computation for the source SCC!");
550 // See whether there are any remaining intervening SCCs between the source
551 // and target. If so we need to make sure they all are reachable form the
553 if (SourceIdx
+ 1 < TargetIdx
) {
554 ConnectedSet
.clear();
555 ComputeTargetConnectedSet(ConnectedSet
);
557 // Partition SCCs so that only SCCs reached from the target remain between
558 // the source and the target. This preserves postorder.
559 auto TargetI
= std::stable_partition(
560 SCCs
.begin() + SourceIdx
+ 1, SCCs
.begin() + TargetIdx
+ 1,
561 [&ConnectedSet
](SCCT
*C
) { return ConnectedSet
.count(C
); });
562 for (int I
= SourceIdx
+ 1, E
= TargetIdx
+ 1; I
< E
; ++I
)
563 SCCIndices
.find(SCCs
[I
])->second
= I
;
564 TargetIdx
= std::prev(TargetI
) - SCCs
.begin();
565 assert(SCCs
[TargetIdx
] == &TargetSCC
&&
566 "Should always end with the target!");
569 // At this point, we know that connecting source to target forms a cycle
570 // because target connects back to source, and we know that all the SCCs
571 // between the source and target in the postorder sequence participate in that
573 return make_range(SCCs
.begin() + SourceIdx
, SCCs
.begin() + TargetIdx
);
576 bool LazyCallGraph::RefSCC::switchInternalEdgeToCall(
577 Node
&SourceN
, Node
&TargetN
,
578 function_ref
<void(ArrayRef
<SCC
*> MergeSCCs
)> MergeCB
) {
579 assert(!(*SourceN
)[TargetN
].isCall() && "Must start with a ref edge!");
580 SmallVector
<SCC
*, 1> DeletedSCCs
;
582 #ifdef EXPENSIVE_CHECKS
584 auto VerifyOnExit
= make_scope_exit([&]() { verify(); });
587 SCC
&SourceSCC
= *G
->lookupSCC(SourceN
);
588 SCC
&TargetSCC
= *G
->lookupSCC(TargetN
);
590 // If the two nodes are already part of the same SCC, we're also done as
591 // we've just added more connectivity.
592 if (&SourceSCC
== &TargetSCC
) {
593 SourceN
->setEdgeKind(TargetN
, Edge::Call
);
594 return false; // No new cycle.
597 // At this point we leverage the postorder list of SCCs to detect when the
598 // insertion of an edge changes the SCC structure in any way.
600 // First and foremost, we can eliminate the need for any changes when the
601 // edge is toward the beginning of the postorder sequence because all edges
602 // flow in that direction already. Thus adding a new one cannot form a cycle.
603 int SourceIdx
= SCCIndices
[&SourceSCC
];
604 int TargetIdx
= SCCIndices
[&TargetSCC
];
605 if (TargetIdx
< SourceIdx
) {
606 SourceN
->setEdgeKind(TargetN
, Edge::Call
);
607 return false; // No new cycle.
610 // Compute the SCCs which (transitively) reach the source.
611 auto ComputeSourceConnectedSet
= [&](SmallPtrSetImpl
<SCC
*> &ConnectedSet
) {
612 #ifdef EXPENSIVE_CHECKS
613 // Check that the RefSCC is still valid before computing this as the
614 // results will be nonsensical of we've broken its invariants.
617 ConnectedSet
.insert(&SourceSCC
);
618 auto IsConnected
= [&](SCC
&C
) {
620 for (Edge
&E
: N
->calls())
621 if (ConnectedSet
.count(G
->lookupSCC(E
.getNode())))
628 make_range(SCCs
.begin() + SourceIdx
+ 1, SCCs
.begin() + TargetIdx
+ 1))
630 ConnectedSet
.insert(C
);
633 // Use a normal worklist to find which SCCs the target connects to. We still
634 // bound the search based on the range in the postorder list we care about,
635 // but because this is forward connectivity we just "recurse" through the
637 auto ComputeTargetConnectedSet
= [&](SmallPtrSetImpl
<SCC
*> &ConnectedSet
) {
638 #ifdef EXPENSIVE_CHECKS
639 // Check that the RefSCC is still valid before computing this as the
640 // results will be nonsensical of we've broken its invariants.
643 ConnectedSet
.insert(&TargetSCC
);
644 SmallVector
<SCC
*, 4> Worklist
;
645 Worklist
.push_back(&TargetSCC
);
647 SCC
&C
= *Worklist
.pop_back_val();
652 SCC
&EdgeC
= *G
->lookupSCC(E
.getNode());
653 if (&EdgeC
.getOuterRefSCC() != this)
654 // Not in this RefSCC...
656 if (SCCIndices
.find(&EdgeC
)->second
<= SourceIdx
)
657 // Not in the postorder sequence between source and target.
660 if (ConnectedSet
.insert(&EdgeC
).second
)
661 Worklist
.push_back(&EdgeC
);
663 } while (!Worklist
.empty());
666 // Use a generic helper to update the postorder sequence of SCCs and return
667 // a range of any SCCs connected into a cycle by inserting this edge. This
668 // routine will also take care of updating the indices into the postorder
670 auto MergeRange
= updatePostorderSequenceForEdgeInsertion(
671 SourceSCC
, TargetSCC
, SCCs
, SCCIndices
, ComputeSourceConnectedSet
,
672 ComputeTargetConnectedSet
);
674 // Run the user's callback on the merged SCCs before we actually merge them.
676 MergeCB(ArrayRef(MergeRange
.begin(), MergeRange
.end()));
678 // If the merge range is empty, then adding the edge didn't actually form any
679 // new cycles. We're done.
680 if (MergeRange
.empty()) {
681 // Now that the SCC structure is finalized, flip the kind to call.
682 SourceN
->setEdgeKind(TargetN
, Edge::Call
);
683 return false; // No new cycle.
686 #ifdef EXPENSIVE_CHECKS
687 // Before merging, check that the RefSCC remains valid after all the
688 // postorder updates.
692 // Otherwise we need to merge all the SCCs in the cycle into a single result
695 // NB: We merge into the target because all of these functions were already
696 // reachable from the target, meaning any SCC-wide properties deduced about it
697 // other than the set of functions within it will not have changed.
698 for (SCC
*C
: MergeRange
) {
699 assert(C
!= &TargetSCC
&&
700 "We merge *into* the target and shouldn't process it here!");
702 TargetSCC
.Nodes
.append(C
->Nodes
.begin(), C
->Nodes
.end());
703 for (Node
*N
: C
->Nodes
)
704 G
->SCCMap
[N
] = &TargetSCC
;
706 DeletedSCCs
.push_back(C
);
709 // Erase the merged SCCs from the list and update the indices of the
711 int IndexOffset
= MergeRange
.end() - MergeRange
.begin();
712 auto EraseEnd
= SCCs
.erase(MergeRange
.begin(), MergeRange
.end());
713 for (SCC
*C
: make_range(EraseEnd
, SCCs
.end()))
714 SCCIndices
[C
] -= IndexOffset
;
716 // Now that the SCC structure is finalized, flip the kind to call.
717 SourceN
->setEdgeKind(TargetN
, Edge::Call
);
719 // And we're done, but we did form a new cycle.
723 void LazyCallGraph::RefSCC::switchTrivialInternalEdgeToRef(Node
&SourceN
,
725 assert((*SourceN
)[TargetN
].isCall() && "Must start with a call edge!");
727 #ifdef EXPENSIVE_CHECKS
729 auto VerifyOnExit
= make_scope_exit([&]() { verify(); });
732 assert(G
->lookupRefSCC(SourceN
) == this && "Source must be in this RefSCC.");
733 assert(G
->lookupRefSCC(TargetN
) == this && "Target must be in this RefSCC.");
734 assert(G
->lookupSCC(SourceN
) != G
->lookupSCC(TargetN
) &&
735 "Source and Target must be in separate SCCs for this to be trivial!");
737 // Set the edge kind.
738 SourceN
->setEdgeKind(TargetN
, Edge::Ref
);
741 iterator_range
<LazyCallGraph::RefSCC::iterator
>
742 LazyCallGraph::RefSCC::switchInternalEdgeToRef(Node
&SourceN
, Node
&TargetN
) {
743 assert((*SourceN
)[TargetN
].isCall() && "Must start with a call edge!");
745 #ifdef EXPENSIVE_CHECKS
747 auto VerifyOnExit
= make_scope_exit([&]() { verify(); });
750 assert(G
->lookupRefSCC(SourceN
) == this && "Source must be in this RefSCC.");
751 assert(G
->lookupRefSCC(TargetN
) == this && "Target must be in this RefSCC.");
753 SCC
&TargetSCC
= *G
->lookupSCC(TargetN
);
754 assert(G
->lookupSCC(SourceN
) == &TargetSCC
&& "Source and Target must be in "
755 "the same SCC to require the "
758 // Set the edge kind.
759 SourceN
->setEdgeKind(TargetN
, Edge::Ref
);
761 // Otherwise we are removing a call edge from a single SCC. This may break
762 // the cycle. In order to compute the new set of SCCs, we need to do a small
763 // DFS over the nodes within the SCC to form any sub-cycles that remain as
764 // distinct SCCs and compute a postorder over the resulting SCCs.
766 // However, we specially handle the target node. The target node is known to
767 // reach all other nodes in the original SCC by definition. This means that
768 // we want the old SCC to be replaced with an SCC containing that node as it
769 // will be the root of whatever SCC DAG results from the DFS. Assumptions
770 // about an SCC such as the set of functions called will continue to hold,
773 SCC
&OldSCC
= TargetSCC
;
774 SmallVector
<std::pair
<Node
*, EdgeSequence::call_iterator
>, 16> DFSStack
;
775 SmallVector
<Node
*, 16> PendingSCCStack
;
776 SmallVector
<SCC
*, 4> NewSCCs
;
778 // Prepare the nodes for a fresh DFS.
779 SmallVector
<Node
*, 16> Worklist
;
780 Worklist
.swap(OldSCC
.Nodes
);
781 for (Node
*N
: Worklist
) {
782 N
->DFSNumber
= N
->LowLink
= 0;
786 // Force the target node to be in the old SCC. This also enables us to take
787 // a very significant short-cut in the standard Tarjan walk to re-form SCCs
788 // below: whenever we build an edge that reaches the target node, we know
789 // that the target node eventually connects back to all other nodes in our
790 // walk. As a consequence, we can detect and handle participants in that
791 // cycle without walking all the edges that form this connection, and instead
792 // by relying on the fundamental guarantee coming into this operation (all
793 // nodes are reachable from the target due to previously forming an SCC).
794 TargetN
.DFSNumber
= TargetN
.LowLink
= -1;
795 OldSCC
.Nodes
.push_back(&TargetN
);
796 G
->SCCMap
[&TargetN
] = &OldSCC
;
798 // Scan down the stack and DFS across the call edges.
799 for (Node
*RootN
: Worklist
) {
800 assert(DFSStack
.empty() &&
801 "Cannot begin a new root with a non-empty DFS stack!");
802 assert(PendingSCCStack
.empty() &&
803 "Cannot begin a new root with pending nodes for an SCC!");
805 // Skip any nodes we've already reached in the DFS.
806 if (RootN
->DFSNumber
!= 0) {
807 assert(RootN
->DFSNumber
== -1 &&
808 "Shouldn't have any mid-DFS root nodes!");
812 RootN
->DFSNumber
= RootN
->LowLink
= 1;
813 int NextDFSNumber
= 2;
815 DFSStack
.emplace_back(RootN
, (*RootN
)->call_begin());
817 auto [N
, I
] = DFSStack
.pop_back_val();
818 auto E
= (*N
)->call_end();
820 Node
&ChildN
= I
->getNode();
821 if (ChildN
.DFSNumber
== 0) {
822 // We haven't yet visited this child, so descend, pushing the current
823 // node onto the stack.
824 DFSStack
.emplace_back(N
, I
);
826 assert(!G
->SCCMap
.count(&ChildN
) &&
827 "Found a node with 0 DFS number but already in an SCC!");
828 ChildN
.DFSNumber
= ChildN
.LowLink
= NextDFSNumber
++;
830 I
= (*N
)->call_begin();
831 E
= (*N
)->call_end();
835 // Check for the child already being part of some component.
836 if (ChildN
.DFSNumber
== -1) {
837 if (G
->lookupSCC(ChildN
) == &OldSCC
) {
838 // If the child is part of the old SCC, we know that it can reach
839 // every other node, so we have formed a cycle. Pull the entire DFS
840 // and pending stacks into it. See the comment above about setting
841 // up the old SCC for why we do this.
842 int OldSize
= OldSCC
.size();
843 OldSCC
.Nodes
.push_back(N
);
844 OldSCC
.Nodes
.append(PendingSCCStack
.begin(), PendingSCCStack
.end());
845 PendingSCCStack
.clear();
846 while (!DFSStack
.empty())
847 OldSCC
.Nodes
.push_back(DFSStack
.pop_back_val().first
);
848 for (Node
&N
: drop_begin(OldSCC
, OldSize
)) {
849 N
.DFSNumber
= N
.LowLink
= -1;
850 G
->SCCMap
[&N
] = &OldSCC
;
856 // If the child has already been added to some child component, it
857 // couldn't impact the low-link of this parent because it isn't
858 // connected, and thus its low-link isn't relevant so skip it.
863 // Track the lowest linked child as the lowest link for this node.
864 assert(ChildN
.LowLink
> 0 && "Must have a positive low-link number!");
865 if (ChildN
.LowLink
< N
->LowLink
)
866 N
->LowLink
= ChildN
.LowLink
;
868 // Move to the next edge.
872 // Cleared the DFS early, start another round.
875 // We've finished processing N and its descendants, put it on our pending
876 // SCC stack to eventually get merged into an SCC of nodes.
877 PendingSCCStack
.push_back(N
);
879 // If this node is linked to some lower entry, continue walking up the
881 if (N
->LowLink
!= N
->DFSNumber
)
884 // Otherwise, we've completed an SCC. Append it to our post order list of
886 int RootDFSNumber
= N
->DFSNumber
;
887 // Find the range of the node stack by walking down until we pass the
889 auto SCCNodes
= make_range(
890 PendingSCCStack
.rbegin(),
891 find_if(reverse(PendingSCCStack
), [RootDFSNumber
](const Node
*N
) {
892 return N
->DFSNumber
< RootDFSNumber
;
895 // Form a new SCC out of these nodes and then clear them off our pending
897 NewSCCs
.push_back(G
->createSCC(*this, SCCNodes
));
898 for (Node
&N
: *NewSCCs
.back()) {
899 N
.DFSNumber
= N
.LowLink
= -1;
900 G
->SCCMap
[&N
] = NewSCCs
.back();
902 PendingSCCStack
.erase(SCCNodes
.end().base(), PendingSCCStack
.end());
903 } while (!DFSStack
.empty());
906 // Insert the remaining SCCs before the old one. The old SCC can reach all
907 // other SCCs we form because it contains the target node of the removed edge
908 // of the old SCC. This means that we will have edges into all the new SCCs,
909 // which means the old one must come last for postorder.
910 int OldIdx
= SCCIndices
[&OldSCC
];
911 SCCs
.insert(SCCs
.begin() + OldIdx
, NewSCCs
.begin(), NewSCCs
.end());
913 // Update the mapping from SCC* to index to use the new SCC*s, and remove the
914 // old SCC from the mapping.
915 for (int Idx
= OldIdx
, Size
= SCCs
.size(); Idx
< Size
; ++Idx
)
916 SCCIndices
[SCCs
[Idx
]] = Idx
;
918 return make_range(SCCs
.begin() + OldIdx
,
919 SCCs
.begin() + OldIdx
+ NewSCCs
.size());
922 void LazyCallGraph::RefSCC::switchOutgoingEdgeToCall(Node
&SourceN
,
924 assert(!(*SourceN
)[TargetN
].isCall() && "Must start with a ref edge!");
926 assert(G
->lookupRefSCC(SourceN
) == this && "Source must be in this RefSCC.");
927 assert(G
->lookupRefSCC(TargetN
) != this &&
928 "Target must not be in this RefSCC.");
929 #ifdef EXPENSIVE_CHECKS
930 assert(G
->lookupRefSCC(TargetN
)->isDescendantOf(*this) &&
931 "Target must be a descendant of the Source.");
934 // Edges between RefSCCs are the same regardless of call or ref, so we can
935 // just flip the edge here.
936 SourceN
->setEdgeKind(TargetN
, Edge::Call
);
938 #ifdef EXPENSIVE_CHECKS
943 void LazyCallGraph::RefSCC::switchOutgoingEdgeToRef(Node
&SourceN
,
945 assert((*SourceN
)[TargetN
].isCall() && "Must start with a call edge!");
947 assert(G
->lookupRefSCC(SourceN
) == this && "Source must be in this RefSCC.");
948 assert(G
->lookupRefSCC(TargetN
) != this &&
949 "Target must not be in this RefSCC.");
950 #ifdef EXPENSIVE_CHECKS
951 assert(G
->lookupRefSCC(TargetN
)->isDescendantOf(*this) &&
952 "Target must be a descendant of the Source.");
955 // Edges between RefSCCs are the same regardless of call or ref, so we can
956 // just flip the edge here.
957 SourceN
->setEdgeKind(TargetN
, Edge::Ref
);
959 #ifdef EXPENSIVE_CHECKS
964 void LazyCallGraph::RefSCC::insertInternalRefEdge(Node
&SourceN
,
966 assert(G
->lookupRefSCC(SourceN
) == this && "Source must be in this RefSCC.");
967 assert(G
->lookupRefSCC(TargetN
) == this && "Target must be in this RefSCC.");
969 SourceN
->insertEdgeInternal(TargetN
, Edge::Ref
);
971 #ifdef EXPENSIVE_CHECKS
976 void LazyCallGraph::RefSCC::insertOutgoingEdge(Node
&SourceN
, Node
&TargetN
,
978 // First insert it into the caller.
979 SourceN
->insertEdgeInternal(TargetN
, EK
);
981 assert(G
->lookupRefSCC(SourceN
) == this && "Source must be in this RefSCC.");
983 assert(G
->lookupRefSCC(TargetN
) != this &&
984 "Target must not be in this RefSCC.");
985 #ifdef EXPENSIVE_CHECKS
986 assert(G
->lookupRefSCC(TargetN
)->isDescendantOf(*this) &&
987 "Target must be a descendant of the Source.");
990 #ifdef EXPENSIVE_CHECKS
995 SmallVector
<LazyCallGraph::RefSCC
*, 1>
996 LazyCallGraph::RefSCC::insertIncomingRefEdge(Node
&SourceN
, Node
&TargetN
) {
997 assert(G
->lookupRefSCC(TargetN
) == this && "Target must be in this RefSCC.");
998 RefSCC
&SourceC
= *G
->lookupRefSCC(SourceN
);
999 assert(&SourceC
!= this && "Source must not be in this RefSCC.");
1000 #ifdef EXPENSIVE_CHECKS
1001 assert(SourceC
.isDescendantOf(*this) &&
1002 "Source must be a descendant of the Target.");
1005 SmallVector
<RefSCC
*, 1> DeletedRefSCCs
;
1007 #ifdef EXPENSIVE_CHECKS
1009 auto VerifyOnExit
= make_scope_exit([&]() { verify(); });
1012 int SourceIdx
= G
->RefSCCIndices
[&SourceC
];
1013 int TargetIdx
= G
->RefSCCIndices
[this];
1014 assert(SourceIdx
< TargetIdx
&&
1015 "Postorder list doesn't see edge as incoming!");
1017 // Compute the RefSCCs which (transitively) reach the source. We do this by
1018 // working backwards from the source using the parent set in each RefSCC,
1019 // skipping any RefSCCs that don't fall in the postorder range. This has the
1020 // advantage of walking the sparser parent edge (in high fan-out graphs) but
1021 // more importantly this removes examining all forward edges in all RefSCCs
1022 // within the postorder range which aren't in fact connected. Only connected
1023 // RefSCCs (and their edges) are visited here.
1024 auto ComputeSourceConnectedSet
= [&](SmallPtrSetImpl
<RefSCC
*> &Set
) {
1025 Set
.insert(&SourceC
);
1026 auto IsConnected
= [&](RefSCC
&RC
) {
1030 if (Set
.count(G
->lookupRefSCC(E
.getNode())))
1036 for (RefSCC
*C
: make_range(G
->PostOrderRefSCCs
.begin() + SourceIdx
+ 1,
1037 G
->PostOrderRefSCCs
.begin() + TargetIdx
+ 1))
1038 if (IsConnected(*C
))
1042 // Use a normal worklist to find which SCCs the target connects to. We still
1043 // bound the search based on the range in the postorder list we care about,
1044 // but because this is forward connectivity we just "recurse" through the
1046 auto ComputeTargetConnectedSet
= [&](SmallPtrSetImpl
<RefSCC
*> &Set
) {
1048 SmallVector
<RefSCC
*, 4> Worklist
;
1049 Worklist
.push_back(this);
1051 RefSCC
&RC
= *Worklist
.pop_back_val();
1054 for (Edge
&E
: *N
) {
1055 RefSCC
&EdgeRC
= *G
->lookupRefSCC(E
.getNode());
1056 if (G
->getRefSCCIndex(EdgeRC
) <= SourceIdx
)
1057 // Not in the postorder sequence between source and target.
1060 if (Set
.insert(&EdgeRC
).second
)
1061 Worklist
.push_back(&EdgeRC
);
1063 } while (!Worklist
.empty());
1066 // Use a generic helper to update the postorder sequence of RefSCCs and return
1067 // a range of any RefSCCs connected into a cycle by inserting this edge. This
1068 // routine will also take care of updating the indices into the postorder
1070 iterator_range
<SmallVectorImpl
<RefSCC
*>::iterator
> MergeRange
=
1071 updatePostorderSequenceForEdgeInsertion(
1072 SourceC
, *this, G
->PostOrderRefSCCs
, G
->RefSCCIndices
,
1073 ComputeSourceConnectedSet
, ComputeTargetConnectedSet
);
1075 // Build a set, so we can do fast tests for whether a RefSCC will end up as
1076 // part of the merged RefSCC.
1077 SmallPtrSet
<RefSCC
*, 16> MergeSet(MergeRange
.begin(), MergeRange
.end());
1079 // This RefSCC will always be part of that set, so just insert it here.
1080 MergeSet
.insert(this);
1082 // Now that we have identified all the SCCs which need to be merged into
1083 // a connected set with the inserted edge, merge all of them into this SCC.
1084 SmallVector
<SCC
*, 16> MergedSCCs
;
1086 for (RefSCC
*RC
: MergeRange
) {
1087 assert(RC
!= this && "We're merging into the target RefSCC, so it "
1088 "shouldn't be in the range.");
1090 // Walk the inner SCCs to update their up-pointer and walk all the edges to
1091 // update any parent sets.
1092 // FIXME: We should try to find a way to avoid this (rather expensive) edge
1093 // walk by updating the parent sets in some other manner.
1094 for (SCC
&InnerC
: *RC
) {
1095 InnerC
.OuterRefSCC
= this;
1096 SCCIndices
[&InnerC
] = SCCIndex
++;
1097 for (Node
&N
: InnerC
)
1098 G
->SCCMap
[&N
] = &InnerC
;
1101 // Now merge in the SCCs. We can actually move here so try to reuse storage
1102 // the first time through.
1103 if (MergedSCCs
.empty())
1104 MergedSCCs
= std::move(RC
->SCCs
);
1106 MergedSCCs
.append(RC
->SCCs
.begin(), RC
->SCCs
.end());
1108 DeletedRefSCCs
.push_back(RC
);
1111 // Append our original SCCs to the merged list and move it into place.
1112 for (SCC
&InnerC
: *this)
1113 SCCIndices
[&InnerC
] = SCCIndex
++;
1114 MergedSCCs
.append(SCCs
.begin(), SCCs
.end());
1115 SCCs
= std::move(MergedSCCs
);
1117 // Remove the merged away RefSCCs from the post order sequence.
1118 for (RefSCC
*RC
: MergeRange
)
1119 G
->RefSCCIndices
.erase(RC
);
1120 int IndexOffset
= MergeRange
.end() - MergeRange
.begin();
1122 G
->PostOrderRefSCCs
.erase(MergeRange
.begin(), MergeRange
.end());
1123 for (RefSCC
*RC
: make_range(EraseEnd
, G
->PostOrderRefSCCs
.end()))
1124 G
->RefSCCIndices
[RC
] -= IndexOffset
;
1126 // At this point we have a merged RefSCC with a post-order SCCs list, just
1127 // connect the nodes to form the new edge.
1128 SourceN
->insertEdgeInternal(TargetN
, Edge::Ref
);
1130 // We return the list of SCCs which were merged so that callers can
1131 // invalidate any data they have associated with those SCCs. Note that these
1132 // SCCs are no longer in an interesting state (they are totally empty) but
1133 // the pointers will remain stable for the life of the graph itself.
1134 return DeletedRefSCCs
;
1137 void LazyCallGraph::RefSCC::removeOutgoingEdge(Node
&SourceN
, Node
&TargetN
) {
1138 assert(G
->lookupRefSCC(SourceN
) == this &&
1139 "The source must be a member of this RefSCC.");
1140 assert(G
->lookupRefSCC(TargetN
) != this &&
1141 "The target must not be a member of this RefSCC");
1143 #ifdef EXPENSIVE_CHECKS
1145 auto VerifyOnExit
= make_scope_exit([&]() { verify(); });
1148 // First remove it from the node.
1149 bool Removed
= SourceN
->removeEdgeInternal(TargetN
);
1151 assert(Removed
&& "Target not in the edge set for this caller?");
1154 SmallVector
<LazyCallGraph::RefSCC
*, 1>
1155 LazyCallGraph::RefSCC::removeInternalRefEdge(Node
&SourceN
,
1156 ArrayRef
<Node
*> TargetNs
) {
1157 // We return a list of the resulting *new* RefSCCs in post-order.
1158 SmallVector
<RefSCC
*, 1> Result
;
1160 #ifdef EXPENSIVE_CHECKS
1161 // Verify the RefSCC is valid to start with and that either we return an empty
1162 // list of result RefSCCs and this RefSCC remains valid, or we return new
1163 // RefSCCs and this RefSCC is dead.
1165 auto VerifyOnExit
= make_scope_exit([&]() {
1166 // If we didn't replace our RefSCC with new ones, check that this one
1173 // First remove the actual edges.
1174 for (Node
*TargetN
: TargetNs
) {
1175 assert(!(*SourceN
)[*TargetN
].isCall() &&
1176 "Cannot remove a call edge, it must first be made a ref edge");
1178 bool Removed
= SourceN
->removeEdgeInternal(*TargetN
);
1180 assert(Removed
&& "Target not in the edge set for this caller?");
1183 // Direct self references don't impact the ref graph at all.
1184 if (llvm::all_of(TargetNs
,
1185 [&](Node
*TargetN
) { return &SourceN
== TargetN
; }))
1188 // If all targets are in the same SCC as the source, because no call edges
1189 // were removed there is no RefSCC structure change.
1190 SCC
&SourceC
= *G
->lookupSCC(SourceN
);
1191 if (llvm::all_of(TargetNs
, [&](Node
*TargetN
) {
1192 return G
->lookupSCC(*TargetN
) == &SourceC
;
1196 // We build somewhat synthetic new RefSCCs by providing a postorder mapping
1197 // for each inner SCC. We store these inside the low-link field of the nodes
1198 // rather than associated with SCCs because this saves a round-trip through
1199 // the node->SCC map and in the common case, SCCs are small. We will verify
1200 // that we always give the same number to every node in the SCC such that
1201 // these are equivalent.
1202 int PostOrderNumber
= 0;
1204 // Reset all the other nodes to prepare for a DFS over them, and add them to
1206 SmallVector
<Node
*, 8> Worklist
;
1207 for (SCC
*C
: SCCs
) {
1209 N
.DFSNumber
= N
.LowLink
= 0;
1211 Worklist
.append(C
->Nodes
.begin(), C
->Nodes
.end());
1214 // Track the number of nodes in this RefSCC so that we can quickly recognize
1215 // an important special case of the edge removal not breaking the cycle of
1217 const int NumRefSCCNodes
= Worklist
.size();
1219 SmallVector
<std::pair
<Node
*, EdgeSequence::iterator
>, 4> DFSStack
;
1220 SmallVector
<Node
*, 4> PendingRefSCCStack
;
1222 assert(DFSStack
.empty() &&
1223 "Cannot begin a new root with a non-empty DFS stack!");
1224 assert(PendingRefSCCStack
.empty() &&
1225 "Cannot begin a new root with pending nodes for an SCC!");
1227 Node
*RootN
= Worklist
.pop_back_val();
1228 // Skip any nodes we've already reached in the DFS.
1229 if (RootN
->DFSNumber
!= 0) {
1230 assert(RootN
->DFSNumber
== -1 &&
1231 "Shouldn't have any mid-DFS root nodes!");
1235 RootN
->DFSNumber
= RootN
->LowLink
= 1;
1236 int NextDFSNumber
= 2;
1238 DFSStack
.emplace_back(RootN
, (*RootN
)->begin());
1240 auto [N
, I
] = DFSStack
.pop_back_val();
1241 auto E
= (*N
)->end();
1243 assert(N
->DFSNumber
!= 0 && "We should always assign a DFS number "
1244 "before processing a node.");
1247 Node
&ChildN
= I
->getNode();
1248 if (ChildN
.DFSNumber
== 0) {
1249 // Mark that we should start at this child when next this node is the
1250 // top of the stack. We don't start at the next child to ensure this
1251 // child's lowlink is reflected.
1252 DFSStack
.emplace_back(N
, I
);
1254 // Continue, resetting to the child node.
1255 ChildN
.LowLink
= ChildN
.DFSNumber
= NextDFSNumber
++;
1257 I
= ChildN
->begin();
1261 if (ChildN
.DFSNumber
== -1) {
1262 // If this child isn't currently in this RefSCC, no need to process
1268 // Track the lowest link of the children, if any are still in the stack.
1269 // Any child not on the stack will have a LowLink of -1.
1270 assert(ChildN
.LowLink
!= 0 &&
1271 "Low-link must not be zero with a non-zero DFS number.");
1272 if (ChildN
.LowLink
>= 0 && ChildN
.LowLink
< N
->LowLink
)
1273 N
->LowLink
= ChildN
.LowLink
;
1277 // We've finished processing N and its descendants, put it on our pending
1278 // stack to eventually get merged into a RefSCC.
1279 PendingRefSCCStack
.push_back(N
);
1281 // If this node is linked to some lower entry, continue walking up the
1283 if (N
->LowLink
!= N
->DFSNumber
) {
1284 assert(!DFSStack
.empty() &&
1285 "We never found a viable root for a RefSCC to pop off!");
1289 // Otherwise, form a new RefSCC from the top of the pending node stack.
1290 int RefSCCNumber
= PostOrderNumber
++;
1291 int RootDFSNumber
= N
->DFSNumber
;
1293 // Find the range of the node stack by walking down until we pass the
1294 // root DFS number. Update the DFS numbers and low link numbers in the
1295 // process to avoid re-walking this list where possible.
1296 auto StackRI
= find_if(reverse(PendingRefSCCStack
), [&](Node
*N
) {
1297 if (N
->DFSNumber
< RootDFSNumber
)
1298 // We've found the bottom.
1301 // Update this node and keep scanning.
1303 // Save the post-order number in the lowlink field so that we can use
1304 // it to map SCCs into new RefSCCs after we finish the DFS.
1305 N
->LowLink
= RefSCCNumber
;
1308 auto RefSCCNodes
= make_range(StackRI
.base(), PendingRefSCCStack
.end());
1310 // If we find a cycle containing all nodes originally in this RefSCC then
1311 // the removal hasn't changed the structure at all. This is an important
1312 // special case, and we can directly exit the entire routine more
1313 // efficiently as soon as we discover it.
1314 if (llvm::size(RefSCCNodes
) == NumRefSCCNodes
) {
1315 // Clear out the low link field as we won't need it.
1316 for (Node
*N
: RefSCCNodes
)
1318 // Return the empty result immediately.
1322 // We've already marked the nodes internally with the RefSCC number so
1323 // just clear them off the stack and continue.
1324 PendingRefSCCStack
.erase(RefSCCNodes
.begin(), PendingRefSCCStack
.end());
1325 } while (!DFSStack
.empty());
1327 assert(DFSStack
.empty() && "Didn't flush the entire DFS stack!");
1328 assert(PendingRefSCCStack
.empty() && "Didn't flush all pending nodes!");
1329 } while (!Worklist
.empty());
1331 assert(PostOrderNumber
> 1 &&
1332 "Should never finish the DFS when the existing RefSCC remains valid!");
1334 // Otherwise we create a collection of new RefSCC nodes and build
1335 // a radix-sort style map from postorder number to these new RefSCCs. We then
1336 // append SCCs to each of these RefSCCs in the order they occurred in the
1337 // original SCCs container.
1338 for (int I
= 0; I
< PostOrderNumber
; ++I
)
1339 Result
.push_back(G
->createRefSCC(*G
));
1341 // Insert the resulting postorder sequence into the global graph postorder
1342 // sequence before the current RefSCC in that sequence, and then remove the
1345 // FIXME: It'd be nice to change the APIs so that we returned an iterator
1346 // range over the global postorder sequence and generally use that sequence
1347 // rather than building a separate result vector here.
1348 int Idx
= G
->getRefSCCIndex(*this);
1349 G
->PostOrderRefSCCs
.erase(G
->PostOrderRefSCCs
.begin() + Idx
);
1350 G
->PostOrderRefSCCs
.insert(G
->PostOrderRefSCCs
.begin() + Idx
, Result
.begin(),
1352 for (int I
: seq
<int>(Idx
, G
->PostOrderRefSCCs
.size()))
1353 G
->RefSCCIndices
[G
->PostOrderRefSCCs
[I
]] = I
;
1355 for (SCC
*C
: SCCs
) {
1356 // We store the SCC number in the node's low-link field above.
1357 int SCCNumber
= C
->begin()->LowLink
;
1358 // Clear out all the SCC's node's low-link fields now that we're done
1359 // using them as side-storage.
1360 for (Node
&N
: *C
) {
1361 assert(N
.LowLink
== SCCNumber
&&
1362 "Cannot have different numbers for nodes in the same SCC!");
1366 RefSCC
&RC
= *Result
[SCCNumber
];
1367 int SCCIndex
= RC
.SCCs
.size();
1368 RC
.SCCs
.push_back(C
);
1369 RC
.SCCIndices
[C
] = SCCIndex
;
1370 C
->OuterRefSCC
= &RC
;
1373 // Now that we've moved things into the new RefSCCs, clear out our current
1379 #ifdef EXPENSIVE_CHECKS
1380 // Verify the new RefSCCs we've built.
1381 for (RefSCC
*RC
: Result
)
1385 // Return the new list of SCCs.
1389 void LazyCallGraph::RefSCC::insertTrivialCallEdge(Node
&SourceN
,
1391 #ifdef EXPENSIVE_CHECKS
1392 auto ExitVerifier
= make_scope_exit([this] { verify(); });
1394 // Check that we aren't breaking some invariants of the SCC graph. Note that
1395 // this is quadratic in the number of edges in the call graph!
1396 SCC
&SourceC
= *G
->lookupSCC(SourceN
);
1397 SCC
&TargetC
= *G
->lookupSCC(TargetN
);
1398 if (&SourceC
!= &TargetC
)
1399 assert(SourceC
.isAncestorOf(TargetC
) &&
1400 "Call edge is not trivial in the SCC graph!");
1403 // First insert it into the source or find the existing edge.
1404 auto [Iterator
, Inserted
] =
1405 SourceN
->EdgeIndexMap
.try_emplace(&TargetN
, SourceN
->Edges
.size());
1407 // Already an edge, just update it.
1408 Edge
&E
= SourceN
->Edges
[Iterator
->second
];
1410 return; // Nothing to do!
1411 E
.setKind(Edge::Call
);
1413 // Create the new edge.
1414 SourceN
->Edges
.emplace_back(TargetN
, Edge::Call
);
1418 void LazyCallGraph::RefSCC::insertTrivialRefEdge(Node
&SourceN
, Node
&TargetN
) {
1419 #ifdef EXPENSIVE_CHECKS
1420 auto ExitVerifier
= make_scope_exit([this] { verify(); });
1422 // Check that we aren't breaking some invariants of the RefSCC graph.
1423 RefSCC
&SourceRC
= *G
->lookupRefSCC(SourceN
);
1424 RefSCC
&TargetRC
= *G
->lookupRefSCC(TargetN
);
1425 if (&SourceRC
!= &TargetRC
)
1426 assert(SourceRC
.isAncestorOf(TargetRC
) &&
1427 "Ref edge is not trivial in the RefSCC graph!");
1430 // First insert it into the source or find the existing edge.
1431 auto [Iterator
, Inserted
] =
1432 SourceN
->EdgeIndexMap
.try_emplace(&TargetN
, SourceN
->Edges
.size());
1435 // Already an edge, we're done.
1438 // Create the new edge.
1439 SourceN
->Edges
.emplace_back(TargetN
, Edge::Ref
);
1442 void LazyCallGraph::RefSCC::replaceNodeFunction(Node
&N
, Function
&NewF
) {
1443 Function
&OldF
= N
.getFunction();
1445 #ifdef EXPENSIVE_CHECKS
1446 auto ExitVerifier
= make_scope_exit([this] { verify(); });
1448 assert(G
->lookupRefSCC(N
) == this &&
1449 "Cannot replace the function of a node outside this RefSCC.");
1451 assert(G
->NodeMap
.find(&NewF
) == G
->NodeMap
.end() &&
1452 "Must not have already walked the new function!'");
1454 // It is important that this replacement not introduce graph changes so we
1455 // insist that the caller has already removed every use of the original
1456 // function and that all uses of the new function correspond to existing
1457 // edges in the graph. The common and expected way to use this is when
1458 // replacing the function itself in the IR without changing the call graph
1459 // shape and just updating the analysis based on that.
1460 assert(&OldF
!= &NewF
&& "Cannot replace a function with itself!");
1461 assert(OldF
.use_empty() &&
1462 "Must have moved all uses from the old function to the new!");
1465 N
.replaceFunction(NewF
);
1467 // Update various call graph maps.
1468 G
->NodeMap
.erase(&OldF
);
1469 G
->NodeMap
[&NewF
] = &N
;
1471 // Update lib functions.
1472 if (G
->isLibFunction(OldF
)) {
1473 G
->LibFunctions
.remove(&OldF
);
1474 G
->LibFunctions
.insert(&NewF
);
1478 void LazyCallGraph::insertEdge(Node
&SourceN
, Node
&TargetN
, Edge::Kind EK
) {
1479 assert(SCCMap
.empty() &&
1480 "This method cannot be called after SCCs have been formed!");
1482 return SourceN
->insertEdgeInternal(TargetN
, EK
);
1485 void LazyCallGraph::removeEdge(Node
&SourceN
, Node
&TargetN
) {
1486 assert(SCCMap
.empty() &&
1487 "This method cannot be called after SCCs have been formed!");
1489 bool Removed
= SourceN
->removeEdgeInternal(TargetN
);
1491 assert(Removed
&& "Target not in the edge set for this caller?");
1494 void LazyCallGraph::removeDeadFunction(Function
&F
) {
1495 // FIXME: This is unnecessarily restrictive. We should be able to remove
1496 // functions which recursively call themselves.
1497 assert(F
.hasZeroLiveUses() &&
1498 "This routine should only be called on trivially dead functions!");
1500 // We shouldn't remove library functions as they are never really dead while
1501 // the call graph is in use -- every function definition refers to them.
1502 assert(!isLibFunction(F
) &&
1503 "Must not remove lib functions from the call graph!");
1505 auto NI
= NodeMap
.find(&F
);
1506 if (NI
== NodeMap
.end())
1507 // Not in the graph at all!
1510 Node
&N
= *NI
->second
;
1512 // Cannot remove a function which has yet to be visited in the DFS walk, so
1513 // if we have a node at all then we must have an SCC and RefSCC.
1514 auto CI
= SCCMap
.find(&N
);
1515 assert(CI
!= SCCMap
.end() &&
1516 "Tried to remove a node without an SCC after DFS walk started!");
1517 SCC
&C
= *CI
->second
;
1518 RefSCC
*RC
= &C
.getOuterRefSCC();
1520 // In extremely rare cases, we can delete a dead function which is still in a
1521 // non-trivial RefSCC. This can happen due to spurious ref edges sticking
1522 // around after an IR function reference is removed.
1523 if (RC
->size() != 1) {
1524 SmallVector
<Node
*, 0> NodesInRC
;
1525 for (SCC
&OtherC
: *RC
) {
1526 for (Node
&OtherN
: OtherC
)
1527 NodesInRC
.push_back(&OtherN
);
1529 for (Node
*OtherN
: NodesInRC
) {
1530 if ((*OtherN
)->lookup(N
)) {
1532 RC
->removeInternalRefEdge(*OtherN
, ArrayRef
<Node
*>(&N
));
1533 // If we've split into multiple RefSCCs, RC is now invalid and the
1534 // RefSCC containing C will be different.
1535 if (!NewRefSCCs
.empty())
1536 RC
= &C
.getOuterRefSCC();
1542 EntryEdges
.removeEdgeInternal(N
);
1545 // This node must be the only member of its SCC as it has no callers, and
1546 // that SCC must be the only member of a RefSCC as it has no references.
1547 // Validate these properties first.
1548 assert(C
.size() == 1 && "Dead functions must be in a singular SCC");
1549 assert(RC
->size() == 1 && "Dead functions must be in a singular RefSCC");
1551 // Finally clear out all the data structures from the node down through the
1552 // components. postorder_ref_scc_iterator will skip empty RefSCCs, so no need
1553 // to adjust LazyCallGraph data structures.
1561 // Nothing to delete as all the objects are allocated in stable bump pointer
1565 // Gets the Edge::Kind from one function to another by looking at the function's
1566 // instructions. Asserts if there is no edge.
1567 // Useful for determining what type of edge should exist between functions when
1568 // the edge hasn't been created yet.
1569 static LazyCallGraph::Edge::Kind
getEdgeKind(Function
&OriginalFunction
,
1570 Function
&NewFunction
) {
1571 // In release builds, assume that if there are no direct calls to the new
1572 // function, then there is a ref edge. In debug builds, keep track of
1573 // references to assert that there is actually a ref edge if there is no call
1576 SmallVector
<Constant
*, 16> Worklist
;
1577 SmallPtrSet
<Constant
*, 16> Visited
;
1580 for (Instruction
&I
: instructions(OriginalFunction
)) {
1581 if (auto *CB
= dyn_cast
<CallBase
>(&I
)) {
1582 if (Function
*Callee
= CB
->getCalledFunction()) {
1583 if (Callee
== &NewFunction
)
1584 return LazyCallGraph::Edge::Kind::Call
;
1588 for (Value
*Op
: I
.operand_values()) {
1589 if (Constant
*C
= dyn_cast
<Constant
>(Op
)) {
1590 if (Visited
.insert(C
).second
)
1591 Worklist
.push_back(C
);
1598 bool FoundNewFunction
= false;
1599 LazyCallGraph::visitReferences(Worklist
, Visited
, [&](Function
&F
) {
1600 if (&F
== &NewFunction
)
1601 FoundNewFunction
= true;
1603 assert(FoundNewFunction
&& "No edge from original function to new function");
1606 return LazyCallGraph::Edge::Kind::Ref
;
1609 void LazyCallGraph::addSplitFunction(Function
&OriginalFunction
,
1610 Function
&NewFunction
) {
1611 assert(lookup(OriginalFunction
) &&
1612 "Original function's node should already exist");
1613 Node
&OriginalN
= get(OriginalFunction
);
1614 SCC
*OriginalC
= lookupSCC(OriginalN
);
1615 RefSCC
*OriginalRC
= lookupRefSCC(OriginalN
);
1617 #ifdef EXPENSIVE_CHECKS
1618 OriginalRC
->verify();
1619 auto VerifyOnExit
= make_scope_exit([&]() { OriginalRC
->verify(); });
1622 assert(!lookup(NewFunction
) &&
1623 "New function's node should not already exist");
1624 Node
&NewN
= initNode(NewFunction
);
1626 Edge::Kind EK
= getEdgeKind(OriginalFunction
, NewFunction
);
1628 SCC
*NewC
= nullptr;
1629 for (Edge
&E
: *NewN
) {
1630 Node
&EN
= E
.getNode();
1631 if (EK
== Edge::Kind::Call
&& E
.isCall() && lookupSCC(EN
) == OriginalC
) {
1632 // If the edge to the new function is a call edge and there is a call edge
1633 // from the new function to any function in the original function's SCC,
1634 // it is in the same SCC (and RefSCC) as the original function.
1636 NewC
->Nodes
.push_back(&NewN
);
1642 for (Edge
&E
: *NewN
) {
1643 Node
&EN
= E
.getNode();
1644 if (lookupRefSCC(EN
) == OriginalRC
) {
1645 // If there is any edge from the new function to any function in the
1646 // original function's RefSCC, it is in the same RefSCC as the original
1647 // function but a new SCC.
1648 RefSCC
*NewRC
= OriginalRC
;
1649 NewC
= createSCC(*NewRC
, SmallVector
<Node
*, 1>({&NewN
}));
1651 // The new function's SCC is not the same as the original function's
1652 // SCC, since that case was handled earlier. If the edge from the
1653 // original function to the new function was a call edge, then we need
1654 // to insert the newly created function's SCC before the original
1655 // function's SCC. Otherwise, either the new SCC comes after the
1656 // original function's SCC, or it doesn't matter, and in both cases we
1657 // can add it to the very end.
1658 int InsertIndex
= EK
== Edge::Kind::Call
? NewRC
->SCCIndices
[OriginalC
]
1659 : NewRC
->SCCIndices
.size();
1660 NewRC
->SCCs
.insert(NewRC
->SCCs
.begin() + InsertIndex
, NewC
);
1661 for (int I
= InsertIndex
, Size
= NewRC
->SCCs
.size(); I
< Size
; ++I
)
1662 NewRC
->SCCIndices
[NewRC
->SCCs
[I
]] = I
;
1670 // We didn't find any edges back to the original function's RefSCC, so the
1671 // new function belongs in a new RefSCC. The new RefSCC goes before the
1672 // original function's RefSCC.
1673 RefSCC
*NewRC
= createRefSCC(*this);
1674 NewC
= createSCC(*NewRC
, SmallVector
<Node
*, 1>({&NewN
}));
1675 NewRC
->SCCIndices
[NewC
] = 0;
1676 NewRC
->SCCs
.push_back(NewC
);
1677 auto OriginalRCIndex
= RefSCCIndices
.find(OriginalRC
)->second
;
1678 PostOrderRefSCCs
.insert(PostOrderRefSCCs
.begin() + OriginalRCIndex
, NewRC
);
1679 for (int I
= OriginalRCIndex
, Size
= PostOrderRefSCCs
.size(); I
< Size
; ++I
)
1680 RefSCCIndices
[PostOrderRefSCCs
[I
]] = I
;
1683 SCCMap
[&NewN
] = NewC
;
1685 OriginalN
->insertEdgeInternal(NewN
, EK
);
1688 void LazyCallGraph::addSplitRefRecursiveFunctions(
1689 Function
&OriginalFunction
, ArrayRef
<Function
*> NewFunctions
) {
1690 assert(!NewFunctions
.empty() && "Can't add zero functions");
1691 assert(lookup(OriginalFunction
) &&
1692 "Original function's node should already exist");
1693 Node
&OriginalN
= get(OriginalFunction
);
1694 RefSCC
*OriginalRC
= lookupRefSCC(OriginalN
);
1696 #ifdef EXPENSIVE_CHECKS
1697 OriginalRC
->verify();
1698 auto VerifyOnExit
= make_scope_exit([&]() {
1699 OriginalRC
->verify();
1700 for (Function
*NewFunction
: NewFunctions
)
1701 lookupRefSCC(get(*NewFunction
))->verify();
1705 bool ExistsRefToOriginalRefSCC
= false;
1707 for (Function
*NewFunction
: NewFunctions
) {
1708 Node
&NewN
= initNode(*NewFunction
);
1710 OriginalN
->insertEdgeInternal(NewN
, Edge::Kind::Ref
);
1712 // Check if there is any edge from any new function back to any function in
1713 // the original function's RefSCC.
1714 for (Edge
&E
: *NewN
) {
1715 if (lookupRefSCC(E
.getNode()) == OriginalRC
) {
1716 ExistsRefToOriginalRefSCC
= true;
1723 if (ExistsRefToOriginalRefSCC
) {
1724 // If there is any edge from any new function to any function in the
1725 // original function's RefSCC, all new functions will be in the same RefSCC
1726 // as the original function.
1729 // Otherwise the new functions are in their own RefSCC.
1730 NewRC
= createRefSCC(*this);
1731 // The new RefSCC goes before the original function's RefSCC in postorder
1732 // since there are only edges from the original function's RefSCC to the new
1734 auto OriginalRCIndex
= RefSCCIndices
.find(OriginalRC
)->second
;
1735 PostOrderRefSCCs
.insert(PostOrderRefSCCs
.begin() + OriginalRCIndex
, NewRC
);
1736 for (int I
= OriginalRCIndex
, Size
= PostOrderRefSCCs
.size(); I
< Size
; ++I
)
1737 RefSCCIndices
[PostOrderRefSCCs
[I
]] = I
;
1740 for (Function
*NewFunction
: NewFunctions
) {
1741 Node
&NewN
= get(*NewFunction
);
1742 // Each new function is in its own new SCC. The original function can only
1743 // have a ref edge to new functions, and no other existing functions can
1744 // have references to new functions. Each new function only has a ref edge
1745 // to the other new functions.
1746 SCC
*NewC
= createSCC(*NewRC
, SmallVector
<Node
*, 1>({&NewN
}));
1747 // The new SCCs are either sibling SCCs or parent SCCs to all other existing
1748 // SCCs in the RefSCC. Either way, they can go at the back of the postorder
1750 auto Index
= NewRC
->SCCIndices
.size();
1751 NewRC
->SCCIndices
[NewC
] = Index
;
1752 NewRC
->SCCs
.push_back(NewC
);
1753 SCCMap
[&NewN
] = NewC
;
1757 for (Function
*F1
: NewFunctions
) {
1758 assert(getEdgeKind(OriginalFunction
, *F1
) == Edge::Kind::Ref
&&
1759 "Expected ref edges from original function to every new function");
1760 Node
&N1
= get(*F1
);
1761 for (Function
*F2
: NewFunctions
) {
1764 Node
&N2
= get(*F2
);
1765 assert(!N1
->lookup(N2
)->isCall() &&
1766 "Edges between new functions must be ref edges");
1772 LazyCallGraph::Node
&LazyCallGraph::insertInto(Function
&F
, Node
*&MappedN
) {
1773 return *new (MappedN
= BPA
.Allocate()) Node(*this, F
);
1776 void LazyCallGraph::updateGraphPtrs() {
1777 // Walk the node map to update their graph pointers. While this iterates in
1778 // an unstable order, the order has no effect, so it remains correct.
1779 for (auto &FunctionNodePair
: NodeMap
)
1780 FunctionNodePair
.second
->G
= this;
1782 for (auto *RC
: PostOrderRefSCCs
)
1786 LazyCallGraph::Node
&LazyCallGraph::initNode(Function
&F
) {
1788 N
.DFSNumber
= N
.LowLink
= -1;
1794 template <typename RootsT
, typename GetBeginT
, typename GetEndT
,
1795 typename GetNodeT
, typename FormSCCCallbackT
>
1796 void LazyCallGraph::buildGenericSCCs(RootsT
&&Roots
, GetBeginT
&&GetBegin
,
1797 GetEndT
&&GetEnd
, GetNodeT
&&GetNode
,
1798 FormSCCCallbackT
&&FormSCC
) {
1799 using EdgeItT
= decltype(GetBegin(std::declval
<Node
&>()));
1801 SmallVector
<std::pair
<Node
*, EdgeItT
>, 16> DFSStack
;
1802 SmallVector
<Node
*, 16> PendingSCCStack
;
1804 // Scan down the stack and DFS across the call edges.
1805 for (Node
*RootN
: Roots
) {
1806 assert(DFSStack
.empty() &&
1807 "Cannot begin a new root with a non-empty DFS stack!");
1808 assert(PendingSCCStack
.empty() &&
1809 "Cannot begin a new root with pending nodes for an SCC!");
1811 // Skip any nodes we've already reached in the DFS.
1812 if (RootN
->DFSNumber
!= 0) {
1813 assert(RootN
->DFSNumber
== -1 &&
1814 "Shouldn't have any mid-DFS root nodes!");
1818 RootN
->DFSNumber
= RootN
->LowLink
= 1;
1819 int NextDFSNumber
= 2;
1821 DFSStack
.emplace_back(RootN
, GetBegin(*RootN
));
1823 auto [N
, I
] = DFSStack
.pop_back_val();
1824 auto E
= GetEnd(*N
);
1826 Node
&ChildN
= GetNode(I
);
1827 if (ChildN
.DFSNumber
== 0) {
1828 // We haven't yet visited this child, so descend, pushing the current
1829 // node onto the stack.
1830 DFSStack
.emplace_back(N
, I
);
1832 ChildN
.DFSNumber
= ChildN
.LowLink
= NextDFSNumber
++;
1839 // If the child has already been added to some child component, it
1840 // couldn't impact the low-link of this parent because it isn't
1841 // connected, and thus its low-link isn't relevant so skip it.
1842 if (ChildN
.DFSNumber
== -1) {
1847 // Track the lowest linked child as the lowest link for this node.
1848 assert(ChildN
.LowLink
> 0 && "Must have a positive low-link number!");
1849 if (ChildN
.LowLink
< N
->LowLink
)
1850 N
->LowLink
= ChildN
.LowLink
;
1852 // Move to the next edge.
1856 // We've finished processing N and its descendants, put it on our pending
1857 // SCC stack to eventually get merged into an SCC of nodes.
1858 PendingSCCStack
.push_back(N
);
1860 // If this node is linked to some lower entry, continue walking up the
1862 if (N
->LowLink
!= N
->DFSNumber
)
1865 // Otherwise, we've completed an SCC. Append it to our post order list of
1867 int RootDFSNumber
= N
->DFSNumber
;
1868 // Find the range of the node stack by walking down until we pass the
1870 auto SCCNodes
= make_range(
1871 PendingSCCStack
.rbegin(),
1872 find_if(reverse(PendingSCCStack
), [RootDFSNumber
](const Node
*N
) {
1873 return N
->DFSNumber
< RootDFSNumber
;
1875 // Form a new SCC out of these nodes and then clear them off our pending
1878 PendingSCCStack
.erase(SCCNodes
.end().base(), PendingSCCStack
.end());
1879 } while (!DFSStack
.empty());
1883 /// Build the internal SCCs for a RefSCC from a sequence of nodes.
1885 /// Appends the SCCs to the provided vector and updates the map with their
1886 /// indices. Both the vector and map must be empty when passed into this
1888 void LazyCallGraph::buildSCCs(RefSCC
&RC
, node_stack_range Nodes
) {
1889 assert(RC
.SCCs
.empty() && "Already built SCCs!");
1890 assert(RC
.SCCIndices
.empty() && "Already mapped SCC indices!");
1892 for (Node
*N
: Nodes
) {
1893 assert(N
->LowLink
>= (*Nodes
.begin())->LowLink
&&
1894 "We cannot have a low link in an SCC lower than its root on the "
1897 // This node will go into the next RefSCC, clear out its DFS and low link
1899 N
->DFSNumber
= N
->LowLink
= 0;
1902 // Each RefSCC contains a DAG of the call SCCs. To build these, we do
1903 // a direct walk of the call edges using Tarjan's algorithm. We reuse the
1904 // internal storage as we won't need it for the outer graph's DFS any longer.
1906 Nodes
, [](Node
&N
) { return N
->call_begin(); },
1907 [](Node
&N
) { return N
->call_end(); },
1908 [](EdgeSequence::call_iterator I
) -> Node
& { return I
->getNode(); },
1909 [this, &RC
](node_stack_range Nodes
) {
1910 RC
.SCCs
.push_back(createSCC(RC
, Nodes
));
1911 for (Node
&N
: *RC
.SCCs
.back()) {
1912 N
.DFSNumber
= N
.LowLink
= -1;
1913 SCCMap
[&N
] = RC
.SCCs
.back();
1917 // Wire up the SCC indices.
1918 for (int I
= 0, Size
= RC
.SCCs
.size(); I
< Size
; ++I
)
1919 RC
.SCCIndices
[RC
.SCCs
[I
]] = I
;
1922 void LazyCallGraph::buildRefSCCs() {
1923 if (EntryEdges
.empty() || !PostOrderRefSCCs
.empty())
1924 // RefSCCs are either non-existent or already built!
1927 assert(RefSCCIndices
.empty() && "Already mapped RefSCC indices!");
1929 SmallVector
<Node
*, 16> Roots
;
1930 for (Edge
&E
: *this)
1931 Roots
.push_back(&E
.getNode());
1933 // The roots will be iterated in order.
1937 // We need to populate each node as we begin to walk its edges.
1941 [](Node
&N
) { return N
->end(); },
1942 [](EdgeSequence::iterator I
) -> Node
& { return I
->getNode(); },
1943 [this](node_stack_range Nodes
) {
1944 RefSCC
*NewRC
= createRefSCC(*this);
1945 buildSCCs(*NewRC
, Nodes
);
1947 // Push the new node into the postorder list and remember its position
1948 // in the index map.
1950 RefSCCIndices
.try_emplace(NewRC
, PostOrderRefSCCs
.size()).second
;
1952 assert(Inserted
&& "Cannot already have this RefSCC in the index map!");
1953 PostOrderRefSCCs
.push_back(NewRC
);
1954 #ifdef EXPENSIVE_CHECKS
1960 void LazyCallGraph::visitReferences(SmallVectorImpl
<Constant
*> &Worklist
,
1961 SmallPtrSetImpl
<Constant
*> &Visited
,
1962 function_ref
<void(Function
&)> Callback
) {
1963 while (!Worklist
.empty()) {
1964 Constant
*C
= Worklist
.pop_back_val();
1966 if (Function
*F
= dyn_cast
<Function
>(C
)) {
1967 if (!F
->isDeclaration())
1972 // blockaddresses are weird and don't participate in the call graph anyway,
1974 if (isa
<BlockAddress
>(C
))
1977 for (Value
*Op
: C
->operand_values())
1978 if (Visited
.insert(cast
<Constant
>(Op
)).second
)
1979 Worklist
.push_back(cast
<Constant
>(Op
));
1983 AnalysisKey
LazyCallGraphAnalysis::Key
;
1985 LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream
&OS
) : OS(OS
) {}
1987 static void printNode(raw_ostream
&OS
, LazyCallGraph::Node
&N
) {
1988 OS
<< " Edges in function: " << N
.getFunction().getName() << "\n";
1989 for (LazyCallGraph::Edge
&E
: N
.populate())
1990 OS
<< " " << (E
.isCall() ? "call" : "ref ") << " -> "
1991 << E
.getFunction().getName() << "\n";
1996 static void printSCC(raw_ostream
&OS
, LazyCallGraph::SCC
&C
) {
1997 OS
<< " SCC with " << C
.size() << " functions:\n";
1999 for (LazyCallGraph::Node
&N
: C
)
2000 OS
<< " " << N
.getFunction().getName() << "\n";
2003 static void printRefSCC(raw_ostream
&OS
, LazyCallGraph::RefSCC
&C
) {
2004 OS
<< " RefSCC with " << C
.size() << " call SCCs:\n";
2006 for (LazyCallGraph::SCC
&InnerC
: C
)
2007 printSCC(OS
, InnerC
);
2012 PreservedAnalyses
LazyCallGraphPrinterPass::run(Module
&M
,
2013 ModuleAnalysisManager
&AM
) {
2014 LazyCallGraph
&G
= AM
.getResult
<LazyCallGraphAnalysis
>(M
);
2016 OS
<< "Printing the call graph for module: " << M
.getModuleIdentifier()
2019 for (Function
&F
: M
)
2020 printNode(OS
, G
.get(F
));
2023 for (LazyCallGraph::RefSCC
&C
: G
.postorder_ref_sccs())
2026 return PreservedAnalyses::all();
2029 LazyCallGraphDOTPrinterPass::LazyCallGraphDOTPrinterPass(raw_ostream
&OS
)
2032 static void printNodeDOT(raw_ostream
&OS
, LazyCallGraph::Node
&N
) {
2034 "\"" + DOT::EscapeString(std::string(N
.getFunction().getName())) + "\"";
2036 for (LazyCallGraph::Edge
&E
: N
.populate()) {
2037 OS
<< " " << Name
<< " -> \""
2038 << DOT::EscapeString(std::string(E
.getFunction().getName())) << "\"";
2039 if (!E
.isCall()) // It is a ref edge.
2040 OS
<< " [style=dashed,label=\"ref\"]";
2047 PreservedAnalyses
LazyCallGraphDOTPrinterPass::run(Module
&M
,
2048 ModuleAnalysisManager
&AM
) {
2049 LazyCallGraph
&G
= AM
.getResult
<LazyCallGraphAnalysis
>(M
);
2051 OS
<< "digraph \"" << DOT::EscapeString(M
.getModuleIdentifier()) << "\" {\n";
2053 for (Function
&F
: M
)
2054 printNodeDOT(OS
, G
.get(F
));
2058 return PreservedAnalyses::all();