LLVM 20.0.0git
LazyCallGraph.cpp
Go to the documentation of this file.
1//===- LazyCallGraph.cpp - Analysis of a Module's call graph --------------===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8
10
11#include "llvm/ADT/ArrayRef.h"
12#include "llvm/ADT/STLExtras.h"
13#include "llvm/ADT/Sequence.h"
18#include "llvm/IR/Constants.h"
19#include "llvm/IR/Function.h"
22#include "llvm/IR/Instruction.h"
23#include "llvm/IR/Module.h"
24#include "llvm/IR/PassManager.h"
27#include "llvm/Support/Debug.h"
30#include <algorithm>
31
32#ifdef EXPENSIVE_CHECKS
33#include "llvm/ADT/ScopeExit.h"
34#endif
35
36using namespace llvm;
37
38#define DEBUG_TYPE "lcg"
39
40template struct LLVM_EXPORT_TEMPLATE Any::TypeId<const LazyCallGraph::SCC *>;
41
42void LazyCallGraph::EdgeSequence::insertEdgeInternal(Node &TargetN,
43 Edge::Kind EK) {
44 EdgeIndexMap.try_emplace(&TargetN, Edges.size());
45 Edges.emplace_back(TargetN, EK);
46}
47
48void LazyCallGraph::EdgeSequence::setEdgeKind(Node &TargetN, Edge::Kind EK) {
49 Edges[EdgeIndexMap.find(&TargetN)->second].setKind(EK);
50}
51
52bool LazyCallGraph::EdgeSequence::removeEdgeInternal(Node &TargetN) {
53 auto IndexMapI = EdgeIndexMap.find(&TargetN);
54 if (IndexMapI == EdgeIndexMap.end())
55 return false;
56
57 Edges[IndexMapI->second] = Edge();
58 EdgeIndexMap.erase(IndexMapI);
59 return true;
60}
61
65 if (!EdgeIndexMap.try_emplace(&N, Edges.size()).second)
66 return;
67
68 LLVM_DEBUG(dbgs() << " Added callable function: " << N.getName() << "\n");
70}
71
72LazyCallGraph::EdgeSequence &LazyCallGraph::Node::populateSlow() {
73 assert(!Edges && "Must not have already populated the edges for this node!");
74
75 LLVM_DEBUG(dbgs() << " Adding functions called by '" << getName()
76 << "' to the graph.\n");
77
78 Edges = EdgeSequence();
79
83
84 // Find all the potential call graph edges in this function. We track both
85 // actual call edges and indirect references to functions. The direct calls
86 // are trivially added, but to accumulate the latter we walk the instructions
87 // and add every operand which is a constant to the worklist to process
88 // afterward.
89 //
90 // Note that we consider *any* function with a definition to be a viable
91 // edge. Even if the function's definition is subject to replacement by
92 // some other module (say, a weak definition) there may still be
93 // optimizations which essentially speculate based on the definition and
94 // a way to check that the specific definition is in fact the one being
95 // used. For example, this could be done by moving the weak definition to
96 // a strong (internal) definition and making the weak definition be an
97 // alias. Then a test of the address of the weak function against the new
98 // strong definition's address would be an effective way to determine the
99 // safety of optimizing a direct call edge.
100 for (BasicBlock &BB : *F)
101 for (Instruction &I : BB) {
102 if (auto *CB = dyn_cast<CallBase>(&I))
103 if (Function *Callee = CB->getCalledFunction())
104 if (!Callee->isDeclaration())
105 if (Callees.insert(Callee).second) {
106 Visited.insert(Callee);
107 addEdge(Edges->Edges, Edges->EdgeIndexMap, G->get(*Callee),
109 }
110
111 for (Value *Op : I.operand_values())
112 if (Constant *C = dyn_cast<Constant>(Op))
113 if (Visited.insert(C).second)
114 Worklist.push_back(C);
115 }
116
117 // We've collected all the constant (and thus potentially function or
118 // function containing) operands to all the instructions in the function.
119 // Process them (recursively) collecting every function found.
120 visitReferences(Worklist, Visited, [&](Function &F) {
121 addEdge(Edges->Edges, Edges->EdgeIndexMap, G->get(F),
123 });
124
125 // Add implicit reference edges to any defined libcall functions (if we
126 // haven't found an explicit edge).
127 for (auto *F : G->LibFunctions)
128 if (!Visited.count(F))
129 addEdge(Edges->Edges, Edges->EdgeIndexMap, G->get(*F),
131
132 return *Edges;
133}
134
135void LazyCallGraph::Node::replaceFunction(Function &NewF) {
136 assert(F != &NewF && "Must not replace a function with itself!");
137 F = &NewF;
138}
139
140#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
141LLVM_DUMP_METHOD void LazyCallGraph::Node::dump() const {
142 dbgs() << *this << '\n';
143}
144#endif
145
147 LibFunc LF;
148
149 // Either this is a normal library function or a "vectorizable"
150 // function. Not using the VFDatabase here because this query
151 // is related only to libraries handled via the TLI.
152 return TLI.getLibFunc(F, LF) ||
153 TLI.isKnownVectorFunctionInLibrary(F.getName());
154}
155
158 LLVM_DEBUG(dbgs() << "Building CG for module: " << M.getModuleIdentifier()
159 << "\n");
160 for (Function &F : M) {
161 if (F.isDeclaration())
162 continue;
163 // If this function is a known lib function to LLVM then we want to
164 // synthesize reference edges to it to model the fact that LLVM can turn
165 // arbitrary code into a library function call.
166 if (isKnownLibFunction(F, GetTLI(F)))
167 LibFunctions.insert(&F);
168
169 if (F.hasLocalLinkage())
170 continue;
171
172 // External linkage defined functions have edges to them from other
173 // modules.
174 LLVM_DEBUG(dbgs() << " Adding '" << F.getName()
175 << "' to entry set of the graph.\n");
176 addEdge(EntryEdges.Edges, EntryEdges.EdgeIndexMap, get(F), Edge::Ref);
177 }
178
179 // Externally visible aliases of internal functions are also viable entry
180 // edges to the module.
181 for (auto &A : M.aliases()) {
182 if (A.hasLocalLinkage())
183 continue;
184 if (Function* F = dyn_cast<Function>(A.getAliasee())) {
185 LLVM_DEBUG(dbgs() << " Adding '" << F->getName()
186 << "' with alias '" << A.getName()
187 << "' to entry set of the graph.\n");
188 addEdge(EntryEdges.Edges, EntryEdges.EdgeIndexMap, get(*F), Edge::Ref);
189 }
190 }
191
192 // Now add entry nodes for functions reachable via initializers to globals.
195 for (GlobalVariable &GV : M.globals())
196 if (GV.hasInitializer())
197 if (Visited.insert(GV.getInitializer()).second)
198 Worklist.push_back(GV.getInitializer());
199
201 dbgs() << " Adding functions referenced by global initializers to the "
202 "entry set.\n");
203 visitReferences(Worklist, Visited, [&](Function &F) {
204 addEdge(EntryEdges.Edges, EntryEdges.EdgeIndexMap, get(F),
206 });
207}
208
210 : BPA(std::move(G.BPA)), NodeMap(std::move(G.NodeMap)),
211 EntryEdges(std::move(G.EntryEdges)), SCCBPA(std::move(G.SCCBPA)),
212 SCCMap(std::move(G.SCCMap)), LibFunctions(std::move(G.LibFunctions)) {
213 updateGraphPtrs();
214}
215
216#if !defined(NDEBUG) || defined(EXPENSIVE_CHECKS)
218 for (RefSCC &RC : postorder_ref_sccs()) {
219 RC.verify();
220 }
221}
222#endif
223
226 // Check whether the analysis, all analyses on functions, or the function's
227 // CFG have been preserved.
229 return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Module>>());
230}
231
233 BPA = std::move(G.BPA);
234 NodeMap = std::move(G.NodeMap);
235 EntryEdges = std::move(G.EntryEdges);
236 SCCBPA = std::move(G.SCCBPA);
237 SCCMap = std::move(G.SCCMap);
238 LibFunctions = std::move(G.LibFunctions);
239 updateGraphPtrs();
240 return *this;
241}
242
243#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
244LLVM_DUMP_METHOD void LazyCallGraph::SCC::dump() const {
245 dbgs() << *this << '\n';
246}
247#endif
248
249#if !defined(NDEBUG) || defined(EXPENSIVE_CHECKS)
250void LazyCallGraph::SCC::verify() {
251 assert(OuterRefSCC && "Can't have a null RefSCC!");
252 assert(!Nodes.empty() && "Can't have an empty SCC!");
253
254 for (Node *N : Nodes) {
255 assert(N && "Can't have a null node!");
256 assert(OuterRefSCC->G->lookupSCC(*N) == this &&
257 "Node does not map to this SCC!");
258 assert(N->DFSNumber == -1 &&
259 "Must set DFS numbers to -1 when adding a node to an SCC!");
260 assert(N->LowLink == -1 &&
261 "Must set low link to -1 when adding a node to an SCC!");
262 for (Edge &E : **N)
263 assert(E.getNode().isPopulated() && "Can't have an unpopulated node!");
264
265#ifdef EXPENSIVE_CHECKS
266 // Verify that all nodes in this SCC can reach all other nodes.
267 SmallVector<Node *, 4> Worklist;
269 Worklist.push_back(N);
270 while (!Worklist.empty()) {
271 Node *VisitingNode = Worklist.pop_back_val();
272 if (!Visited.insert(VisitingNode).second)
273 continue;
274 for (Edge &E : (*VisitingNode)->calls())
275 Worklist.push_back(&E.getNode());
276 }
277 for (Node *NodeToVisit : Nodes) {
278 assert(Visited.contains(NodeToVisit) &&
279 "Cannot reach all nodes within SCC");
280 }
281#endif
282 }
283}
284#endif
285
287 if (this == &C)
288 return false;
289
290 for (Node &N : *this)
291 for (Edge &E : N->calls())
292 if (OuterRefSCC->G->lookupSCC(E.getNode()) == &C)
293 return true;
294
295 // No edges found.
296 return false;
297}
298
299bool LazyCallGraph::SCC::isAncestorOf(const SCC &TargetC) const {
300 if (this == &TargetC)
301 return false;
302
303 LazyCallGraph &G = *OuterRefSCC->G;
304
305 // Start with this SCC.
306 SmallPtrSet<const SCC *, 16> Visited = {this};
307 SmallVector<const SCC *, 16> Worklist = {this};
308
309 // Walk down the graph until we run out of edges or find a path to TargetC.
310 do {
311 const SCC &C = *Worklist.pop_back_val();
312 for (Node &N : C)
313 for (Edge &E : N->calls()) {
314 SCC *CalleeC = G.lookupSCC(E.getNode());
315 if (!CalleeC)
316 continue;
317
318 // If the callee's SCC is the TargetC, we're done.
319 if (CalleeC == &TargetC)
320 return true;
321
322 // If this is the first time we've reached this SCC, put it on the
323 // worklist to recurse through.
324 if (Visited.insert(CalleeC).second)
325 Worklist.push_back(CalleeC);
326 }
327 } while (!Worklist.empty());
328
329 // No paths found.
330 return false;
331}
332
333LazyCallGraph::RefSCC::RefSCC(LazyCallGraph &G) : G(&G) {}
334
335#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
336LLVM_DUMP_METHOD void LazyCallGraph::RefSCC::dump() const {
337 dbgs() << *this << '\n';
338}
339#endif
340
341#if !defined(NDEBUG) || defined(EXPENSIVE_CHECKS)
342void LazyCallGraph::RefSCC::verify() {
343 assert(G && "Can't have a null graph!");
344 assert(!SCCs.empty() && "Can't have an empty SCC!");
345
346 // Verify basic properties of the SCCs.
348 for (SCC *C : SCCs) {
349 assert(C && "Can't have a null SCC!");
350 C->verify();
351 assert(&C->getOuterRefSCC() == this &&
352 "SCC doesn't think it is inside this RefSCC!");
353 bool Inserted = SCCSet.insert(C).second;
354 assert(Inserted && "Found a duplicate SCC!");
355 auto IndexIt = SCCIndices.find(C);
356 assert(IndexIt != SCCIndices.end() &&
357 "Found an SCC that doesn't have an index!");
358 }
359
360 // Check that our indices map correctly.
361 for (auto [C, I] : SCCIndices) {
362 assert(C && "Can't have a null SCC in the indices!");
363 assert(SCCSet.count(C) && "Found an index for an SCC not in the RefSCC!");
364 assert(SCCs[I] == C && "Index doesn't point to SCC!");
365 }
366
367 // Check that the SCCs are in fact in post-order.
368 for (int I = 0, Size = SCCs.size(); I < Size; ++I) {
369 SCC &SourceSCC = *SCCs[I];
370 for (Node &N : SourceSCC)
371 for (Edge &E : *N) {
372 if (!E.isCall())
373 continue;
374 SCC &TargetSCC = *G->lookupSCC(E.getNode());
375 if (&TargetSCC.getOuterRefSCC() == this) {
376 assert(SCCIndices.find(&TargetSCC)->second <= I &&
377 "Edge between SCCs violates post-order relationship.");
378 continue;
379 }
380 }
381 }
382
383#ifdef EXPENSIVE_CHECKS
384 // Verify that all nodes in this RefSCC can reach all other nodes.
386 for (SCC *C : SCCs) {
387 for (Node &N : *C)
388 Nodes.push_back(&N);
389 }
390 for (Node *N : Nodes) {
391 SmallVector<Node *, 4> Worklist;
393 Worklist.push_back(N);
394 while (!Worklist.empty()) {
395 Node *VisitingNode = Worklist.pop_back_val();
396 if (!Visited.insert(VisitingNode).second)
397 continue;
398 for (Edge &E : **VisitingNode)
399 Worklist.push_back(&E.getNode());
400 }
401 for (Node *NodeToVisit : Nodes) {
402 assert(Visited.contains(NodeToVisit) &&
403 "Cannot reach all nodes within RefSCC");
404 }
405 }
406#endif
407}
408#endif
409
411 if (&RC == this)
412 return false;
413
414 // Search all edges to see if this is a parent.
415 for (SCC &C : *this)
416 for (Node &N : C)
417 for (Edge &E : *N)
418 if (G->lookupRefSCC(E.getNode()) == &RC)
419 return true;
420
421 return false;
422}
423
425 if (&RC == this)
426 return false;
427
428 // For each descendant of this RefSCC, see if one of its children is the
429 // argument. If not, add that descendant to the worklist and continue
430 // searching.
433 Worklist.push_back(this);
434 Visited.insert(this);
435 do {
436 const RefSCC &DescendantRC = *Worklist.pop_back_val();
437 for (SCC &C : DescendantRC)
438 for (Node &N : C)
439 for (Edge &E : *N) {
440 auto *ChildRC = G->lookupRefSCC(E.getNode());
441 if (ChildRC == &RC)
442 return true;
443 if (!ChildRC || !Visited.insert(ChildRC).second)
444 continue;
445 Worklist.push_back(ChildRC);
446 }
447 } while (!Worklist.empty());
448
449 return false;
450}
451
452/// Generic helper that updates a postorder sequence of SCCs for a potentially
453/// cycle-introducing edge insertion.
454///
455/// A postorder sequence of SCCs of a directed graph has one fundamental
456/// property: all deges in the DAG of SCCs point "up" the sequence. That is,
457/// all edges in the SCC DAG point to prior SCCs in the sequence.
458///
459/// This routine both updates a postorder sequence and uses that sequence to
460/// compute the set of SCCs connected into a cycle. It should only be called to
461/// insert a "downward" edge which will require changing the sequence to
462/// restore it to a postorder.
463///
464/// When inserting an edge from an earlier SCC to a later SCC in some postorder
465/// sequence, all of the SCCs which may be impacted are in the closed range of
466/// those two within the postorder sequence. The algorithm used here to restore
467/// the state is as follows:
468///
469/// 1) Starting from the source SCC, construct a set of SCCs which reach the
470/// source SCC consisting of just the source SCC. Then scan toward the
471/// target SCC in postorder and for each SCC, if it has an edge to an SCC
472/// in the set, add it to the set. Otherwise, the source SCC is not
473/// a successor, move it in the postorder sequence to immediately before
474/// the source SCC, shifting the source SCC and all SCCs in the set one
475/// position toward the target SCC. Stop scanning after processing the
476/// target SCC.
477/// 2) If the source SCC is now past the target SCC in the postorder sequence,
478/// and thus the new edge will flow toward the start, we are done.
479/// 3) Otherwise, starting from the target SCC, walk all edges which reach an
480/// SCC between the source and the target, and add them to the set of
481/// connected SCCs, then recurse through them. Once a complete set of the
482/// SCCs the target connects to is known, hoist the remaining SCCs between
483/// the source and the target to be above the target. Note that there is no
484/// need to process the source SCC, it is already known to connect.
485/// 4) At this point, all of the SCCs in the closed range between the source
486/// SCC and the target SCC in the postorder sequence are connected,
487/// including the target SCC and the source SCC. Inserting the edge from
488/// the source SCC to the target SCC will form a cycle out of precisely
489/// these SCCs. Thus we can merge all of the SCCs in this closed range into
490/// a single SCC.
491///
492/// This process has various important properties:
493/// - Only mutates the SCCs when adding the edge actually changes the SCC
494/// structure.
495/// - Never mutates SCCs which are unaffected by the change.
496/// - Updates the postorder sequence to correctly satisfy the postorder
497/// constraint after the edge is inserted.
498/// - Only reorders SCCs in the closed postorder sequence from the source to
499/// the target, so easy to bound how much has changed even in the ordering.
500/// - Big-O is the number of edges in the closed postorder range of SCCs from
501/// source to target.
502///
503/// This helper routine, in addition to updating the postorder sequence itself
504/// will also update a map from SCCs to indices within that sequence.
505///
506/// The sequence and the map must operate on pointers to the SCC type.
507///
508/// Two callbacks must be provided. The first computes the subset of SCCs in
509/// the postorder closed range from the source to the target which connect to
510/// the source SCC via some (transitive) set of edges. The second computes the
511/// subset of the same range which the target SCC connects to via some
512/// (transitive) set of edges. Both callbacks should populate the set argument
513/// provided.
514template <typename SCCT, typename PostorderSequenceT, typename SCCIndexMapT,
515 typename ComputeSourceConnectedSetCallableT,
516 typename ComputeTargetConnectedSetCallableT>
519 SCCT &SourceSCC, SCCT &TargetSCC, PostorderSequenceT &SCCs,
520 SCCIndexMapT &SCCIndices,
521 ComputeSourceConnectedSetCallableT ComputeSourceConnectedSet,
522 ComputeTargetConnectedSetCallableT ComputeTargetConnectedSet) {
523 int SourceIdx = SCCIndices[&SourceSCC];
524 int TargetIdx = SCCIndices[&TargetSCC];
525 assert(SourceIdx < TargetIdx && "Cannot have equal indices here!");
526
527 SmallPtrSet<SCCT *, 4> ConnectedSet;
528
529 // Compute the SCCs which (transitively) reach the source.
530 ComputeSourceConnectedSet(ConnectedSet);
531
532 // Partition the SCCs in this part of the port-order sequence so only SCCs
533 // connecting to the source remain between it and the target. This is
534 // a benign partition as it preserves postorder.
535 auto SourceI = std::stable_partition(
536 SCCs.begin() + SourceIdx, SCCs.begin() + TargetIdx + 1,
537 [&ConnectedSet](SCCT *C) { return !ConnectedSet.count(C); });
538 for (int I = SourceIdx, E = TargetIdx + 1; I < E; ++I)
539 SCCIndices.find(SCCs[I])->second = I;
540
541 // If the target doesn't connect to the source, then we've corrected the
542 // post-order and there are no cycles formed.
543 if (!ConnectedSet.count(&TargetSCC)) {
544 assert(SourceI > (SCCs.begin() + SourceIdx) &&
545 "Must have moved the source to fix the post-order.");
546 assert(*std::prev(SourceI) == &TargetSCC &&
547 "Last SCC to move should have bene the target.");
548
549 // Return an empty range at the target SCC indicating there is nothing to
550 // merge.
551 return make_range(std::prev(SourceI), std::prev(SourceI));
552 }
553
554 assert(SCCs[TargetIdx] == &TargetSCC &&
555 "Should not have moved target if connected!");
556 SourceIdx = SourceI - SCCs.begin();
557 assert(SCCs[SourceIdx] == &SourceSCC &&
558 "Bad updated index computation for the source SCC!");
559
560 // See whether there are any remaining intervening SCCs between the source
561 // and target. If so we need to make sure they all are reachable form the
562 // target.
563 if (SourceIdx + 1 < TargetIdx) {
564 ConnectedSet.clear();
565 ComputeTargetConnectedSet(ConnectedSet);
566
567 // Partition SCCs so that only SCCs reached from the target remain between
568 // the source and the target. This preserves postorder.
569 auto TargetI = std::stable_partition(
570 SCCs.begin() + SourceIdx + 1, SCCs.begin() + TargetIdx + 1,
571 [&ConnectedSet](SCCT *C) { return ConnectedSet.count(C); });
572 for (int I = SourceIdx + 1, E = TargetIdx + 1; I < E; ++I)
573 SCCIndices.find(SCCs[I])->second = I;
574 TargetIdx = std::prev(TargetI) - SCCs.begin();
575 assert(SCCs[TargetIdx] == &TargetSCC &&
576 "Should always end with the target!");
577 }
578
579 // At this point, we know that connecting source to target forms a cycle
580 // because target connects back to source, and we know that all the SCCs
581 // between the source and target in the postorder sequence participate in that
582 // cycle.
583 return make_range(SCCs.begin() + SourceIdx, SCCs.begin() + TargetIdx);
584}
585
587 Node &SourceN, Node &TargetN,
588 function_ref<void(ArrayRef<SCC *> MergeSCCs)> MergeCB) {
589 assert(!(*SourceN)[TargetN].isCall() && "Must start with a ref edge!");
590 SmallVector<SCC *, 1> DeletedSCCs;
591
592#ifdef EXPENSIVE_CHECKS
593 verify();
594 auto VerifyOnExit = make_scope_exit([&]() { verify(); });
595#endif
596
597 SCC &SourceSCC = *G->lookupSCC(SourceN);
598 SCC &TargetSCC = *G->lookupSCC(TargetN);
599
600 // If the two nodes are already part of the same SCC, we're also done as
601 // we've just added more connectivity.
602 if (&SourceSCC == &TargetSCC) {
603 SourceN->setEdgeKind(TargetN, Edge::Call);
604 return false; // No new cycle.
605 }
606
607 // At this point we leverage the postorder list of SCCs to detect when the
608 // insertion of an edge changes the SCC structure in any way.
609 //
610 // First and foremost, we can eliminate the need for any changes when the
611 // edge is toward the beginning of the postorder sequence because all edges
612 // flow in that direction already. Thus adding a new one cannot form a cycle.
613 int SourceIdx = SCCIndices[&SourceSCC];
614 int TargetIdx = SCCIndices[&TargetSCC];
615 if (TargetIdx < SourceIdx) {
616 SourceN->setEdgeKind(TargetN, Edge::Call);
617 return false; // No new cycle.
618 }
619
620 // Compute the SCCs which (transitively) reach the source.
621 auto ComputeSourceConnectedSet = [&](SmallPtrSetImpl<SCC *> &ConnectedSet) {
622#ifdef EXPENSIVE_CHECKS
623 // Check that the RefSCC is still valid before computing this as the
624 // results will be nonsensical of we've broken its invariants.
625 verify();
626#endif
627 ConnectedSet.insert(&SourceSCC);
628 auto IsConnected = [&](SCC &C) {
629 for (Node &N : C)
630 for (Edge &E : N->calls())
631 if (ConnectedSet.count(G->lookupSCC(E.getNode())))
632 return true;
633
634 return false;
635 };
636
637 for (SCC *C :
638 make_range(SCCs.begin() + SourceIdx + 1, SCCs.begin() + TargetIdx + 1))
639 if (IsConnected(*C))
640 ConnectedSet.insert(C);
641 };
642
643 // Use a normal worklist to find which SCCs the target connects to. We still
644 // bound the search based on the range in the postorder list we care about,
645 // but because this is forward connectivity we just "recurse" through the
646 // edges.
647 auto ComputeTargetConnectedSet = [&](SmallPtrSetImpl<SCC *> &ConnectedSet) {
648#ifdef EXPENSIVE_CHECKS
649 // Check that the RefSCC is still valid before computing this as the
650 // results will be nonsensical of we've broken its invariants.
651 verify();
652#endif
653 ConnectedSet.insert(&TargetSCC);
654 SmallVector<SCC *, 4> Worklist;
655 Worklist.push_back(&TargetSCC);
656 do {
657 SCC &C = *Worklist.pop_back_val();
658 for (Node &N : C)
659 for (Edge &E : *N) {
660 if (!E.isCall())
661 continue;
662 SCC &EdgeC = *G->lookupSCC(E.getNode());
663 if (&EdgeC.getOuterRefSCC() != this)
664 // Not in this RefSCC...
665 continue;
666 if (SCCIndices.find(&EdgeC)->second <= SourceIdx)
667 // Not in the postorder sequence between source and target.
668 continue;
669
670 if (ConnectedSet.insert(&EdgeC).second)
671 Worklist.push_back(&EdgeC);
672 }
673 } while (!Worklist.empty());
674 };
675
676 // Use a generic helper to update the postorder sequence of SCCs and return
677 // a range of any SCCs connected into a cycle by inserting this edge. This
678 // routine will also take care of updating the indices into the postorder
679 // sequence.
681 SourceSCC, TargetSCC, SCCs, SCCIndices, ComputeSourceConnectedSet,
682 ComputeTargetConnectedSet);
683
684 // Run the user's callback on the merged SCCs before we actually merge them.
685 if (MergeCB)
686 MergeCB(ArrayRef(MergeRange.begin(), MergeRange.end()));
687
688 // If the merge range is empty, then adding the edge didn't actually form any
689 // new cycles. We're done.
690 if (MergeRange.empty()) {
691 // Now that the SCC structure is finalized, flip the kind to call.
692 SourceN->setEdgeKind(TargetN, Edge::Call);
693 return false; // No new cycle.
694 }
695
696#ifdef EXPENSIVE_CHECKS
697 // Before merging, check that the RefSCC remains valid after all the
698 // postorder updates.
699 verify();
700#endif
701
702 // Otherwise we need to merge all the SCCs in the cycle into a single result
703 // SCC.
704 //
705 // NB: We merge into the target because all of these functions were already
706 // reachable from the target, meaning any SCC-wide properties deduced about it
707 // other than the set of functions within it will not have changed.
708 for (SCC *C : MergeRange) {
709 assert(C != &TargetSCC &&
710 "We merge *into* the target and shouldn't process it here!");
711 SCCIndices.erase(C);
712 TargetSCC.Nodes.append(C->Nodes.begin(), C->Nodes.end());
713 for (Node *N : C->Nodes)
714 G->SCCMap[N] = &TargetSCC;
715 C->clear();
716 DeletedSCCs.push_back(C);
717 }
718
719 // Erase the merged SCCs from the list and update the indices of the
720 // remaining SCCs.
721 int IndexOffset = MergeRange.end() - MergeRange.begin();
722 auto EraseEnd = SCCs.erase(MergeRange.begin(), MergeRange.end());
723 for (SCC *C : make_range(EraseEnd, SCCs.end()))
724 SCCIndices[C] -= IndexOffset;
725
726 // Now that the SCC structure is finalized, flip the kind to call.
727 SourceN->setEdgeKind(TargetN, Edge::Call);
728
729 // And we're done, but we did form a new cycle.
730 return true;
731}
732
734 Node &TargetN) {
735 assert((*SourceN)[TargetN].isCall() && "Must start with a call edge!");
736
737#ifdef EXPENSIVE_CHECKS
738 verify();
739 auto VerifyOnExit = make_scope_exit([&]() { verify(); });
740#endif
741
742 assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
743 assert(G->lookupRefSCC(TargetN) == this && "Target must be in this RefSCC.");
744 assert(G->lookupSCC(SourceN) != G->lookupSCC(TargetN) &&
745 "Source and Target must be in separate SCCs for this to be trivial!");
746
747 // Set the edge kind.
748 SourceN->setEdgeKind(TargetN, Edge::Ref);
749}
750
753 assert((*SourceN)[TargetN].isCall() && "Must start with a call edge!");
754
755#ifdef EXPENSIVE_CHECKS
756 verify();
757 auto VerifyOnExit = make_scope_exit([&]() { verify(); });
758#endif
759
760 assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
761 assert(G->lookupRefSCC(TargetN) == this && "Target must be in this RefSCC.");
762
763 SCC &TargetSCC = *G->lookupSCC(TargetN);
764 assert(G->lookupSCC(SourceN) == &TargetSCC && "Source and Target must be in "
765 "the same SCC to require the "
766 "full CG update.");
767
768 // Set the edge kind.
769 SourceN->setEdgeKind(TargetN, Edge::Ref);
770
771 // Otherwise we are removing a call edge from a single SCC. This may break
772 // the cycle. In order to compute the new set of SCCs, we need to do a small
773 // DFS over the nodes within the SCC to form any sub-cycles that remain as
774 // distinct SCCs and compute a postorder over the resulting SCCs.
775 //
776 // However, we specially handle the target node. The target node is known to
777 // reach all other nodes in the original SCC by definition. This means that
778 // we want the old SCC to be replaced with an SCC containing that node as it
779 // will be the root of whatever SCC DAG results from the DFS. Assumptions
780 // about an SCC such as the set of functions called will continue to hold,
781 // etc.
782
783 SCC &OldSCC = TargetSCC;
785 SmallVector<Node *, 16> PendingSCCStack;
786 SmallVector<SCC *, 4> NewSCCs;
787
788 // Prepare the nodes for a fresh DFS.
790 Worklist.swap(OldSCC.Nodes);
791 for (Node *N : Worklist) {
792 N->DFSNumber = N->LowLink = 0;
793 G->SCCMap.erase(N);
794 }
795
796 // Force the target node to be in the old SCC. This also enables us to take
797 // a very significant short-cut in the standard Tarjan walk to re-form SCCs
798 // below: whenever we build an edge that reaches the target node, we know
799 // that the target node eventually connects back to all other nodes in our
800 // walk. As a consequence, we can detect and handle participants in that
801 // cycle without walking all the edges that form this connection, and instead
802 // by relying on the fundamental guarantee coming into this operation (all
803 // nodes are reachable from the target due to previously forming an SCC).
804 TargetN.DFSNumber = TargetN.LowLink = -1;
805 OldSCC.Nodes.push_back(&TargetN);
806 G->SCCMap[&TargetN] = &OldSCC;
807
808 // Scan down the stack and DFS across the call edges.
809 for (Node *RootN : Worklist) {
810 assert(DFSStack.empty() &&
811 "Cannot begin a new root with a non-empty DFS stack!");
812 assert(PendingSCCStack.empty() &&
813 "Cannot begin a new root with pending nodes for an SCC!");
814
815 // Skip any nodes we've already reached in the DFS.
816 if (RootN->DFSNumber != 0) {
817 assert(RootN->DFSNumber == -1 &&
818 "Shouldn't have any mid-DFS root nodes!");
819 continue;
820 }
821
822 RootN->DFSNumber = RootN->LowLink = 1;
823 int NextDFSNumber = 2;
824
825 DFSStack.emplace_back(RootN, (*RootN)->call_begin());
826 do {
827 auto [N, I] = DFSStack.pop_back_val();
828 auto E = (*N)->call_end();
829 while (I != E) {
830 Node &ChildN = I->getNode();
831 if (ChildN.DFSNumber == 0) {
832 // We haven't yet visited this child, so descend, pushing the current
833 // node onto the stack.
834 DFSStack.emplace_back(N, I);
835
836 assert(!G->SCCMap.count(&ChildN) &&
837 "Found a node with 0 DFS number but already in an SCC!");
838 ChildN.DFSNumber = ChildN.LowLink = NextDFSNumber++;
839 N = &ChildN;
840 I = (*N)->call_begin();
841 E = (*N)->call_end();
842 continue;
843 }
844
845 // Check for the child already being part of some component.
846 if (ChildN.DFSNumber == -1) {
847 if (G->lookupSCC(ChildN) == &OldSCC) {
848 // If the child is part of the old SCC, we know that it can reach
849 // every other node, so we have formed a cycle. Pull the entire DFS
850 // and pending stacks into it. See the comment above about setting
851 // up the old SCC for why we do this.
852 int OldSize = OldSCC.size();
853 OldSCC.Nodes.push_back(N);
854 OldSCC.Nodes.append(PendingSCCStack.begin(), PendingSCCStack.end());
855 PendingSCCStack.clear();
856 while (!DFSStack.empty())
857 OldSCC.Nodes.push_back(DFSStack.pop_back_val().first);
858 for (Node &N : drop_begin(OldSCC, OldSize)) {
859 N.DFSNumber = N.LowLink = -1;
860 G->SCCMap[&N] = &OldSCC;
861 }
862 N = nullptr;
863 break;
864 }
865
866 // If the child has already been added to some child component, it
867 // couldn't impact the low-link of this parent because it isn't
868 // connected, and thus its low-link isn't relevant so skip it.
869 ++I;
870 continue;
871 }
872
873 // Track the lowest linked child as the lowest link for this node.
874 assert(ChildN.LowLink > 0 && "Must have a positive low-link number!");
875 if (ChildN.LowLink < N->LowLink)
876 N->LowLink = ChildN.LowLink;
877
878 // Move to the next edge.
879 ++I;
880 }
881 if (!N)
882 // Cleared the DFS early, start another round.
883 break;
884
885 // We've finished processing N and its descendants, put it on our pending
886 // SCC stack to eventually get merged into an SCC of nodes.
887 PendingSCCStack.push_back(N);
888
889 // If this node is linked to some lower entry, continue walking up the
890 // stack.
891 if (N->LowLink != N->DFSNumber)
892 continue;
893
894 // Otherwise, we've completed an SCC. Append it to our post order list of
895 // SCCs.
896 int RootDFSNumber = N->DFSNumber;
897 // Find the range of the node stack by walking down until we pass the
898 // root DFS number.
899 auto SCCNodes = make_range(
900 PendingSCCStack.rbegin(),
901 find_if(reverse(PendingSCCStack), [RootDFSNumber](const Node *N) {
902 return N->DFSNumber < RootDFSNumber;
903 }));
904
905 // Form a new SCC out of these nodes and then clear them off our pending
906 // stack.
907 NewSCCs.push_back(G->createSCC(*this, SCCNodes));
908 for (Node &N : *NewSCCs.back()) {
909 N.DFSNumber = N.LowLink = -1;
910 G->SCCMap[&N] = NewSCCs.back();
911 }
912 PendingSCCStack.erase(SCCNodes.end().base(), PendingSCCStack.end());
913 } while (!DFSStack.empty());
914 }
915
916 // Insert the remaining SCCs before the old one. The old SCC can reach all
917 // other SCCs we form because it contains the target node of the removed edge
918 // of the old SCC. This means that we will have edges into all the new SCCs,
919 // which means the old one must come last for postorder.
920 int OldIdx = SCCIndices[&OldSCC];
921 SCCs.insert(SCCs.begin() + OldIdx, NewSCCs.begin(), NewSCCs.end());
922
923 // Update the mapping from SCC* to index to use the new SCC*s, and remove the
924 // old SCC from the mapping.
925 for (int Idx = OldIdx, Size = SCCs.size(); Idx < Size; ++Idx)
926 SCCIndices[SCCs[Idx]] = Idx;
927
928 return make_range(SCCs.begin() + OldIdx,
929 SCCs.begin() + OldIdx + NewSCCs.size());
930}
931
933 Node &TargetN) {
934 assert(!(*SourceN)[TargetN].isCall() && "Must start with a ref edge!");
935
936 assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
937 assert(G->lookupRefSCC(TargetN) != this &&
938 "Target must not be in this RefSCC.");
939#ifdef EXPENSIVE_CHECKS
940 assert(G->lookupRefSCC(TargetN)->isDescendantOf(*this) &&
941 "Target must be a descendant of the Source.");
942#endif
943
944 // Edges between RefSCCs are the same regardless of call or ref, so we can
945 // just flip the edge here.
946 SourceN->setEdgeKind(TargetN, Edge::Call);
947
948#ifdef EXPENSIVE_CHECKS
949 verify();
950#endif
951}
952
954 Node &TargetN) {
955 assert((*SourceN)[TargetN].isCall() && "Must start with a call edge!");
956
957 assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
958 assert(G->lookupRefSCC(TargetN) != this &&
959 "Target must not be in this RefSCC.");
960#ifdef EXPENSIVE_CHECKS
961 assert(G->lookupRefSCC(TargetN)->isDescendantOf(*this) &&
962 "Target must be a descendant of the Source.");
963#endif
964
965 // Edges between RefSCCs are the same regardless of call or ref, so we can
966 // just flip the edge here.
967 SourceN->setEdgeKind(TargetN, Edge::Ref);
968
969#ifdef EXPENSIVE_CHECKS
970 verify();
971#endif
972}
973
975 Node &TargetN) {
976 assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
977 assert(G->lookupRefSCC(TargetN) == this && "Target must be in this RefSCC.");
978
979 SourceN->insertEdgeInternal(TargetN, Edge::Ref);
980
981#ifdef EXPENSIVE_CHECKS
982 verify();
983#endif
984}
985
987 Edge::Kind EK) {
988 // First insert it into the caller.
989 SourceN->insertEdgeInternal(TargetN, EK);
990
991 assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
992
993 assert(G->lookupRefSCC(TargetN) != this &&
994 "Target must not be in this RefSCC.");
995#ifdef EXPENSIVE_CHECKS
996 assert(G->lookupRefSCC(TargetN)->isDescendantOf(*this) &&
997 "Target must be a descendant of the Source.");
998#endif
999
1000#ifdef EXPENSIVE_CHECKS
1001 verify();
1002#endif
1003}
1004
1007 assert(G->lookupRefSCC(TargetN) == this && "Target must be in this RefSCC.");
1008 RefSCC &SourceC = *G->lookupRefSCC(SourceN);
1009 assert(&SourceC != this && "Source must not be in this RefSCC.");
1010#ifdef EXPENSIVE_CHECKS
1011 assert(SourceC.isDescendantOf(*this) &&
1012 "Source must be a descendant of the Target.");
1013#endif
1014
1015 SmallVector<RefSCC *, 1> DeletedRefSCCs;
1016
1017#ifdef EXPENSIVE_CHECKS
1018 verify();
1019 auto VerifyOnExit = make_scope_exit([&]() { verify(); });
1020#endif
1021
1022 int SourceIdx = G->RefSCCIndices[&SourceC];
1023 int TargetIdx = G->RefSCCIndices[this];
1024 assert(SourceIdx < TargetIdx &&
1025 "Postorder list doesn't see edge as incoming!");
1026
1027 // Compute the RefSCCs which (transitively) reach the source. We do this by
1028 // working backwards from the source using the parent set in each RefSCC,
1029 // skipping any RefSCCs that don't fall in the postorder range. This has the
1030 // advantage of walking the sparser parent edge (in high fan-out graphs) but
1031 // more importantly this removes examining all forward edges in all RefSCCs
1032 // within the postorder range which aren't in fact connected. Only connected
1033 // RefSCCs (and their edges) are visited here.
1034 auto ComputeSourceConnectedSet = [&](SmallPtrSetImpl<RefSCC *> &Set) {
1035 Set.insert(&SourceC);
1036 auto IsConnected = [&](RefSCC &RC) {
1037 for (SCC &C : RC)
1038 for (Node &N : C)
1039 for (Edge &E : *N)
1040 if (Set.count(G->lookupRefSCC(E.getNode())))
1041 return true;
1042
1043 return false;
1044 };
1045
1046 for (RefSCC *C : make_range(G->PostOrderRefSCCs.begin() + SourceIdx + 1,
1047 G->PostOrderRefSCCs.begin() + TargetIdx + 1))
1048 if (IsConnected(*C))
1049 Set.insert(C);
1050 };
1051
1052 // Use a normal worklist to find which SCCs the target connects to. We still
1053 // bound the search based on the range in the postorder list we care about,
1054 // but because this is forward connectivity we just "recurse" through the
1055 // edges.
1056 auto ComputeTargetConnectedSet = [&](SmallPtrSetImpl<RefSCC *> &Set) {
1057 Set.insert(this);
1058 SmallVector<RefSCC *, 4> Worklist;
1059 Worklist.push_back(this);
1060 do {
1061 RefSCC &RC = *Worklist.pop_back_val();
1062 for (SCC &C : RC)
1063 for (Node &N : C)
1064 for (Edge &E : *N) {
1065 RefSCC &EdgeRC = *G->lookupRefSCC(E.getNode());
1066 if (G->getRefSCCIndex(EdgeRC) <= SourceIdx)
1067 // Not in the postorder sequence between source and target.
1068 continue;
1069
1070 if (Set.insert(&EdgeRC).second)
1071 Worklist.push_back(&EdgeRC);
1072 }
1073 } while (!Worklist.empty());
1074 };
1075
1076 // Use a generic helper to update the postorder sequence of RefSCCs and return
1077 // a range of any RefSCCs connected into a cycle by inserting this edge. This
1078 // routine will also take care of updating the indices into the postorder
1079 // sequence.
1082 SourceC, *this, G->PostOrderRefSCCs, G->RefSCCIndices,
1083 ComputeSourceConnectedSet, ComputeTargetConnectedSet);
1084
1085 // Build a set, so we can do fast tests for whether a RefSCC will end up as
1086 // part of the merged RefSCC.
1087 SmallPtrSet<RefSCC *, 16> MergeSet(MergeRange.begin(), MergeRange.end());
1088
1089 // This RefSCC will always be part of that set, so just insert it here.
1090 MergeSet.insert(this);
1091
1092 // Now that we have identified all the SCCs which need to be merged into
1093 // a connected set with the inserted edge, merge all of them into this SCC.
1094 SmallVector<SCC *, 16> MergedSCCs;
1095 int SCCIndex = 0;
1096 for (RefSCC *RC : MergeRange) {
1097 assert(RC != this && "We're merging into the target RefSCC, so it "
1098 "shouldn't be in the range.");
1099
1100 // Walk the inner SCCs to update their up-pointer and walk all the edges to
1101 // update any parent sets.
1102 // FIXME: We should try to find a way to avoid this (rather expensive) edge
1103 // walk by updating the parent sets in some other manner.
1104 for (SCC &InnerC : *RC) {
1105 InnerC.OuterRefSCC = this;
1106 SCCIndices[&InnerC] = SCCIndex++;
1107 for (Node &N : InnerC)
1108 G->SCCMap[&N] = &InnerC;
1109 }
1110
1111 // Now merge in the SCCs. We can actually move here so try to reuse storage
1112 // the first time through.
1113 if (MergedSCCs.empty())
1114 MergedSCCs = std::move(RC->SCCs);
1115 else
1116 MergedSCCs.append(RC->SCCs.begin(), RC->SCCs.end());
1117 RC->SCCs.clear();
1118 DeletedRefSCCs.push_back(RC);
1119 }
1120
1121 // Append our original SCCs to the merged list and move it into place.
1122 for (SCC &InnerC : *this)
1123 SCCIndices[&InnerC] = SCCIndex++;
1124 MergedSCCs.append(SCCs.begin(), SCCs.end());
1125 SCCs = std::move(MergedSCCs);
1126
1127 // Remove the merged away RefSCCs from the post order sequence.
1128 for (RefSCC *RC : MergeRange)
1129 G->RefSCCIndices.erase(RC);
1130 int IndexOffset = MergeRange.end() - MergeRange.begin();
1131 auto EraseEnd =
1132 G->PostOrderRefSCCs.erase(MergeRange.begin(), MergeRange.end());
1133 for (RefSCC *RC : make_range(EraseEnd, G->PostOrderRefSCCs.end()))
1134 G->RefSCCIndices[RC] -= IndexOffset;
1135
1136 // At this point we have a merged RefSCC with a post-order SCCs list, just
1137 // connect the nodes to form the new edge.
1138 SourceN->insertEdgeInternal(TargetN, Edge::Ref);
1139
1140 // We return the list of SCCs which were merged so that callers can
1141 // invalidate any data they have associated with those SCCs. Note that these
1142 // SCCs are no longer in an interesting state (they are totally empty) but
1143 // the pointers will remain stable for the life of the graph itself.
1144 return DeletedRefSCCs;
1145}
1146
1148 assert(G->lookupRefSCC(SourceN) == this &&
1149 "The source must be a member of this RefSCC.");
1150 assert(G->lookupRefSCC(TargetN) != this &&
1151 "The target must not be a member of this RefSCC");
1152
1153#ifdef EXPENSIVE_CHECKS
1154 verify();
1155 auto VerifyOnExit = make_scope_exit([&]() { verify(); });
1156#endif
1157
1158 // First remove it from the node.
1159 bool Removed = SourceN->removeEdgeInternal(TargetN);
1160 (void)Removed;
1161 assert(Removed && "Target not in the edge set for this caller?");
1162}
1163
1166 ArrayRef<std::pair<Node *, Node *>> Edges) {
1167 // We return a list of the resulting *new* RefSCCs in post-order.
1169
1170#ifdef EXPENSIVE_CHECKS
1171 // Verify the RefSCC is valid to start with and that either we return an empty
1172 // list of result RefSCCs and this RefSCC remains valid, or we return new
1173 // RefSCCs and this RefSCC is dead.
1174 verify();
1175 auto VerifyOnExit = make_scope_exit([&]() {
1176 // If we didn't replace our RefSCC with new ones, check that this one
1177 // remains valid.
1178 if (G)
1179 verify();
1180 });
1181#endif
1182
1183 // First remove the actual edges.
1184 for (auto [SourceN, TargetN] : Edges) {
1185 assert(!(**SourceN)[*TargetN].isCall() &&
1186 "Cannot remove a call edge, it must first be made a ref edge");
1187
1188 bool Removed = (*SourceN)->removeEdgeInternal(*TargetN);
1189 (void)Removed;
1190 assert(Removed && "Target not in the edge set for this caller?");
1191 }
1192
1193 // Direct self references don't impact the ref graph at all.
1194 // If all targets are in the same SCC as the source, because no call edges
1195 // were removed there is no RefSCC structure change.
1196 if (llvm::all_of(Edges, [&](std::pair<Node *, Node *> E) {
1197 return E.first == E.second ||
1198 G->lookupSCC(*E.first) == G->lookupSCC(*E.second);
1199 }))
1200 return Result;
1201
1202 // We build somewhat synthetic new RefSCCs by providing a postorder mapping
1203 // for each inner SCC. We store these inside the low-link field of the nodes
1204 // rather than associated with SCCs because this saves a round-trip through
1205 // the node->SCC map and in the common case, SCCs are small. We will verify
1206 // that we always give the same number to every node in the SCC such that
1207 // these are equivalent.
1208 int PostOrderNumber = 0;
1209
1210 // Reset all the other nodes to prepare for a DFS over them, and add them to
1211 // our worklist.
1212 SmallVector<Node *, 8> Worklist;
1213 for (SCC *C : SCCs) {
1214 for (Node &N : *C)
1215 N.DFSNumber = N.LowLink = 0;
1216
1217 Worklist.append(C->Nodes.begin(), C->Nodes.end());
1218 }
1219
1220 // Track the number of nodes in this RefSCC so that we can quickly recognize
1221 // an important special case of the edge removal not breaking the cycle of
1222 // this RefSCC.
1223 const int NumRefSCCNodes = Worklist.size();
1224
1226 SmallVector<Node *, 4> PendingRefSCCStack;
1227 do {
1228 assert(DFSStack.empty() &&
1229 "Cannot begin a new root with a non-empty DFS stack!");
1230 assert(PendingRefSCCStack.empty() &&
1231 "Cannot begin a new root with pending nodes for an SCC!");
1232
1233 Node *RootN = Worklist.pop_back_val();
1234 // Skip any nodes we've already reached in the DFS.
1235 if (RootN->DFSNumber != 0) {
1236 assert(RootN->DFSNumber == -1 &&
1237 "Shouldn't have any mid-DFS root nodes!");
1238 continue;
1239 }
1240
1241 RootN->DFSNumber = RootN->LowLink = 1;
1242 int NextDFSNumber = 2;
1243
1244 DFSStack.emplace_back(RootN, (*RootN)->begin());
1245 do {
1246 auto [N, I] = DFSStack.pop_back_val();
1247 auto E = (*N)->end();
1248
1249 assert(N->DFSNumber != 0 && "We should always assign a DFS number "
1250 "before processing a node.");
1251
1252 while (I != E) {
1253 Node &ChildN = I->getNode();
1254 if (ChildN.DFSNumber == 0) {
1255 // Mark that we should start at this child when next this node is the
1256 // top of the stack. We don't start at the next child to ensure this
1257 // child's lowlink is reflected.
1258 DFSStack.emplace_back(N, I);
1259
1260 // Continue, resetting to the child node.
1261 ChildN.LowLink = ChildN.DFSNumber = NextDFSNumber++;
1262 N = &ChildN;
1263 I = ChildN->begin();
1264 E = ChildN->end();
1265 continue;
1266 }
1267 if (ChildN.DFSNumber == -1) {
1268 // If this child isn't currently in this RefSCC, no need to process
1269 // it.
1270 ++I;
1271 continue;
1272 }
1273
1274 // Track the lowest link of the children, if any are still in the stack.
1275 // Any child not on the stack will have a LowLink of -1.
1276 assert(ChildN.LowLink != 0 &&
1277 "Low-link must not be zero with a non-zero DFS number.");
1278 if (ChildN.LowLink >= 0 && ChildN.LowLink < N->LowLink)
1279 N->LowLink = ChildN.LowLink;
1280 ++I;
1281 }
1282
1283 // We've finished processing N and its descendants, put it on our pending
1284 // stack to eventually get merged into a RefSCC.
1285 PendingRefSCCStack.push_back(N);
1286
1287 // If this node is linked to some lower entry, continue walking up the
1288 // stack.
1289 if (N->LowLink != N->DFSNumber) {
1290 assert(!DFSStack.empty() &&
1291 "We never found a viable root for a RefSCC to pop off!");
1292 continue;
1293 }
1294
1295 // Otherwise, form a new RefSCC from the top of the pending node stack.
1296 int RefSCCNumber = PostOrderNumber++;
1297 int RootDFSNumber = N->DFSNumber;
1298
1299 // Find the range of the node stack by walking down until we pass the
1300 // root DFS number. Update the DFS numbers and low link numbers in the
1301 // process to avoid re-walking this list where possible.
1302 auto StackRI = find_if(reverse(PendingRefSCCStack), [&](Node *N) {
1303 if (N->DFSNumber < RootDFSNumber)
1304 // We've found the bottom.
1305 return true;
1306
1307 // Update this node and keep scanning.
1308 N->DFSNumber = -1;
1309 // Save the post-order number in the lowlink field so that we can use
1310 // it to map SCCs into new RefSCCs after we finish the DFS.
1311 N->LowLink = RefSCCNumber;
1312 return false;
1313 });
1314 auto RefSCCNodes = make_range(StackRI.base(), PendingRefSCCStack.end());
1315
1316 // If we find a cycle containing all nodes originally in this RefSCC then
1317 // the removal hasn't changed the structure at all. This is an important
1318 // special case, and we can directly exit the entire routine more
1319 // efficiently as soon as we discover it.
1320 if (llvm::size(RefSCCNodes) == NumRefSCCNodes) {
1321 // Clear out the low link field as we won't need it.
1322 for (Node *N : RefSCCNodes)
1323 N->LowLink = -1;
1324 // Return the empty result immediately.
1325 return Result;
1326 }
1327
1328 // We've already marked the nodes internally with the RefSCC number so
1329 // just clear them off the stack and continue.
1330 PendingRefSCCStack.erase(RefSCCNodes.begin(), PendingRefSCCStack.end());
1331 } while (!DFSStack.empty());
1332
1333 assert(DFSStack.empty() && "Didn't flush the entire DFS stack!");
1334 assert(PendingRefSCCStack.empty() && "Didn't flush all pending nodes!");
1335 } while (!Worklist.empty());
1336
1337 assert(PostOrderNumber > 1 &&
1338 "Should never finish the DFS when the existing RefSCC remains valid!");
1339
1340 // Otherwise we create a collection of new RefSCC nodes and build
1341 // a radix-sort style map from postorder number to these new RefSCCs. We then
1342 // append SCCs to each of these RefSCCs in the order they occurred in the
1343 // original SCCs container.
1344 for (int I = 0; I < PostOrderNumber; ++I)
1345 Result.push_back(G->createRefSCC(*G));
1346
1347 // Insert the resulting postorder sequence into the global graph postorder
1348 // sequence before the current RefSCC in that sequence, and then remove the
1349 // current one.
1350 //
1351 // FIXME: It'd be nice to change the APIs so that we returned an iterator
1352 // range over the global postorder sequence and generally use that sequence
1353 // rather than building a separate result vector here.
1354 int Idx = G->getRefSCCIndex(*this);
1355 G->PostOrderRefSCCs.erase(G->PostOrderRefSCCs.begin() + Idx);
1356 G->PostOrderRefSCCs.insert(G->PostOrderRefSCCs.begin() + Idx, Result.begin(),
1357 Result.end());
1358 for (int I : seq<int>(Idx, G->PostOrderRefSCCs.size()))
1359 G->RefSCCIndices[G->PostOrderRefSCCs[I]] = I;
1360
1361 for (SCC *C : SCCs) {
1362 // We store the SCC number in the node's low-link field above.
1363 int SCCNumber = C->begin()->LowLink;
1364 // Clear out all the SCC's node's low-link fields now that we're done
1365 // using them as side-storage.
1366 for (Node &N : *C) {
1367 assert(N.LowLink == SCCNumber &&
1368 "Cannot have different numbers for nodes in the same SCC!");
1369 N.LowLink = -1;
1370 }
1371
1372 RefSCC &RC = *Result[SCCNumber];
1373 int SCCIndex = RC.SCCs.size();
1374 RC.SCCs.push_back(C);
1375 RC.SCCIndices[C] = SCCIndex;
1376 C->OuterRefSCC = &RC;
1377 }
1378
1379 // Now that we've moved things into the new RefSCCs, clear out our current
1380 // one.
1381 G = nullptr;
1382 SCCs.clear();
1383 SCCIndices.clear();
1384
1385#ifdef EXPENSIVE_CHECKS
1386 // Verify the new RefSCCs we've built.
1387 for (RefSCC *RC : Result)
1388 RC->verify();
1389#endif
1390
1391 // Return the new list of SCCs.
1392 return Result;
1393}
1394
1396 Node &TargetN) {
1397#ifdef EXPENSIVE_CHECKS
1398 auto ExitVerifier = make_scope_exit([this] { verify(); });
1399
1400 // Check that we aren't breaking some invariants of the SCC graph. Note that
1401 // this is quadratic in the number of edges in the call graph!
1402 SCC &SourceC = *G->lookupSCC(SourceN);
1403 SCC &TargetC = *G->lookupSCC(TargetN);
1404 if (&SourceC != &TargetC)
1405 assert(SourceC.isAncestorOf(TargetC) &&
1406 "Call edge is not trivial in the SCC graph!");
1407#endif
1408
1409 // First insert it into the source or find the existing edge.
1410 auto [Iterator, Inserted] =
1411 SourceN->EdgeIndexMap.try_emplace(&TargetN, SourceN->Edges.size());
1412 if (!Inserted) {
1413 // Already an edge, just update it.
1414 Edge &E = SourceN->Edges[Iterator->second];
1415 if (E.isCall())
1416 return; // Nothing to do!
1417 E.setKind(Edge::Call);
1418 } else {
1419 // Create the new edge.
1420 SourceN->Edges.emplace_back(TargetN, Edge::Call);
1421 }
1422}
1423
1425#ifdef EXPENSIVE_CHECKS
1426 auto ExitVerifier = make_scope_exit([this] { verify(); });
1427
1428 // Check that we aren't breaking some invariants of the RefSCC graph.
1429 RefSCC &SourceRC = *G->lookupRefSCC(SourceN);
1430 RefSCC &TargetRC = *G->lookupRefSCC(TargetN);
1431 if (&SourceRC != &TargetRC)
1432 assert(SourceRC.isAncestorOf(TargetRC) &&
1433 "Ref edge is not trivial in the RefSCC graph!");
1434#endif
1435
1436 // First insert it into the source or find the existing edge.
1437 auto [Iterator, Inserted] =
1438 SourceN->EdgeIndexMap.try_emplace(&TargetN, SourceN->Edges.size());
1439 (void)Iterator;
1440 if (!Inserted)
1441 // Already an edge, we're done.
1442 return;
1443
1444 // Create the new edge.
1445 SourceN->Edges.emplace_back(TargetN, Edge::Ref);
1446}
1447
1449 Function &OldF = N.getFunction();
1450
1451#ifdef EXPENSIVE_CHECKS
1452 auto ExitVerifier = make_scope_exit([this] { verify(); });
1453
1454 assert(G->lookupRefSCC(N) == this &&
1455 "Cannot replace the function of a node outside this RefSCC.");
1456
1457 assert(G->NodeMap.find(&NewF) == G->NodeMap.end() &&
1458 "Must not have already walked the new function!'");
1459
1460 // It is important that this replacement not introduce graph changes so we
1461 // insist that the caller has already removed every use of the original
1462 // function and that all uses of the new function correspond to existing
1463 // edges in the graph. The common and expected way to use this is when
1464 // replacing the function itself in the IR without changing the call graph
1465 // shape and just updating the analysis based on that.
1466 assert(&OldF != &NewF && "Cannot replace a function with itself!");
1467 assert(OldF.use_empty() &&
1468 "Must have moved all uses from the old function to the new!");
1469#endif
1470
1471 N.replaceFunction(NewF);
1472
1473 // Update various call graph maps.
1474 G->NodeMap.erase(&OldF);
1475 G->NodeMap[&NewF] = &N;
1476
1477 // Update lib functions.
1478 if (G->isLibFunction(OldF)) {
1479 G->LibFunctions.remove(&OldF);
1480 G->LibFunctions.insert(&NewF);
1481 }
1482}
1483
1484void LazyCallGraph::insertEdge(Node &SourceN, Node &TargetN, Edge::Kind EK) {
1485 assert(SCCMap.empty() &&
1486 "This method cannot be called after SCCs have been formed!");
1487
1488 return SourceN->insertEdgeInternal(TargetN, EK);
1489}
1490
1491void LazyCallGraph::removeEdge(Node &SourceN, Node &TargetN) {
1492 assert(SCCMap.empty() &&
1493 "This method cannot be called after SCCs have been formed!");
1494
1495 bool Removed = SourceN->removeEdgeInternal(TargetN);
1496 (void)Removed;
1497 assert(Removed && "Target not in the edge set for this caller?");
1498}
1499
1501 // FIXME: This is unnecessarily restrictive. We should be able to remove
1502 // functions which recursively call themselves.
1503 assert(F.hasZeroLiveUses() &&
1504 "This routine should only be called on trivially dead functions!");
1505
1506 // We shouldn't remove library functions as they are never really dead while
1507 // the call graph is in use -- every function definition refers to them.
1509 "Must not remove lib functions from the call graph!");
1510
1511 auto NI = NodeMap.find(&F);
1512 assert(NI != NodeMap.end() && "Removed function should be known!");
1513
1514 Node &N = *NI->second;
1515
1516 // Remove all call edges out of dead function.
1517 for (Edge E : *N) {
1518 if (E.isCall())
1519 N->setEdgeKind(E.getNode(), Edge::Ref);
1520 }
1521}
1522
1524 if (DeadFs.empty())
1525 return;
1526
1527 // Group dead functions by the RefSCC they're in.
1529 for (Function *DeadF : DeadFs) {
1530 Node *N = lookup(*DeadF);
1531#ifndef NDEBUG
1532 for (Edge &E : **N) {
1533 assert(!E.isCall() &&
1534 "dead function shouldn't have any outgoing call edges");
1535 }
1536#endif
1537 RefSCC *RC = lookupRefSCC(*N);
1538 RCs[RC].push_back(N);
1539 }
1540 // Remove outgoing edges from all dead functions. Dead functions should
1541 // already have had their call edges removed in markDeadFunction(), so we only
1542 // need to worry about spurious ref edges.
1543 for (auto [RC, DeadNs] : RCs) {
1544 SmallVector<std::pair<Node *, Node *>> InternalEdgesToRemove;
1545 for (Node *DeadN : DeadNs) {
1546 for (Edge &E : **DeadN) {
1547 if (lookupRefSCC(E.getNode()) == RC)
1548 InternalEdgesToRemove.push_back({DeadN, &E.getNode()});
1549 else
1550 RC->removeOutgoingEdge(*DeadN, E.getNode());
1551 }
1552 }
1553 // We ignore the returned RefSCCs since at this point we're done with CGSCC
1554 // iteration and don't need to add it to any worklists.
1555 (void)RC->removeInternalRefEdges(InternalEdgesToRemove);
1556 for (Node *DeadN : DeadNs) {
1557 RefSCC *DeadRC = lookupRefSCC(*DeadN);
1558 assert(DeadRC->size() == 1);
1559 assert(DeadRC->begin()->size() == 1);
1560 DeadRC->clear();
1561 DeadRC->G = nullptr;
1562 }
1563 }
1564 // Clean up data structures.
1565 for (Function *DeadF : DeadFs) {
1566 Node &N = *lookup(*DeadF);
1567
1568 EntryEdges.removeEdgeInternal(N);
1569 SCCMap.erase(SCCMap.find(&N));
1570 NodeMap.erase(NodeMap.find(DeadF));
1571
1572 N.clear();
1573 N.G = nullptr;
1574 N.F = nullptr;
1575 }
1576}
1577
1578// Gets the Edge::Kind from one function to another by looking at the function's
1579// instructions. Asserts if there is no edge.
1580// Useful for determining what type of edge should exist between functions when
1581// the edge hasn't been created yet.
1583 Function &NewFunction) {
1584 // In release builds, assume that if there are no direct calls to the new
1585 // function, then there is a ref edge. In debug builds, keep track of
1586 // references to assert that there is actually a ref edge if there is no call
1587 // edge.
1588#ifndef NDEBUG
1591#endif
1592
1593 for (Instruction &I : instructions(OriginalFunction)) {
1594 if (auto *CB = dyn_cast<CallBase>(&I)) {
1595 if (Function *Callee = CB->getCalledFunction()) {
1596 if (Callee == &NewFunction)
1598 }
1599 }
1600#ifndef NDEBUG
1601 for (Value *Op : I.operand_values()) {
1602 if (Constant *C = dyn_cast<Constant>(Op)) {
1603 if (Visited.insert(C).second)
1604 Worklist.push_back(C);
1605 }
1606 }
1607#endif
1608 }
1609
1610#ifndef NDEBUG
1611 bool FoundNewFunction = false;
1612 LazyCallGraph::visitReferences(Worklist, Visited, [&](Function &F) {
1613 if (&F == &NewFunction)
1614 FoundNewFunction = true;
1615 });
1616 assert(FoundNewFunction && "No edge from original function to new function");
1617#endif
1618
1620}
1621
1623 Function &NewFunction) {
1624 assert(lookup(OriginalFunction) &&
1625 "Original function's node should already exist");
1626 Node &OriginalN = get(OriginalFunction);
1627 SCC *OriginalC = lookupSCC(OriginalN);
1628 RefSCC *OriginalRC = lookupRefSCC(OriginalN);
1629
1630#ifdef EXPENSIVE_CHECKS
1631 OriginalRC->verify();
1632 auto VerifyOnExit = make_scope_exit([&]() { OriginalRC->verify(); });
1633#endif
1634
1635 assert(!lookup(NewFunction) &&
1636 "New function's node should not already exist");
1637 Node &NewN = initNode(NewFunction);
1638
1639 Edge::Kind EK = getEdgeKind(OriginalFunction, NewFunction);
1640
1641 SCC *NewC = nullptr;
1642 for (Edge &E : *NewN) {
1643 Node &EN = E.getNode();
1644 if (EK == Edge::Kind::Call && E.isCall() && lookupSCC(EN) == OriginalC) {
1645 // If the edge to the new function is a call edge and there is a call edge
1646 // from the new function to any function in the original function's SCC,
1647 // it is in the same SCC (and RefSCC) as the original function.
1648 NewC = OriginalC;
1649 NewC->Nodes.push_back(&NewN);
1650 break;
1651 }
1652 }
1653
1654 if (!NewC) {
1655 for (Edge &E : *NewN) {
1656 Node &EN = E.getNode();
1657 if (lookupRefSCC(EN) == OriginalRC) {
1658 // If there is any edge from the new function to any function in the
1659 // original function's RefSCC, it is in the same RefSCC as the original
1660 // function but a new SCC.
1661 RefSCC *NewRC = OriginalRC;
1662 NewC = createSCC(*NewRC, SmallVector<Node *, 1>({&NewN}));
1663
1664 // The new function's SCC is not the same as the original function's
1665 // SCC, since that case was handled earlier. If the edge from the
1666 // original function to the new function was a call edge, then we need
1667 // to insert the newly created function's SCC before the original
1668 // function's SCC. Otherwise, either the new SCC comes after the
1669 // original function's SCC, or it doesn't matter, and in both cases we
1670 // can add it to the very end.
1671 int InsertIndex = EK == Edge::Kind::Call ? NewRC->SCCIndices[OriginalC]
1672 : NewRC->SCCIndices.size();
1673 NewRC->SCCs.insert(NewRC->SCCs.begin() + InsertIndex, NewC);
1674 for (int I = InsertIndex, Size = NewRC->SCCs.size(); I < Size; ++I)
1675 NewRC->SCCIndices[NewRC->SCCs[I]] = I;
1676
1677 break;
1678 }
1679 }
1680 }
1681
1682 if (!NewC) {
1683 // We didn't find any edges back to the original function's RefSCC, so the
1684 // new function belongs in a new RefSCC. The new RefSCC goes before the
1685 // original function's RefSCC.
1686 RefSCC *NewRC = createRefSCC(*this);
1687 NewC = createSCC(*NewRC, SmallVector<Node *, 1>({&NewN}));
1688 NewRC->SCCIndices[NewC] = 0;
1689 NewRC->SCCs.push_back(NewC);
1690 auto OriginalRCIndex = RefSCCIndices.find(OriginalRC)->second;
1691 PostOrderRefSCCs.insert(PostOrderRefSCCs.begin() + OriginalRCIndex, NewRC);
1692 for (int I = OriginalRCIndex, Size = PostOrderRefSCCs.size(); I < Size; ++I)
1693 RefSCCIndices[PostOrderRefSCCs[I]] = I;
1694 }
1695
1696 SCCMap[&NewN] = NewC;
1697
1698 OriginalN->insertEdgeInternal(NewN, EK);
1699}
1700
1702 Function &OriginalFunction, ArrayRef<Function *> NewFunctions) {
1703 assert(!NewFunctions.empty() && "Can't add zero functions");
1704 assert(lookup(OriginalFunction) &&
1705 "Original function's node should already exist");
1706 Node &OriginalN = get(OriginalFunction);
1707 RefSCC *OriginalRC = lookupRefSCC(OriginalN);
1708
1709#ifdef EXPENSIVE_CHECKS
1710 OriginalRC->verify();
1711 auto VerifyOnExit = make_scope_exit([&]() {
1712 OriginalRC->verify();
1713 for (Function *NewFunction : NewFunctions)
1714 lookupRefSCC(get(*NewFunction))->verify();
1715 });
1716#endif
1717
1718 bool ExistsRefToOriginalRefSCC = false;
1719
1720 for (Function *NewFunction : NewFunctions) {
1721 Node &NewN = initNode(*NewFunction);
1722
1723 OriginalN->insertEdgeInternal(NewN, Edge::Kind::Ref);
1724
1725 // Check if there is any edge from any new function back to any function in
1726 // the original function's RefSCC.
1727 for (Edge &E : *NewN) {
1728 if (lookupRefSCC(E.getNode()) == OriginalRC) {
1729 ExistsRefToOriginalRefSCC = true;
1730 break;
1731 }
1732 }
1733 }
1734
1735 RefSCC *NewRC;
1736 if (ExistsRefToOriginalRefSCC) {
1737 // If there is any edge from any new function to any function in the
1738 // original function's RefSCC, all new functions will be in the same RefSCC
1739 // as the original function.
1740 NewRC = OriginalRC;
1741 } else {
1742 // Otherwise the new functions are in their own RefSCC.
1743 NewRC = createRefSCC(*this);
1744 // The new RefSCC goes before the original function's RefSCC in postorder
1745 // since there are only edges from the original function's RefSCC to the new
1746 // RefSCC.
1747 auto OriginalRCIndex = RefSCCIndices.find(OriginalRC)->second;
1748 PostOrderRefSCCs.insert(PostOrderRefSCCs.begin() + OriginalRCIndex, NewRC);
1749 for (int I = OriginalRCIndex, Size = PostOrderRefSCCs.size(); I < Size; ++I)
1750 RefSCCIndices[PostOrderRefSCCs[I]] = I;
1751 }
1752
1753 for (Function *NewFunction : NewFunctions) {
1754 Node &NewN = get(*NewFunction);
1755 // Each new function is in its own new SCC. The original function can only
1756 // have a ref edge to new functions, and no other existing functions can
1757 // have references to new functions. Each new function only has a ref edge
1758 // to the other new functions.
1759 SCC *NewC = createSCC(*NewRC, SmallVector<Node *, 1>({&NewN}));
1760 // The new SCCs are either sibling SCCs or parent SCCs to all other existing
1761 // SCCs in the RefSCC. Either way, they can go at the back of the postorder
1762 // SCC list.
1763 auto Index = NewRC->SCCIndices.size();
1764 NewRC->SCCIndices[NewC] = Index;
1765 NewRC->SCCs.push_back(NewC);
1766 SCCMap[&NewN] = NewC;
1767 }
1768
1769#ifndef NDEBUG
1770 for (Function *F1 : NewFunctions) {
1771 assert(getEdgeKind(OriginalFunction, *F1) == Edge::Kind::Ref &&
1772 "Expected ref edges from original function to every new function");
1773 Node &N1 = get(*F1);
1774 for (Function *F2 : NewFunctions) {
1775 if (F1 == F2)
1776 continue;
1777 Node &N2 = get(*F2);
1778 assert(!N1->lookup(N2)->isCall() &&
1779 "Edges between new functions must be ref edges");
1780 }
1781 }
1782#endif
1783}
1784
1785LazyCallGraph::Node &LazyCallGraph::insertInto(Function &F, Node *&MappedN) {
1786 return *new (MappedN = BPA.Allocate()) Node(*this, F);
1787}
1788
1789void LazyCallGraph::updateGraphPtrs() {
1790 // Walk the node map to update their graph pointers. While this iterates in
1791 // an unstable order, the order has no effect, so it remains correct.
1792 for (auto &FunctionNodePair : NodeMap)
1793 FunctionNodePair.second->G = this;
1794
1795 for (auto *RC : PostOrderRefSCCs)
1796 RC->G = this;
1797}
1798
1799LazyCallGraph::Node &LazyCallGraph::initNode(Function &F) {
1800 Node &N = get(F);
1801 N.DFSNumber = N.LowLink = -1;
1802 N.populate();
1803 NodeMap[&F] = &N;
1804 return N;
1805}
1806
1807template <typename RootsT, typename GetBeginT, typename GetEndT,
1808 typename GetNodeT, typename FormSCCCallbackT>
1809void LazyCallGraph::buildGenericSCCs(RootsT &&Roots, GetBeginT &&GetBegin,
1810 GetEndT &&GetEnd, GetNodeT &&GetNode,
1811 FormSCCCallbackT &&FormSCC) {
1812 using EdgeItT = decltype(GetBegin(std::declval<Node &>()));
1813
1815 SmallVector<Node *, 16> PendingSCCStack;
1816
1817 // Scan down the stack and DFS across the call edges.
1818 for (Node *RootN : Roots) {
1819 assert(DFSStack.empty() &&
1820 "Cannot begin a new root with a non-empty DFS stack!");
1821 assert(PendingSCCStack.empty() &&
1822 "Cannot begin a new root with pending nodes for an SCC!");
1823
1824 // Skip any nodes we've already reached in the DFS.
1825 if (RootN->DFSNumber != 0) {
1826 assert(RootN->DFSNumber == -1 &&
1827 "Shouldn't have any mid-DFS root nodes!");
1828 continue;
1829 }
1830
1831 RootN->DFSNumber = RootN->LowLink = 1;
1832 int NextDFSNumber = 2;
1833
1834 DFSStack.emplace_back(RootN, GetBegin(*RootN));
1835 do {
1836 auto [N, I] = DFSStack.pop_back_val();
1837 auto E = GetEnd(*N);
1838 while (I != E) {
1839 Node &ChildN = GetNode(I);
1840 if (ChildN.DFSNumber == 0) {
1841 // We haven't yet visited this child, so descend, pushing the current
1842 // node onto the stack.
1843 DFSStack.emplace_back(N, I);
1844
1845 ChildN.DFSNumber = ChildN.LowLink = NextDFSNumber++;
1846 N = &ChildN;
1847 I = GetBegin(*N);
1848 E = GetEnd(*N);
1849 continue;
1850 }
1851
1852 // If the child has already been added to some child component, it
1853 // couldn't impact the low-link of this parent because it isn't
1854 // connected, and thus its low-link isn't relevant so skip it.
1855 if (ChildN.DFSNumber == -1) {
1856 ++I;
1857 continue;
1858 }
1859
1860 // Track the lowest linked child as the lowest link for this node.
1861 assert(ChildN.LowLink > 0 && "Must have a positive low-link number!");
1862 if (ChildN.LowLink < N->LowLink)
1863 N->LowLink = ChildN.LowLink;
1864
1865 // Move to the next edge.
1866 ++I;
1867 }
1868
1869 // We've finished processing N and its descendants, put it on our pending
1870 // SCC stack to eventually get merged into an SCC of nodes.
1871 PendingSCCStack.push_back(N);
1872
1873 // If this node is linked to some lower entry, continue walking up the
1874 // stack.
1875 if (N->LowLink != N->DFSNumber)
1876 continue;
1877
1878 // Otherwise, we've completed an SCC. Append it to our post order list of
1879 // SCCs.
1880 int RootDFSNumber = N->DFSNumber;
1881 // Find the range of the node stack by walking down until we pass the
1882 // root DFS number.
1883 auto SCCNodes = make_range(
1884 PendingSCCStack.rbegin(),
1885 find_if(reverse(PendingSCCStack), [RootDFSNumber](const Node *N) {
1886 return N->DFSNumber < RootDFSNumber;
1887 }));
1888 // Form a new SCC out of these nodes and then clear them off our pending
1889 // stack.
1890 FormSCC(SCCNodes);
1891 PendingSCCStack.erase(SCCNodes.end().base(), PendingSCCStack.end());
1892 } while (!DFSStack.empty());
1893 }
1894}
1895
1896/// Build the internal SCCs for a RefSCC from a sequence of nodes.
1897///
1898/// Appends the SCCs to the provided vector and updates the map with their
1899/// indices. Both the vector and map must be empty when passed into this
1900/// routine.
1901void LazyCallGraph::buildSCCs(RefSCC &RC, node_stack_range Nodes) {
1902 assert(RC.SCCs.empty() && "Already built SCCs!");
1903 assert(RC.SCCIndices.empty() && "Already mapped SCC indices!");
1904
1905 for (Node *N : Nodes) {
1906 assert(N->LowLink >= (*Nodes.begin())->LowLink &&
1907 "We cannot have a low link in an SCC lower than its root on the "
1908 "stack!");
1909
1910 // This node will go into the next RefSCC, clear out its DFS and low link
1911 // as we scan.
1912 N->DFSNumber = N->LowLink = 0;
1913 }
1914
1915 // Each RefSCC contains a DAG of the call SCCs. To build these, we do
1916 // a direct walk of the call edges using Tarjan's algorithm. We reuse the
1917 // internal storage as we won't need it for the outer graph's DFS any longer.
1918 buildGenericSCCs(
1919 Nodes, [](Node &N) { return N->call_begin(); },
1920 [](Node &N) { return N->call_end(); },
1921 [](EdgeSequence::call_iterator I) -> Node & { return I->getNode(); },
1922 [this, &RC](node_stack_range Nodes) {
1923 RC.SCCs.push_back(createSCC(RC, Nodes));
1924 for (Node &N : *RC.SCCs.back()) {
1925 N.DFSNumber = N.LowLink = -1;
1926 SCCMap[&N] = RC.SCCs.back();
1927 }
1928 });
1929
1930 // Wire up the SCC indices.
1931 for (int I = 0, Size = RC.SCCs.size(); I < Size; ++I)
1932 RC.SCCIndices[RC.SCCs[I]] = I;
1933}
1934
1936 if (EntryEdges.empty() || !PostOrderRefSCCs.empty())
1937 // RefSCCs are either non-existent or already built!
1938 return;
1939
1940 assert(RefSCCIndices.empty() && "Already mapped RefSCC indices!");
1941
1943 for (Edge &E : *this)
1944 Roots.push_back(&E.getNode());
1945
1946 // The roots will be iterated in order.
1947 buildGenericSCCs(
1948 Roots,
1949 [](Node &N) {
1950 // We need to populate each node as we begin to walk its edges.
1951 N.populate();
1952 return N->begin();
1953 },
1954 [](Node &N) { return N->end(); },
1955 [](EdgeSequence::iterator I) -> Node & { return I->getNode(); },
1956 [this](node_stack_range Nodes) {
1957 RefSCC *NewRC = createRefSCC(*this);
1958 buildSCCs(*NewRC, Nodes);
1959
1960 // Push the new node into the postorder list and remember its position
1961 // in the index map.
1962 bool Inserted =
1963 RefSCCIndices.try_emplace(NewRC, PostOrderRefSCCs.size()).second;
1964 (void)Inserted;
1965 assert(Inserted && "Cannot already have this RefSCC in the index map!");
1966 PostOrderRefSCCs.push_back(NewRC);
1967#ifdef EXPENSIVE_CHECKS
1968 NewRC->verify();
1969#endif
1970 });
1971}
1972
1975 function_ref<void(Function &)> Callback) {
1976 while (!Worklist.empty()) {
1977 Constant *C = Worklist.pop_back_val();
1978
1979 if (Function *F = dyn_cast<Function>(C)) {
1980 if (!F->isDeclaration())
1981 Callback(*F);
1982 continue;
1983 }
1984
1985 // blockaddresses are weird and don't participate in the call graph anyway,
1986 // skip them.
1987 if (isa<BlockAddress>(C))
1988 continue;
1989
1990 for (Value *Op : C->operand_values())
1991 if (Visited.insert(cast<Constant>(Op)).second)
1992 Worklist.push_back(cast<Constant>(Op));
1993 }
1994}
1995
1996AnalysisKey LazyCallGraphAnalysis::Key;
1997
1999
2001 OS << " Edges in function: " << N.getFunction().getName() << "\n";
2002 for (LazyCallGraph::Edge &E : N.populate())
2003 OS << " " << (E.isCall() ? "call" : "ref ") << " -> "
2004 << E.getFunction().getName() << "\n";
2005
2006 OS << "\n";
2007}
2008
2010 OS << " SCC with " << C.size() << " functions:\n";
2011
2012 for (LazyCallGraph::Node &N : C)
2013 OS << " " << N.getFunction().getName() << "\n";
2014}
2015
2017 OS << " RefSCC with " << C.size() << " call SCCs:\n";
2018
2019 for (LazyCallGraph::SCC &InnerC : C)
2020 printSCC(OS, InnerC);
2021
2022 OS << "\n";
2023}
2024
2028
2029 OS << "Printing the call graph for module: " << M.getModuleIdentifier()
2030 << "\n\n";
2031
2032 for (Function &F : M)
2033 printNode(OS, G.get(F));
2034
2035 G.buildRefSCCs();
2036 for (LazyCallGraph::RefSCC &C : G.postorder_ref_sccs())
2037 printRefSCC(OS, C);
2038
2039 return PreservedAnalyses::all();
2040}
2041
2043 : OS(OS) {}
2044
2046 std::string Name =
2047 "\"" + DOT::EscapeString(std::string(N.getFunction().getName())) + "\"";
2048
2049 for (LazyCallGraph::Edge &E : N.populate()) {
2050 OS << " " << Name << " -> \""
2051 << DOT::EscapeString(std::string(E.getFunction().getName())) << "\"";
2052 if (!E.isCall()) // It is a ref edge.
2053 OS << " [style=dashed,label=\"ref\"]";
2054 OS << ";\n";
2055 }
2056
2057 OS << "\n";
2058}
2059
2063
2064 OS << "digraph \"" << DOT::EscapeString(M.getModuleIdentifier()) << "\" {\n";
2065
2066 for (Function &F : M)
2067 printNodeDOT(OS, G.get(F));
2068
2069 OS << "}\n";
2070
2071 return PreservedAnalyses::all();
2072}
Expand Atomic instructions
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition: Compiler.h:622
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
#define LLVM_DEBUG(...)
Definition: Debug.h:106
std::string Name
uint64_t Size
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
static void printNode(raw_ostream &OS, LazyCallGraph::Node &N)
static void printRefSCC(raw_ostream &OS, LazyCallGraph::RefSCC &C)
static iterator_range< typename PostorderSequenceT::iterator > updatePostorderSequenceForEdgeInsertion(SCCT &SourceSCC, SCCT &TargetSCC, PostorderSequenceT &SCCs, SCCIndexMapT &SCCIndices, ComputeSourceConnectedSetCallableT ComputeSourceConnectedSet, ComputeTargetConnectedSetCallableT ComputeTargetConnectedSet)
Generic helper that updates a postorder sequence of SCCs for a potentially cycle-introducing edge ins...
static void printNodeDOT(raw_ostream &OS, LazyCallGraph::Node &N)
static LazyCallGraph::Edge::Kind getEdgeKind(Function &OriginalFunction, Function &NewFunction)
static void printSCC(raw_ostream &OS, LazyCallGraph::SCC &C)
static void addEdge(SmallVectorImpl< LazyCallGraph::Edge > &Edges, DenseMap< LazyCallGraph::Node *, int > &EdgeIndexMap, LazyCallGraph::Node &N, LazyCallGraph::Edge::Kind EK)
static bool isKnownLibFunction(Function &F, TargetLibraryInfo &TLI)
Implements a lazy call graph analysis and related passes for the new pass manager.
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define G(x, y, z)
Definition: MD5.cpp:56
static StringRef getName(Value *V)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
raw_pwrite_stream & OS
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
Provides some synthesis utilities to produce sequences of values.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This templated class represents "all analyses that operate over <a particular IR unit>" (e....
Definition: Analysis.h:49
API to communicate dependencies between analyses during invalidation.
Definition: PassManager.h:292
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:410
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:163
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
This is an important base class in LLVM.
Definition: Constant.h:42
This class represents an Operation in the Expression.
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition: DenseMap.h:226
An analysis pass which computes the call graph for a module.
LazyCallGraphDOTPrinterPass(raw_ostream &OS)
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
LazyCallGraphPrinterPass(raw_ostream &OS)
An iterator used for the edges to both entry nodes and child nodes.
The edge sequence object.
A class used to represent edges in the call graph.
bool isCall() const
Test whether the edge represents a direct call to a function.
Kind
The kind of edge in the graph.
Node & getNode() const
Get the call graph node referenced by this edge.
A node in the call graph.
A RefSCC of the call graph.
SmallVector< RefSCC *, 1 > insertIncomingRefEdge(Node &SourceN, Node &TargetN)
Insert an edge whose source is in a descendant RefSCC and target is in this RefSCC.
bool switchInternalEdgeToCall(Node &SourceN, Node &TargetN, function_ref< void(ArrayRef< SCC * > MergedSCCs)> MergeCB={})
Make an existing internal ref edge into a call edge.
bool isAncestorOf(const RefSCC &RC) const
Test if this RefSCC is an ancestor of RC.
void insertTrivialRefEdge(Node &SourceN, Node &TargetN)
A convenience wrapper around the above to handle trivial cases of inserting a new ref edge.
bool isDescendantOf(const RefSCC &RC) const
Test if this RefSCC is a descendant of RC.
void switchOutgoingEdgeToCall(Node &SourceN, Node &TargetN)
Make an existing outgoing ref edge into a call edge.
void replaceNodeFunction(Node &N, Function &NewF)
Directly replace a node's function with a new function.
void insertOutgoingEdge(Node &SourceN, Node &TargetN, Edge::Kind EK)
Insert an edge whose parent is in this RefSCC and child is in some child RefSCC.
SmallVector< RefSCC *, 1 > removeInternalRefEdges(ArrayRef< std::pair< Node *, Node * > > Edges)
Remove a list of ref edges which are entirely within this RefSCC.
iterator_range< iterator > switchInternalEdgeToRef(Node &SourceN, Node &TargetN)
Make an existing internal call edge within a single SCC into a ref edge.
void insertInternalRefEdge(Node &SourceN, Node &TargetN)
Insert a ref edge from one node in this RefSCC to another in this RefSCC.
void insertTrivialCallEdge(Node &SourceN, Node &TargetN)
A convenience wrapper around the above to handle trivial cases of inserting a new call edge.
void removeOutgoingEdge(Node &SourceN, Node &TargetN)
Remove an edge whose source is in this RefSCC and target is not.
void switchOutgoingEdgeToRef(Node &SourceN, Node &TargetN)
Make an existing outgoing call edge into a ref edge.
void switchTrivialInternalEdgeToRef(Node &SourceN, Node &TargetN)
Make an existing internal call edge between separate SCCs into a ref edge.
bool isParentOf(const RefSCC &RC) const
Test if this RefSCC is a parent of RC.
An SCC of the call graph.
bool isAncestorOf(const SCC &C) const
Test if this SCC is an ancestor of C.
bool isParentOf(const SCC &C) const
Test if this SCC is a parent of C.
RefSCC & getOuterRefSCC() const
A lazily constructed view of the call graph of a module.
bool isLibFunction(Function &F) const
Test whether a function is a known and defined library function tracked by the call graph.
RefSCC * lookupRefSCC(Node &N) const
Lookup a function's RefSCC in the graph.
void insertEdge(Node &SourceN, Node &TargetN, Edge::Kind EK)
Update the call graph after inserting a new edge.
LazyCallGraph(Module &M, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
Construct a graph for the given module.
static void visitReferences(SmallVectorImpl< Constant * > &Worklist, SmallPtrSetImpl< Constant * > &Visited, function_ref< void(Function &)> Callback)
Recursively visits the defined functions whose address is reachable from every constant in the Workli...
void markDeadFunction(Function &F)
Mark a function as dead to be removed later by removeDeadFunctions().
void addSplitFunction(Function &OriginalFunction, Function &NewFunction)
Add a new function split/outlined from an existing function.
void addSplitRefRecursiveFunctions(Function &OriginalFunction, ArrayRef< Function * > NewFunctions)
Add new ref-recursive functions split/outlined from an existing function.
void removeDeadFunctions(ArrayRef< Function * > DeadFs)
Remove dead functions from the call graph.
void removeEdge(Node &SourceN, Node &TargetN)
Update the call graph after deleting an edge.
Node & get(Function &F)
Get a graph node for a given function, scanning it to populate the graph data as necessary.
SCC * lookupSCC(Node &N) const
Lookup a function's SCC in the graph.
iterator_range< postorder_ref_scc_iterator > postorder_ref_sccs()
LazyCallGraph & operator=(LazyCallGraph &&RHS)
bool invalidate(Module &, const PreservedAnalyses &PA, ModuleAnalysisManager::Invalidator &)
void verify()
Verify that every RefSCC is valid.
Node * lookup(const Function &F) const
Lookup a function in the graph which has already been scanned and added.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:111
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:117
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Definition: Analysis.h:264
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:363
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
Definition: SmallPtrSet.h:452
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:384
bool contains(ConstPtrType Ptr) const
Definition: SmallPtrSet.h:458
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:519
bool empty() const
Definition: SmallVector.h:81
size_t size() const
Definition: SmallVector.h:78
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:937
iterator erase(const_iterator CI)
Definition: SmallVector.h:737
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:683
void swap(SmallVectorImpl &RHS)
Definition: SmallVector.h:968
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
Provides information about what library functions are available for the current target.
bool isKnownVectorFunctionInLibrary(StringRef F) const
Check if the function "F" is listed in a library known to LLVM.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
LLVM Value Representation.
Definition: Value.h:74
bool use_empty() const
Definition: Value.h:344
An efficient, type-erasing, non-owning reference to a callable.
A range adaptor for a pair of iterators.
IteratorT end() const
IteratorT begin() const
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
std::string EscapeString(const std::string &Label)
Definition: GraphWriter.cpp:56
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition: STLExtras.h:329
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1739
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition: STLExtras.h:1697
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
Definition: ScopeExit.h:59
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
auto reverse(ContainerTy &&C)
Definition: STLExtras.h:420
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1873
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1766
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
#define N
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: Analysis.h:28