1 //===- LazyCallGraph.cpp - Analysis of a Module's call graph --------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/Analysis/LazyCallGraph.h"
11 #include "llvm/ADT/ScopeExit.h"
12 #include "llvm/ADT/Sequence.h"
13 #include "llvm/ADT/STLExtras.h"
14 #include "llvm/ADT/ScopeExit.h"
15 #include "llvm/IR/CallSite.h"
16 #include "llvm/IR/InstVisitor.h"
17 #include "llvm/IR/Instructions.h"
18 #include "llvm/IR/PassManager.h"
19 #include "llvm/Support/Debug.h"
20 #include "llvm/Support/GraphWriter.h"
21 
22 using namespace llvm;
23 
24 #define DEBUG_TYPE "lcg"
25 
26 static void addEdge(SmallVectorImpl<LazyCallGraph::Edge> &Edges,
27                     DenseMap<Function *, int> &EdgeIndexMap, Function &F,
28                     LazyCallGraph::Edge::Kind EK) {
29   if (!EdgeIndexMap.insert({&F, Edges.size()}).second)
30     return;
31 
32   DEBUG(dbgs() << "    Added callable function: " << F.getName() << "\n");
33   Edges.emplace_back(LazyCallGraph::Edge(F, EK));
34 }
35 
36 LazyCallGraph::Node::Node(LazyCallGraph &G, Function &F)
37     : G(&G), F(F), DFSNumber(0), LowLink(0) {
38   DEBUG(dbgs() << "  Adding functions called by '" << F.getName()
39                << "' to the graph.\n");
40 
41   SmallVector<Constant *, 16> Worklist;
42   SmallPtrSet<Function *, 4> Callees;
43   SmallPtrSet<Constant *, 16> Visited;
44 
45   // Find all the potential call graph edges in this function. We track both
46   // actual call edges and indirect references to functions. The direct calls
47   // are trivially added, but to accumulate the latter we walk the instructions
48   // and add every operand which is a constant to the worklist to process
49   // afterward.
50   //
51   // Note that we consider *any* function with a definition to be a viable
52   // edge. Even if the function's definition is subject to replacement by
53   // some other module (say, a weak definition) there may still be
54   // optimizations which essentially speculate based on the definition and
55   // a way to check that the specific definition is in fact the one being
56   // used. For example, this could be done by moving the weak definition to
57   // a strong (internal) definition and making the weak definition be an
58   // alias. Then a test of the address of the weak function against the new
59   // strong definition's address would be an effective way to determine the
60   // safety of optimizing a direct call edge.
61   for (BasicBlock &BB : F)
62     for (Instruction &I : BB) {
63       if (auto CS = CallSite(&I))
64         if (Function *Callee = CS.getCalledFunction())
65           if (!Callee->isDeclaration())
66             if (Callees.insert(Callee).second) {
67               Visited.insert(Callee);
68               addEdge(Edges, EdgeIndexMap, *Callee, LazyCallGraph::Edge::Call);
69             }
70 
71       for (Value *Op : I.operand_values())
72         if (Constant *C = dyn_cast<Constant>(Op))
73           if (Visited.insert(C).second)
74             Worklist.push_back(C);
75     }
76 
77   // We've collected all the constant (and thus potentially function or
78   // function containing) operands to all of the instructions in the function.
79   // Process them (recursively) collecting every function found.
80   visitReferences(Worklist, Visited, [&](Function &F) {
81     addEdge(Edges, EdgeIndexMap, F, LazyCallGraph::Edge::Ref);
82   });
83 }
84 
85 void LazyCallGraph::Node::insertEdgeInternal(Function &Target, Edge::Kind EK) {
86   if (Node *N = G->lookup(Target))
87     return insertEdgeInternal(*N, EK);
88 
89   EdgeIndexMap.insert({&Target, Edges.size()});
90   Edges.emplace_back(Target, EK);
91 }
92 
93 void LazyCallGraph::Node::insertEdgeInternal(Node &TargetN, Edge::Kind EK) {
94   EdgeIndexMap.insert({&TargetN.getFunction(), Edges.size()});
95   Edges.emplace_back(TargetN, EK);
96 }
97 
98 void LazyCallGraph::Node::setEdgeKind(Function &TargetF, Edge::Kind EK) {
99   Edges[EdgeIndexMap.find(&TargetF)->second].setKind(EK);
100 }
101 
102 void LazyCallGraph::Node::removeEdgeInternal(Function &Target) {
103   auto IndexMapI = EdgeIndexMap.find(&Target);
104   assert(IndexMapI != EdgeIndexMap.end() &&
105          "Target not in the edge set for this caller?");
106 
107   Edges[IndexMapI->second] = Edge();
108   EdgeIndexMap.erase(IndexMapI);
109 }
110 
111 void LazyCallGraph::Node::dump() const {
112   dbgs() << *this << '\n';
113 }
114 
115 LazyCallGraph::LazyCallGraph(Module &M) : NextDFSNumber(0) {
116   DEBUG(dbgs() << "Building CG for module: " << M.getModuleIdentifier()
117                << "\n");
118   for (Function &F : M)
119     if (!F.isDeclaration() && !F.hasLocalLinkage())
120       if (EntryIndexMap.insert({&F, EntryEdges.size()}).second) {
121         DEBUG(dbgs() << "  Adding '" << F.getName()
122                      << "' to entry set of the graph.\n");
123         EntryEdges.emplace_back(F, Edge::Ref);
124       }
125 
126   // Now add entry nodes for functions reachable via initializers to globals.
127   SmallVector<Constant *, 16> Worklist;
128   SmallPtrSet<Constant *, 16> Visited;
129   for (GlobalVariable &GV : M.globals())
130     if (GV.hasInitializer())
131       if (Visited.insert(GV.getInitializer()).second)
132         Worklist.push_back(GV.getInitializer());
133 
134   DEBUG(dbgs() << "  Adding functions referenced by global initializers to the "
135                   "entry set.\n");
136   visitReferences(Worklist, Visited, [&](Function &F) {
137     addEdge(EntryEdges, EntryIndexMap, F, LazyCallGraph::Edge::Ref);
138   });
139 
140   for (const Edge &E : EntryEdges)
141     RefSCCEntryNodes.push_back(&E.getFunction());
142 }
143 
144 LazyCallGraph::LazyCallGraph(LazyCallGraph &&G)
145     : BPA(std::move(G.BPA)), NodeMap(std::move(G.NodeMap)),
146       EntryEdges(std::move(G.EntryEdges)),
147       EntryIndexMap(std::move(G.EntryIndexMap)), SCCBPA(std::move(G.SCCBPA)),
148       SCCMap(std::move(G.SCCMap)), LeafRefSCCs(std::move(G.LeafRefSCCs)),
149       DFSStack(std::move(G.DFSStack)),
150       RefSCCEntryNodes(std::move(G.RefSCCEntryNodes)),
151       NextDFSNumber(G.NextDFSNumber) {
152   updateGraphPtrs();
153 }
154 
155 LazyCallGraph &LazyCallGraph::operator=(LazyCallGraph &&G) {
156   BPA = std::move(G.BPA);
157   NodeMap = std::move(G.NodeMap);
158   EntryEdges = std::move(G.EntryEdges);
159   EntryIndexMap = std::move(G.EntryIndexMap);
160   SCCBPA = std::move(G.SCCBPA);
161   SCCMap = std::move(G.SCCMap);
162   LeafRefSCCs = std::move(G.LeafRefSCCs);
163   DFSStack = std::move(G.DFSStack);
164   RefSCCEntryNodes = std::move(G.RefSCCEntryNodes);
165   NextDFSNumber = G.NextDFSNumber;
166   updateGraphPtrs();
167   return *this;
168 }
169 
170 void LazyCallGraph::SCC::dump() const {
171   dbgs() << *this << '\n';
172 }
173 
174 #ifndef NDEBUG
175 void LazyCallGraph::SCC::verify() {
176   assert(OuterRefSCC && "Can't have a null RefSCC!");
177   assert(!Nodes.empty() && "Can't have an empty SCC!");
178 
179   for (Node *N : Nodes) {
180     assert(N && "Can't have a null node!");
181     assert(OuterRefSCC->G->lookupSCC(*N) == this &&
182            "Node does not map to this SCC!");
183     assert(N->DFSNumber == -1 &&
184            "Must set DFS numbers to -1 when adding a node to an SCC!");
185     assert(N->LowLink == -1 &&
186            "Must set low link to -1 when adding a node to an SCC!");
187     for (Edge &E : *N)
188       assert(E.getNode() && "Can't have an edge to a raw function!");
189   }
190 }
191 #endif
192 
193 bool LazyCallGraph::SCC::isParentOf(const SCC &C) const {
194   if (this == &C)
195     return false;
196 
197   for (Node &N : *this)
198     for (Edge &E : N.calls())
199       if (Node *CalleeN = E.getNode())
200         if (OuterRefSCC->G->lookupSCC(*CalleeN) == &C)
201           return true;
202 
203   // No edges found.
204   return false;
205 }
206 
207 bool LazyCallGraph::SCC::isAncestorOf(const SCC &TargetC) const {
208   if (this == &TargetC)
209     return false;
210 
211   LazyCallGraph &G = *OuterRefSCC->G;
212 
213   // Start with this SCC.
214   SmallPtrSet<const SCC *, 16> Visited = {this};
215   SmallVector<const SCC *, 16> Worklist = {this};
216 
217   // Walk down the graph until we run out of edges or find a path to TargetC.
218   do {
219     const SCC &C = *Worklist.pop_back_val();
220     for (Node &N : C)
221       for (Edge &E : N.calls()) {
222         Node *CalleeN = E.getNode();
223         if (!CalleeN)
224           continue;
225         SCC *CalleeC = G.lookupSCC(*CalleeN);
226         if (!CalleeC)
227           continue;
228 
229         // If the callee's SCC is the TargetC, we're done.
230         if (CalleeC == &TargetC)
231           return true;
232 
233         // If this is the first time we've reached this SCC, put it on the
234         // worklist to recurse through.
235         if (Visited.insert(CalleeC).second)
236           Worklist.push_back(CalleeC);
237       }
238   } while (!Worklist.empty());
239 
240   // No paths found.
241   return false;
242 }
243 
244 LazyCallGraph::RefSCC::RefSCC(LazyCallGraph &G) : G(&G) {}
245 
246 void LazyCallGraph::RefSCC::dump() const {
247   dbgs() << *this << '\n';
248 }
249 
250 #ifndef NDEBUG
251 void LazyCallGraph::RefSCC::verify() {
252   assert(G && "Can't have a null graph!");
253   assert(!SCCs.empty() && "Can't have an empty SCC!");
254 
255   // Verify basic properties of the SCCs.
256   SmallPtrSet<SCC *, 4> SCCSet;
257   for (SCC *C : SCCs) {
258     assert(C && "Can't have a null SCC!");
259     C->verify();
260     assert(&C->getOuterRefSCC() == this &&
261            "SCC doesn't think it is inside this RefSCC!");
262     bool Inserted = SCCSet.insert(C).second;
263     assert(Inserted && "Found a duplicate SCC!");
264     auto IndexIt = SCCIndices.find(C);
265     assert(IndexIt != SCCIndices.end() &&
266            "Found an SCC that doesn't have an index!");
267   }
268 
269   // Check that our indices map correctly.
270   for (auto &SCCIndexPair : SCCIndices) {
271     SCC *C = SCCIndexPair.first;
272     int i = SCCIndexPair.second;
273     assert(C && "Can't have a null SCC in the indices!");
274     assert(SCCSet.count(C) && "Found an index for an SCC not in the RefSCC!");
275     assert(SCCs[i] == C && "Index doesn't point to SCC!");
276   }
277 
278   // Check that the SCCs are in fact in post-order.
279   for (int i = 0, Size = SCCs.size(); i < Size; ++i) {
280     SCC &SourceSCC = *SCCs[i];
281     for (Node &N : SourceSCC)
282       for (Edge &E : N) {
283         if (!E.isCall())
284           continue;
285         SCC &TargetSCC = *G->lookupSCC(*E.getNode());
286         if (&TargetSCC.getOuterRefSCC() == this) {
287           assert(SCCIndices.find(&TargetSCC)->second <= i &&
288                  "Edge between SCCs violates post-order relationship.");
289           continue;
290         }
291         assert(TargetSCC.getOuterRefSCC().Parents.count(this) &&
292                "Edge to a RefSCC missing us in its parent set.");
293       }
294   }
295 
296   // Check that our parents are actually parents.
297   for (RefSCC *ParentRC : Parents) {
298     assert(ParentRC != this && "Cannot be our own parent!");
299     auto HasConnectingEdge = [&] {
300       for (SCC &C : *ParentRC)
301         for (Node &N : C)
302           for (Edge &E : N)
303             if (G->lookupRefSCC(*E.getNode()) == this)
304               return true;
305       return false;
306     };
307     assert(HasConnectingEdge() && "No edge connects the parent to us!");
308   }
309 }
310 #endif
311 
312 bool LazyCallGraph::RefSCC::isDescendantOf(const RefSCC &C) const {
313   // Walk up the parents of this SCC and verify that we eventually find C.
314   SmallVector<const RefSCC *, 4> AncestorWorklist;
315   AncestorWorklist.push_back(this);
316   do {
317     const RefSCC *AncestorC = AncestorWorklist.pop_back_val();
318     if (AncestorC->isChildOf(C))
319       return true;
320     for (const RefSCC *ParentC : AncestorC->Parents)
321       AncestorWorklist.push_back(ParentC);
322   } while (!AncestorWorklist.empty());
323 
324   return false;
325 }
326 
327 /// Generic helper that updates a postorder sequence of SCCs for a potentially
328 /// cycle-introducing edge insertion.
329 ///
330 /// A postorder sequence of SCCs of a directed graph has one fundamental
331 /// property: all deges in the DAG of SCCs point "up" the sequence. That is,
332 /// all edges in the SCC DAG point to prior SCCs in the sequence.
333 ///
334 /// This routine both updates a postorder sequence and uses that sequence to
335 /// compute the set of SCCs connected into a cycle. It should only be called to
336 /// insert a "downward" edge which will require changing the sequence to
337 /// restore it to a postorder.
338 ///
339 /// When inserting an edge from an earlier SCC to a later SCC in some postorder
340 /// sequence, all of the SCCs which may be impacted are in the closed range of
341 /// those two within the postorder sequence. The algorithm used here to restore
342 /// the state is as follows:
343 ///
344 /// 1) Starting from the source SCC, construct a set of SCCs which reach the
345 ///    source SCC consisting of just the source SCC. Then scan toward the
346 ///    target SCC in postorder and for each SCC, if it has an edge to an SCC
347 ///    in the set, add it to the set. Otherwise, the source SCC is not
348 ///    a successor, move it in the postorder sequence to immediately before
349 ///    the source SCC, shifting the source SCC and all SCCs in the set one
350 ///    position toward the target SCC. Stop scanning after processing the
351 ///    target SCC.
352 /// 2) If the source SCC is now past the target SCC in the postorder sequence,
353 ///    and thus the new edge will flow toward the start, we are done.
354 /// 3) Otherwise, starting from the target SCC, walk all edges which reach an
355 ///    SCC between the source and the target, and add them to the set of
356 ///    connected SCCs, then recurse through them. Once a complete set of the
357 ///    SCCs the target connects to is known, hoist the remaining SCCs between
358 ///    the source and the target to be above the target. Note that there is no
359 ///    need to process the source SCC, it is already known to connect.
360 /// 4) At this point, all of the SCCs in the closed range between the source
361 ///    SCC and the target SCC in the postorder sequence are connected,
362 ///    including the target SCC and the source SCC. Inserting the edge from
363 ///    the source SCC to the target SCC will form a cycle out of precisely
364 ///    these SCCs. Thus we can merge all of the SCCs in this closed range into
365 ///    a single SCC.
366 ///
367 /// This process has various important properties:
368 /// - Only mutates the SCCs when adding the edge actually changes the SCC
369 ///   structure.
370 /// - Never mutates SCCs which are unaffected by the change.
371 /// - Updates the postorder sequence to correctly satisfy the postorder
372 ///   constraint after the edge is inserted.
373 /// - Only reorders SCCs in the closed postorder sequence from the source to
374 ///   the target, so easy to bound how much has changed even in the ordering.
375 /// - Big-O is the number of edges in the closed postorder range of SCCs from
376 ///   source to target.
377 ///
378 /// This helper routine, in addition to updating the postorder sequence itself
379 /// will also update a map from SCCs to indices within that sequecne.
380 ///
381 /// The sequence and the map must operate on pointers to the SCC type.
382 ///
383 /// Two callbacks must be provided. The first computes the subset of SCCs in
384 /// the postorder closed range from the source to the target which connect to
385 /// the source SCC via some (transitive) set of edges. The second computes the
386 /// subset of the same range which the target SCC connects to via some
387 /// (transitive) set of edges. Both callbacks should populate the set argument
388 /// provided.
389 template <typename SCCT, typename PostorderSequenceT, typename SCCIndexMapT,
390           typename ComputeSourceConnectedSetCallableT,
391           typename ComputeTargetConnectedSetCallableT>
392 static iterator_range<typename PostorderSequenceT::iterator>
393 updatePostorderSequenceForEdgeInsertion(
394     SCCT &SourceSCC, SCCT &TargetSCC, PostorderSequenceT &SCCs,
395     SCCIndexMapT &SCCIndices,
396     ComputeSourceConnectedSetCallableT ComputeSourceConnectedSet,
397     ComputeTargetConnectedSetCallableT ComputeTargetConnectedSet) {
398   int SourceIdx = SCCIndices[&SourceSCC];
399   int TargetIdx = SCCIndices[&TargetSCC];
400   assert(SourceIdx < TargetIdx && "Cannot have equal indices here!");
401 
402   SmallPtrSet<SCCT *, 4> ConnectedSet;
403 
404   // Compute the SCCs which (transitively) reach the source.
405   ComputeSourceConnectedSet(ConnectedSet);
406 
407   // Partition the SCCs in this part of the port-order sequence so only SCCs
408   // connecting to the source remain between it and the target. This is
409   // a benign partition as it preserves postorder.
410   auto SourceI = std::stable_partition(
411       SCCs.begin() + SourceIdx, SCCs.begin() + TargetIdx + 1,
412       [&ConnectedSet](SCCT *C) { return !ConnectedSet.count(C); });
413   for (int i = SourceIdx, e = TargetIdx + 1; i < e; ++i)
414     SCCIndices.find(SCCs[i])->second = i;
415 
416   // If the target doesn't connect to the source, then we've corrected the
417   // post-order and there are no cycles formed.
418   if (!ConnectedSet.count(&TargetSCC)) {
419     assert(SourceI > (SCCs.begin() + SourceIdx) &&
420            "Must have moved the source to fix the post-order.");
421     assert(*std::prev(SourceI) == &TargetSCC &&
422            "Last SCC to move should have bene the target.");
423 
424     // Return an empty range at the target SCC indicating there is nothing to
425     // merge.
426     return make_range(std::prev(SourceI), std::prev(SourceI));
427   }
428 
429   assert(SCCs[TargetIdx] == &TargetSCC &&
430          "Should not have moved target if connected!");
431   SourceIdx = SourceI - SCCs.begin();
432   assert(SCCs[SourceIdx] == &SourceSCC &&
433          "Bad updated index computation for the source SCC!");
434 
435 
436   // See whether there are any remaining intervening SCCs between the source
437   // and target. If so we need to make sure they all are reachable form the
438   // target.
439   if (SourceIdx + 1 < TargetIdx) {
440     ConnectedSet.clear();
441     ComputeTargetConnectedSet(ConnectedSet);
442 
443     // Partition SCCs so that only SCCs reached from the target remain between
444     // the source and the target. This preserves postorder.
445     auto TargetI = std::stable_partition(
446         SCCs.begin() + SourceIdx + 1, SCCs.begin() + TargetIdx + 1,
447         [&ConnectedSet](SCCT *C) { return ConnectedSet.count(C); });
448     for (int i = SourceIdx + 1, e = TargetIdx + 1; i < e; ++i)
449       SCCIndices.find(SCCs[i])->second = i;
450     TargetIdx = std::prev(TargetI) - SCCs.begin();
451     assert(SCCs[TargetIdx] == &TargetSCC &&
452            "Should always end with the target!");
453   }
454 
455   // At this point, we know that connecting source to target forms a cycle
456   // because target connects back to source, and we know that all of the SCCs
457   // between the source and target in the postorder sequence participate in that
458   // cycle.
459   return make_range(SCCs.begin() + SourceIdx, SCCs.begin() + TargetIdx);
460 }
461 
462 SmallVector<LazyCallGraph::SCC *, 1>
463 LazyCallGraph::RefSCC::switchInternalEdgeToCall(Node &SourceN, Node &TargetN) {
464   assert(!SourceN[TargetN].isCall() && "Must start with a ref edge!");
465   SmallVector<SCC *, 1> DeletedSCCs;
466 
467 #ifndef NDEBUG
468   // In a debug build, verify the RefSCC is valid to start with and when this
469   // routine finishes.
470   verify();
471   auto VerifyOnExit = make_scope_exit([&]() { verify(); });
472 #endif
473 
474   SCC &SourceSCC = *G->lookupSCC(SourceN);
475   SCC &TargetSCC = *G->lookupSCC(TargetN);
476 
477   // If the two nodes are already part of the same SCC, we're also done as
478   // we've just added more connectivity.
479   if (&SourceSCC == &TargetSCC) {
480     SourceN.setEdgeKind(TargetN.getFunction(), Edge::Call);
481     return DeletedSCCs;
482   }
483 
484   // At this point we leverage the postorder list of SCCs to detect when the
485   // insertion of an edge changes the SCC structure in any way.
486   //
487   // First and foremost, we can eliminate the need for any changes when the
488   // edge is toward the beginning of the postorder sequence because all edges
489   // flow in that direction already. Thus adding a new one cannot form a cycle.
490   int SourceIdx = SCCIndices[&SourceSCC];
491   int TargetIdx = SCCIndices[&TargetSCC];
492   if (TargetIdx < SourceIdx) {
493     SourceN.setEdgeKind(TargetN.getFunction(), Edge::Call);
494     return DeletedSCCs;
495   }
496 
497   // Compute the SCCs which (transitively) reach the source.
498   auto ComputeSourceConnectedSet = [&](SmallPtrSetImpl<SCC *> &ConnectedSet) {
499 #ifndef NDEBUG
500     // Check that the RefSCC is still valid before computing this as the
501     // results will be nonsensical of we've broken its invariants.
502     verify();
503 #endif
504     ConnectedSet.insert(&SourceSCC);
505     auto IsConnected = [&](SCC &C) {
506       for (Node &N : C)
507         for (Edge &E : N.calls()) {
508           assert(E.getNode() && "Must have formed a node within an SCC!");
509           if (ConnectedSet.count(G->lookupSCC(*E.getNode())))
510             return true;
511         }
512 
513       return false;
514     };
515 
516     for (SCC *C :
517          make_range(SCCs.begin() + SourceIdx + 1, SCCs.begin() + TargetIdx + 1))
518       if (IsConnected(*C))
519         ConnectedSet.insert(C);
520   };
521 
522   // Use a normal worklist to find which SCCs the target connects to. We still
523   // bound the search based on the range in the postorder list we care about,
524   // but because this is forward connectivity we just "recurse" through the
525   // edges.
526   auto ComputeTargetConnectedSet = [&](SmallPtrSetImpl<SCC *> &ConnectedSet) {
527 #ifndef NDEBUG
528     // Check that the RefSCC is still valid before computing this as the
529     // results will be nonsensical of we've broken its invariants.
530     verify();
531 #endif
532     ConnectedSet.insert(&TargetSCC);
533     SmallVector<SCC *, 4> Worklist;
534     Worklist.push_back(&TargetSCC);
535     do {
536       SCC &C = *Worklist.pop_back_val();
537       for (Node &N : C)
538         for (Edge &E : N) {
539           assert(E.getNode() && "Must have formed a node within an SCC!");
540           if (!E.isCall())
541             continue;
542           SCC &EdgeC = *G->lookupSCC(*E.getNode());
543           if (&EdgeC.getOuterRefSCC() != this)
544             // Not in this RefSCC...
545             continue;
546           if (SCCIndices.find(&EdgeC)->second <= SourceIdx)
547             // Not in the postorder sequence between source and target.
548             continue;
549 
550           if (ConnectedSet.insert(&EdgeC).second)
551             Worklist.push_back(&EdgeC);
552         }
553     } while (!Worklist.empty());
554   };
555 
556   // Use a generic helper to update the postorder sequence of SCCs and return
557   // a range of any SCCs connected into a cycle by inserting this edge. This
558   // routine will also take care of updating the indices into the postorder
559   // sequence.
560   auto MergeRange = updatePostorderSequenceForEdgeInsertion(
561       SourceSCC, TargetSCC, SCCs, SCCIndices, ComputeSourceConnectedSet,
562       ComputeTargetConnectedSet);
563 
564   // If the merge range is empty, then adding the edge didn't actually form any
565   // new cycles. We're done.
566   if (MergeRange.begin() == MergeRange.end()) {
567     // Now that the SCC structure is finalized, flip the kind to call.
568     SourceN.setEdgeKind(TargetN.getFunction(), Edge::Call);
569     return DeletedSCCs;
570   }
571 
572 #ifndef NDEBUG
573   // Before merging, check that the RefSCC remains valid after all the
574   // postorder updates.
575   verify();
576 #endif
577 
578   // Otherwise we need to merge all of the SCCs in the cycle into a single
579   // result SCC.
580   //
581   // NB: We merge into the target because all of these functions were already
582   // reachable from the target, meaning any SCC-wide properties deduced about it
583   // other than the set of functions within it will not have changed.
584   for (SCC *C : MergeRange) {
585     assert(C != &TargetSCC &&
586            "We merge *into* the target and shouldn't process it here!");
587     SCCIndices.erase(C);
588     TargetSCC.Nodes.append(C->Nodes.begin(), C->Nodes.end());
589     for (Node *N : C->Nodes)
590       G->SCCMap[N] = &TargetSCC;
591     C->clear();
592     DeletedSCCs.push_back(C);
593   }
594 
595   // Erase the merged SCCs from the list and update the indices of the
596   // remaining SCCs.
597   int IndexOffset = MergeRange.end() - MergeRange.begin();
598   auto EraseEnd = SCCs.erase(MergeRange.begin(), MergeRange.end());
599   for (SCC *C : make_range(EraseEnd, SCCs.end()))
600     SCCIndices[C] -= IndexOffset;
601 
602   // Now that the SCC structure is finalized, flip the kind to call.
603   SourceN.setEdgeKind(TargetN.getFunction(), Edge::Call);
604 
605   // And we're done!
606   return DeletedSCCs;
607 }
608 
609 iterator_range<LazyCallGraph::RefSCC::iterator>
610 LazyCallGraph::RefSCC::switchInternalEdgeToRef(Node &SourceN, Node &TargetN) {
611   assert(SourceN[TargetN].isCall() && "Must start with a call edge!");
612 
613 #ifndef NDEBUG
614   // In a debug build, verify the RefSCC is valid to start with and when this
615   // routine finishes.
616   verify();
617   auto VerifyOnExit = make_scope_exit([&]() { verify(); });
618 #endif
619 
620   SCC &SourceSCC = *G->lookupSCC(SourceN);
621   SCC &TargetSCC = *G->lookupSCC(TargetN);
622 
623   assert(&SourceSCC.getOuterRefSCC() == this &&
624          "Source must be in this RefSCC.");
625   assert(&TargetSCC.getOuterRefSCC() == this &&
626          "Target must be in this RefSCC.");
627 
628   // Set the edge kind.
629   SourceN.setEdgeKind(TargetN.getFunction(), Edge::Ref);
630 
631   // If this call edge is just connecting two separate SCCs within this RefSCC,
632   // there is nothing to do.
633   if (&SourceSCC != &TargetSCC)
634     return make_range(SCCs.end(), SCCs.end());
635 
636   // Otherwise we are removing a call edge from a single SCC. This may break
637   // the cycle. In order to compute the new set of SCCs, we need to do a small
638   // DFS over the nodes within the SCC to form any sub-cycles that remain as
639   // distinct SCCs and compute a postorder over the resulting SCCs.
640   //
641   // However, we specially handle the target node. The target node is known to
642   // reach all other nodes in the original SCC by definition. This means that
643   // we want the old SCC to be replaced with an SCC contaning that node as it
644   // will be the root of whatever SCC DAG results from the DFS. Assumptions
645   // about an SCC such as the set of functions called will continue to hold,
646   // etc.
647 
648   SCC &OldSCC = TargetSCC;
649   SmallVector<std::pair<Node *, call_edge_iterator>, 16> DFSStack;
650   SmallVector<Node *, 16> PendingSCCStack;
651   SmallVector<SCC *, 4> NewSCCs;
652 
653   // Prepare the nodes for a fresh DFS.
654   SmallVector<Node *, 16> Worklist;
655   Worklist.swap(OldSCC.Nodes);
656   for (Node *N : Worklist) {
657     N->DFSNumber = N->LowLink = 0;
658     G->SCCMap.erase(N);
659   }
660 
661   // Force the target node to be in the old SCC. This also enables us to take
662   // a very significant short-cut in the standard Tarjan walk to re-form SCCs
663   // below: whenever we build an edge that reaches the target node, we know
664   // that the target node eventually connects back to all other nodes in our
665   // walk. As a consequence, we can detect and handle participants in that
666   // cycle without walking all the edges that form this connection, and instead
667   // by relying on the fundamental guarantee coming into this operation (all
668   // nodes are reachable from the target due to previously forming an SCC).
669   TargetN.DFSNumber = TargetN.LowLink = -1;
670   OldSCC.Nodes.push_back(&TargetN);
671   G->SCCMap[&TargetN] = &OldSCC;
672 
673   // Scan down the stack and DFS across the call edges.
674   for (Node *RootN : Worklist) {
675     assert(DFSStack.empty() &&
676            "Cannot begin a new root with a non-empty DFS stack!");
677     assert(PendingSCCStack.empty() &&
678            "Cannot begin a new root with pending nodes for an SCC!");
679 
680     // Skip any nodes we've already reached in the DFS.
681     if (RootN->DFSNumber != 0) {
682       assert(RootN->DFSNumber == -1 &&
683              "Shouldn't have any mid-DFS root nodes!");
684       continue;
685     }
686 
687     RootN->DFSNumber = RootN->LowLink = 1;
688     int NextDFSNumber = 2;
689 
690     DFSStack.push_back({RootN, RootN->call_begin()});
691     do {
692       Node *N;
693       call_edge_iterator I;
694       std::tie(N, I) = DFSStack.pop_back_val();
695       auto E = N->call_end();
696       while (I != E) {
697         Node &ChildN = *I->getNode();
698         if (ChildN.DFSNumber == 0) {
699           // We haven't yet visited this child, so descend, pushing the current
700           // node onto the stack.
701           DFSStack.push_back({N, I});
702 
703           assert(!G->SCCMap.count(&ChildN) &&
704                  "Found a node with 0 DFS number but already in an SCC!");
705           ChildN.DFSNumber = ChildN.LowLink = NextDFSNumber++;
706           N = &ChildN;
707           I = N->call_begin();
708           E = N->call_end();
709           continue;
710         }
711 
712         // Check for the child already being part of some component.
713         if (ChildN.DFSNumber == -1) {
714           if (G->lookupSCC(ChildN) == &OldSCC) {
715             // If the child is part of the old SCC, we know that it can reach
716             // every other node, so we have formed a cycle. Pull the entire DFS
717             // and pending stacks into it. See the comment above about setting
718             // up the old SCC for why we do this.
719             int OldSize = OldSCC.size();
720             OldSCC.Nodes.push_back(N);
721             OldSCC.Nodes.append(PendingSCCStack.begin(), PendingSCCStack.end());
722             PendingSCCStack.clear();
723             while (!DFSStack.empty())
724               OldSCC.Nodes.push_back(DFSStack.pop_back_val().first);
725             for (Node &N : make_range(OldSCC.begin() + OldSize, OldSCC.end())) {
726               N.DFSNumber = N.LowLink = -1;
727               G->SCCMap[&N] = &OldSCC;
728             }
729             N = nullptr;
730             break;
731           }
732 
733           // If the child has already been added to some child component, it
734           // couldn't impact the low-link of this parent because it isn't
735           // connected, and thus its low-link isn't relevant so skip it.
736           ++I;
737           continue;
738         }
739 
740         // Track the lowest linked child as the lowest link for this node.
741         assert(ChildN.LowLink > 0 && "Must have a positive low-link number!");
742         if (ChildN.LowLink < N->LowLink)
743           N->LowLink = ChildN.LowLink;
744 
745         // Move to the next edge.
746         ++I;
747       }
748       if (!N)
749         // Cleared the DFS early, start another round.
750         break;
751 
752       // We've finished processing N and its descendents, put it on our pending
753       // SCC stack to eventually get merged into an SCC of nodes.
754       PendingSCCStack.push_back(N);
755 
756       // If this node is linked to some lower entry, continue walking up the
757       // stack.
758       if (N->LowLink != N->DFSNumber)
759         continue;
760 
761       // Otherwise, we've completed an SCC. Append it to our post order list of
762       // SCCs.
763       int RootDFSNumber = N->DFSNumber;
764       // Find the range of the node stack by walking down until we pass the
765       // root DFS number.
766       auto SCCNodes = make_range(
767           PendingSCCStack.rbegin(),
768           find_if(reverse(PendingSCCStack), [RootDFSNumber](const Node *N) {
769             return N->DFSNumber < RootDFSNumber;
770           }));
771 
772       // Form a new SCC out of these nodes and then clear them off our pending
773       // stack.
774       NewSCCs.push_back(G->createSCC(*this, SCCNodes));
775       for (Node &N : *NewSCCs.back()) {
776         N.DFSNumber = N.LowLink = -1;
777         G->SCCMap[&N] = NewSCCs.back();
778       }
779       PendingSCCStack.erase(SCCNodes.end().base(), PendingSCCStack.end());
780     } while (!DFSStack.empty());
781   }
782 
783   // Insert the remaining SCCs before the old one. The old SCC can reach all
784   // other SCCs we form because it contains the target node of the removed edge
785   // of the old SCC. This means that we will have edges into all of the new
786   // SCCs, which means the old one must come last for postorder.
787   int OldIdx = SCCIndices[&OldSCC];
788   SCCs.insert(SCCs.begin() + OldIdx, NewSCCs.begin(), NewSCCs.end());
789 
790   // Update the mapping from SCC* to index to use the new SCC*s, and remove the
791   // old SCC from the mapping.
792   for (int Idx = OldIdx, Size = SCCs.size(); Idx < Size; ++Idx)
793     SCCIndices[SCCs[Idx]] = Idx;
794 
795   return make_range(SCCs.begin() + OldIdx,
796                     SCCs.begin() + OldIdx + NewSCCs.size());
797 }
798 
799 void LazyCallGraph::RefSCC::switchOutgoingEdgeToCall(Node &SourceN,
800                                                      Node &TargetN) {
801   assert(!SourceN[TargetN].isCall() && "Must start with a ref edge!");
802 
803   assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
804   assert(G->lookupRefSCC(TargetN) != this &&
805          "Target must not be in this RefSCC.");
806   assert(G->lookupRefSCC(TargetN)->isDescendantOf(*this) &&
807          "Target must be a descendant of the Source.");
808 
809   // Edges between RefSCCs are the same regardless of call or ref, so we can
810   // just flip the edge here.
811   SourceN.setEdgeKind(TargetN.getFunction(), Edge::Call);
812 
813 #ifndef NDEBUG
814   // Check that the RefSCC is still valid.
815   verify();
816 #endif
817 }
818 
819 void LazyCallGraph::RefSCC::switchOutgoingEdgeToRef(Node &SourceN,
820                                                     Node &TargetN) {
821   assert(SourceN[TargetN].isCall() && "Must start with a call edge!");
822 
823   assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
824   assert(G->lookupRefSCC(TargetN) != this &&
825          "Target must not be in this RefSCC.");
826   assert(G->lookupRefSCC(TargetN)->isDescendantOf(*this) &&
827          "Target must be a descendant of the Source.");
828 
829   // Edges between RefSCCs are the same regardless of call or ref, so we can
830   // just flip the edge here.
831   SourceN.setEdgeKind(TargetN.getFunction(), Edge::Ref);
832 
833 #ifndef NDEBUG
834   // Check that the RefSCC is still valid.
835   verify();
836 #endif
837 }
838 
839 void LazyCallGraph::RefSCC::insertInternalRefEdge(Node &SourceN,
840                                                   Node &TargetN) {
841   assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
842   assert(G->lookupRefSCC(TargetN) == this && "Target must be in this RefSCC.");
843 
844   SourceN.insertEdgeInternal(TargetN, Edge::Ref);
845 
846 #ifndef NDEBUG
847   // Check that the RefSCC is still valid.
848   verify();
849 #endif
850 }
851 
852 void LazyCallGraph::RefSCC::insertOutgoingEdge(Node &SourceN, Node &TargetN,
853                                                Edge::Kind EK) {
854   // First insert it into the caller.
855   SourceN.insertEdgeInternal(TargetN, EK);
856 
857   assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
858 
859   RefSCC &TargetC = *G->lookupRefSCC(TargetN);
860   assert(&TargetC != this && "Target must not be in this RefSCC.");
861   assert(TargetC.isDescendantOf(*this) &&
862          "Target must be a descendant of the Source.");
863 
864   // The only change required is to add this SCC to the parent set of the
865   // callee.
866   TargetC.Parents.insert(this);
867 
868 #ifndef NDEBUG
869   // Check that the RefSCC is still valid.
870   verify();
871 #endif
872 }
873 
874 SmallVector<LazyCallGraph::RefSCC *, 1>
875 LazyCallGraph::RefSCC::insertIncomingRefEdge(Node &SourceN, Node &TargetN) {
876   assert(G->lookupRefSCC(TargetN) == this && "Target must be in this RefSCC.");
877   RefSCC &SourceC = *G->lookupRefSCC(SourceN);
878   assert(&SourceC != this && "Source must not be in this RefSCC.");
879   assert(SourceC.isDescendantOf(*this) &&
880          "Source must be a descendant of the Target.");
881 
882   SmallVector<RefSCC *, 1> DeletedRefSCCs;
883 
884 #ifndef NDEBUG
885   // In a debug build, verify the RefSCC is valid to start with and when this
886   // routine finishes.
887   verify();
888   auto VerifyOnExit = make_scope_exit([&]() { verify(); });
889 #endif
890 
891   int SourceIdx = G->RefSCCIndices[&SourceC];
892   int TargetIdx = G->RefSCCIndices[this];
893   assert(SourceIdx < TargetIdx &&
894          "Postorder list doesn't see edge as incoming!");
895 
896   // Compute the RefSCCs which (transitively) reach the source. We do this by
897   // working backwards from the source using the parent set in each RefSCC,
898   // skipping any RefSCCs that don't fall in the postorder range. This has the
899   // advantage of walking the sparser parent edge (in high fan-out graphs) but
900   // more importantly this removes examining all forward edges in all RefSCCs
901   // within the postorder range which aren't in fact connected. Only connected
902   // RefSCCs (and their edges) are visited here.
903   auto ComputeSourceConnectedSet = [&](SmallPtrSetImpl<RefSCC *> &Set) {
904     Set.insert(&SourceC);
905     SmallVector<RefSCC *, 4> Worklist;
906     Worklist.push_back(&SourceC);
907     do {
908       RefSCC &RC = *Worklist.pop_back_val();
909       for (RefSCC &ParentRC : RC.parents()) {
910         // Skip any RefSCCs outside the range of source to target in the
911         // postorder sequence.
912         int ParentIdx = G->getRefSCCIndex(ParentRC);
913         assert(ParentIdx > SourceIdx && "Parent cannot precede source in postorder!");
914         if (ParentIdx > TargetIdx)
915           continue;
916         if (Set.insert(&ParentRC).second)
917           // First edge connecting to this parent, add it to our worklist.
918           Worklist.push_back(&ParentRC);
919       }
920     } while (!Worklist.empty());
921   };
922 
923   // Use a normal worklist to find which SCCs the target connects to. We still
924   // bound the search based on the range in the postorder list we care about,
925   // but because this is forward connectivity we just "recurse" through the
926   // edges.
927   auto ComputeTargetConnectedSet = [&](SmallPtrSetImpl<RefSCC *> &Set) {
928     Set.insert(this);
929     SmallVector<RefSCC *, 4> Worklist;
930     Worklist.push_back(this);
931     do {
932       RefSCC &RC = *Worklist.pop_back_val();
933       for (SCC &C : RC)
934         for (Node &N : C)
935           for (Edge &E : N) {
936             assert(E.getNode() && "Must have formed a node!");
937             RefSCC &EdgeRC = *G->lookupRefSCC(*E.getNode());
938             if (G->getRefSCCIndex(EdgeRC) <= SourceIdx)
939               // Not in the postorder sequence between source and target.
940               continue;
941 
942             if (Set.insert(&EdgeRC).second)
943               Worklist.push_back(&EdgeRC);
944           }
945     } while (!Worklist.empty());
946   };
947 
948   // Use a generic helper to update the postorder sequence of RefSCCs and return
949   // a range of any RefSCCs connected into a cycle by inserting this edge. This
950   // routine will also take care of updating the indices into the postorder
951   // sequence.
952   iterator_range<SmallVectorImpl<RefSCC *>::iterator> MergeRange =
953       updatePostorderSequenceForEdgeInsertion(
954           SourceC, *this, G->PostOrderRefSCCs, G->RefSCCIndices,
955           ComputeSourceConnectedSet, ComputeTargetConnectedSet);
956 
957   // Build a set so we can do fast tests for whether a RefSCC will end up as
958   // part of the merged RefSCC.
959   SmallPtrSet<RefSCC *, 16> MergeSet(MergeRange.begin(), MergeRange.end());
960 
961   // This RefSCC will always be part of that set, so just insert it here.
962   MergeSet.insert(this);
963 
964   // Now that we have identified all of the SCCs which need to be merged into
965   // a connected set with the inserted edge, merge all of them into this SCC.
966   SmallVector<SCC *, 16> MergedSCCs;
967   int SCCIndex = 0;
968   for (RefSCC *RC : MergeRange) {
969     assert(RC != this && "We're merging into the target RefSCC, so it "
970                          "shouldn't be in the range.");
971 
972     // Merge the parents which aren't part of the merge into the our parents.
973     for (RefSCC *ParentRC : RC->Parents)
974       if (!MergeSet.count(ParentRC))
975         Parents.insert(ParentRC);
976     RC->Parents.clear();
977 
978     // Walk the inner SCCs to update their up-pointer and walk all the edges to
979     // update any parent sets.
980     // FIXME: We should try to find a way to avoid this (rather expensive) edge
981     // walk by updating the parent sets in some other manner.
982     for (SCC &InnerC : *RC) {
983       InnerC.OuterRefSCC = this;
984       SCCIndices[&InnerC] = SCCIndex++;
985       for (Node &N : InnerC) {
986         G->SCCMap[&N] = &InnerC;
987         for (Edge &E : N) {
988           assert(E.getNode() &&
989                  "Cannot have a null node within a visited SCC!");
990           RefSCC &ChildRC = *G->lookupRefSCC(*E.getNode());
991           if (MergeSet.count(&ChildRC))
992             continue;
993           ChildRC.Parents.erase(RC);
994           ChildRC.Parents.insert(this);
995         }
996       }
997     }
998 
999     // Now merge in the SCCs. We can actually move here so try to reuse storage
1000     // the first time through.
1001     if (MergedSCCs.empty())
1002       MergedSCCs = std::move(RC->SCCs);
1003     else
1004       MergedSCCs.append(RC->SCCs.begin(), RC->SCCs.end());
1005     RC->SCCs.clear();
1006     DeletedRefSCCs.push_back(RC);
1007   }
1008 
1009   // Append our original SCCs to the merged list and move it into place.
1010   for (SCC &InnerC : *this)
1011     SCCIndices[&InnerC] = SCCIndex++;
1012   MergedSCCs.append(SCCs.begin(), SCCs.end());
1013   SCCs = std::move(MergedSCCs);
1014 
1015   // Remove the merged away RefSCCs from the post order sequence.
1016   for (RefSCC *RC : MergeRange)
1017     G->RefSCCIndices.erase(RC);
1018   int IndexOffset = MergeRange.end() - MergeRange.begin();
1019   auto EraseEnd =
1020       G->PostOrderRefSCCs.erase(MergeRange.begin(), MergeRange.end());
1021   for (RefSCC *RC : make_range(EraseEnd, G->PostOrderRefSCCs.end()))
1022     G->RefSCCIndices[RC] -= IndexOffset;
1023 
1024   // At this point we have a merged RefSCC with a post-order SCCs list, just
1025   // connect the nodes to form the new edge.
1026   SourceN.insertEdgeInternal(TargetN, Edge::Ref);
1027 
1028   // We return the list of SCCs which were merged so that callers can
1029   // invalidate any data they have associated with those SCCs. Note that these
1030   // SCCs are no longer in an interesting state (they are totally empty) but
1031   // the pointers will remain stable for the life of the graph itself.
1032   return DeletedRefSCCs;
1033 }
1034 
1035 void LazyCallGraph::RefSCC::removeOutgoingEdge(Node &SourceN, Node &TargetN) {
1036   assert(G->lookupRefSCC(SourceN) == this &&
1037          "The source must be a member of this RefSCC.");
1038 
1039   RefSCC &TargetRC = *G->lookupRefSCC(TargetN);
1040   assert(&TargetRC != this && "The target must not be a member of this RefSCC");
1041 
1042   assert(!is_contained(G->LeafRefSCCs, this) &&
1043          "Cannot have a leaf RefSCC source.");
1044 
1045 #ifndef NDEBUG
1046   // In a debug build, verify the RefSCC is valid to start with and when this
1047   // routine finishes.
1048   verify();
1049   auto VerifyOnExit = make_scope_exit([&]() { verify(); });
1050 #endif
1051 
1052   // First remove it from the node.
1053   SourceN.removeEdgeInternal(TargetN.getFunction());
1054 
1055   bool HasOtherEdgeToChildRC = false;
1056   bool HasOtherChildRC = false;
1057   for (SCC *InnerC : SCCs) {
1058     for (Node &N : *InnerC) {
1059       for (Edge &E : N) {
1060         assert(E.getNode() && "Cannot have a missing node in a visited SCC!");
1061         RefSCC &OtherChildRC = *G->lookupRefSCC(*E.getNode());
1062         if (&OtherChildRC == &TargetRC) {
1063           HasOtherEdgeToChildRC = true;
1064           break;
1065         }
1066         if (&OtherChildRC != this)
1067           HasOtherChildRC = true;
1068       }
1069       if (HasOtherEdgeToChildRC)
1070         break;
1071     }
1072     if (HasOtherEdgeToChildRC)
1073       break;
1074   }
1075   // Because the SCCs form a DAG, deleting such an edge cannot change the set
1076   // of SCCs in the graph. However, it may cut an edge of the SCC DAG, making
1077   // the source SCC no longer connected to the target SCC. If so, we need to
1078   // update the target SCC's map of its parents.
1079   if (!HasOtherEdgeToChildRC) {
1080     bool Removed = TargetRC.Parents.erase(this);
1081     (void)Removed;
1082     assert(Removed &&
1083            "Did not find the source SCC in the target SCC's parent list!");
1084 
1085     // It may orphan an SCC if it is the last edge reaching it, but that does
1086     // not violate any invariants of the graph.
1087     if (TargetRC.Parents.empty())
1088       DEBUG(dbgs() << "LCG: Update removing " << SourceN.getFunction().getName()
1089                    << " -> " << TargetN.getFunction().getName()
1090                    << " edge orphaned the callee's SCC!\n");
1091 
1092     // It may make the Source SCC a leaf SCC.
1093     if (!HasOtherChildRC)
1094       G->LeafRefSCCs.push_back(this);
1095   }
1096 }
1097 
1098 SmallVector<LazyCallGraph::RefSCC *, 1>
1099 LazyCallGraph::RefSCC::removeInternalRefEdge(Node &SourceN, Node &TargetN) {
1100   assert(!SourceN[TargetN].isCall() &&
1101          "Cannot remove a call edge, it must first be made a ref edge");
1102 
1103 #ifndef NDEBUG
1104   // In a debug build, verify the RefSCC is valid to start with and when this
1105   // routine finishes.
1106   verify();
1107   auto VerifyOnExit = make_scope_exit([&]() { verify(); });
1108 #endif
1109 
1110   // First remove the actual edge.
1111   SourceN.removeEdgeInternal(TargetN.getFunction());
1112 
1113   // We return a list of the resulting *new* RefSCCs in post-order.
1114   SmallVector<RefSCC *, 1> Result;
1115 
1116   // Direct recursion doesn't impact the SCC graph at all.
1117   if (&SourceN == &TargetN)
1118     return Result;
1119 
1120   // We build somewhat synthetic new RefSCCs by providing a postorder mapping
1121   // for each inner SCC. We also store these associated with *nodes* rather
1122   // than SCCs because this saves a round-trip through the node->SCC map and in
1123   // the common case, SCCs are small. We will verify that we always give the
1124   // same number to every node in the SCC such that these are equivalent.
1125   const int RootPostOrderNumber = 0;
1126   int PostOrderNumber = RootPostOrderNumber + 1;
1127   SmallDenseMap<Node *, int> PostOrderMapping;
1128 
1129   // Every node in the target SCC can already reach every node in this RefSCC
1130   // (by definition). It is the only node we know will stay inside this RefSCC.
1131   // Everything which transitively reaches Target will also remain in the
1132   // RefSCC. We handle this by pre-marking that the nodes in the target SCC map
1133   // back to the root post order number.
1134   //
1135   // This also enables us to take a very significant short-cut in the standard
1136   // Tarjan walk to re-form RefSCCs below: whenever we build an edge that
1137   // references the target node, we know that the target node eventually
1138   // references all other nodes in our walk. As a consequence, we can detect
1139   // and handle participants in that cycle without walking all the edges that
1140   // form the connections, and instead by relying on the fundamental guarantee
1141   // coming into this operation.
1142   SCC &TargetC = *G->lookupSCC(TargetN);
1143   for (Node &N : TargetC)
1144     PostOrderMapping[&N] = RootPostOrderNumber;
1145 
1146   // Reset all the other nodes to prepare for a DFS over them, and add them to
1147   // our worklist.
1148   SmallVector<Node *, 8> Worklist;
1149   for (SCC *C : SCCs) {
1150     if (C == &TargetC)
1151       continue;
1152 
1153     for (Node &N : *C)
1154       N.DFSNumber = N.LowLink = 0;
1155 
1156     Worklist.append(C->Nodes.begin(), C->Nodes.end());
1157   }
1158 
1159   auto MarkNodeForSCCNumber = [&PostOrderMapping](Node &N, int Number) {
1160     N.DFSNumber = N.LowLink = -1;
1161     PostOrderMapping[&N] = Number;
1162   };
1163 
1164   SmallVector<std::pair<Node *, edge_iterator>, 4> DFSStack;
1165   SmallVector<Node *, 4> PendingRefSCCStack;
1166   do {
1167     assert(DFSStack.empty() &&
1168            "Cannot begin a new root with a non-empty DFS stack!");
1169     assert(PendingRefSCCStack.empty() &&
1170            "Cannot begin a new root with pending nodes for an SCC!");
1171 
1172     Node *RootN = Worklist.pop_back_val();
1173     // Skip any nodes we've already reached in the DFS.
1174     if (RootN->DFSNumber != 0) {
1175       assert(RootN->DFSNumber == -1 &&
1176              "Shouldn't have any mid-DFS root nodes!");
1177       continue;
1178     }
1179 
1180     RootN->DFSNumber = RootN->LowLink = 1;
1181     int NextDFSNumber = 2;
1182 
1183     DFSStack.push_back({RootN, RootN->begin()});
1184     do {
1185       Node *N;
1186       edge_iterator I;
1187       std::tie(N, I) = DFSStack.pop_back_val();
1188       auto E = N->end();
1189 
1190       assert(N->DFSNumber != 0 && "We should always assign a DFS number "
1191                                   "before processing a node.");
1192 
1193       while (I != E) {
1194         Node &ChildN = I->getNode(*G);
1195         if (ChildN.DFSNumber == 0) {
1196           // Mark that we should start at this child when next this node is the
1197           // top of the stack. We don't start at the next child to ensure this
1198           // child's lowlink is reflected.
1199           DFSStack.push_back({N, I});
1200 
1201           // Continue, resetting to the child node.
1202           ChildN.LowLink = ChildN.DFSNumber = NextDFSNumber++;
1203           N = &ChildN;
1204           I = ChildN.begin();
1205           E = ChildN.end();
1206           continue;
1207         }
1208         if (ChildN.DFSNumber == -1) {
1209           // Check if this edge's target node connects to the deleted edge's
1210           // target node. If so, we know that every node connected will end up
1211           // in this RefSCC, so collapse the entire current stack into the root
1212           // slot in our SCC numbering. See above for the motivation of
1213           // optimizing the target connected nodes in this way.
1214           auto PostOrderI = PostOrderMapping.find(&ChildN);
1215           if (PostOrderI != PostOrderMapping.end() &&
1216               PostOrderI->second == RootPostOrderNumber) {
1217             MarkNodeForSCCNumber(*N, RootPostOrderNumber);
1218             while (!PendingRefSCCStack.empty())
1219               MarkNodeForSCCNumber(*PendingRefSCCStack.pop_back_val(),
1220                                    RootPostOrderNumber);
1221             while (!DFSStack.empty())
1222               MarkNodeForSCCNumber(*DFSStack.pop_back_val().first,
1223                                    RootPostOrderNumber);
1224             // Ensure we break all the way out of the enclosing loop.
1225             N = nullptr;
1226             break;
1227           }
1228 
1229           // If this child isn't currently in this RefSCC, no need to process
1230           // it. However, we do need to remove this RefSCC from its RefSCC's
1231           // parent set.
1232           RefSCC &ChildRC = *G->lookupRefSCC(ChildN);
1233           ChildRC.Parents.erase(this);
1234           ++I;
1235           continue;
1236         }
1237 
1238         // Track the lowest link of the children, if any are still in the stack.
1239         // Any child not on the stack will have a LowLink of -1.
1240         assert(ChildN.LowLink != 0 &&
1241                "Low-link must not be zero with a non-zero DFS number.");
1242         if (ChildN.LowLink >= 0 && ChildN.LowLink < N->LowLink)
1243           N->LowLink = ChildN.LowLink;
1244         ++I;
1245       }
1246       if (!N)
1247         // We short-circuited this node.
1248         break;
1249 
1250       // We've finished processing N and its descendents, put it on our pending
1251       // stack to eventually get merged into a RefSCC.
1252       PendingRefSCCStack.push_back(N);
1253 
1254       // If this node is linked to some lower entry, continue walking up the
1255       // stack.
1256       if (N->LowLink != N->DFSNumber) {
1257         assert(!DFSStack.empty() &&
1258                "We never found a viable root for a RefSCC to pop off!");
1259         continue;
1260       }
1261 
1262       // Otherwise, form a new RefSCC from the top of the pending node stack.
1263       int RootDFSNumber = N->DFSNumber;
1264       // Find the range of the node stack by walking down until we pass the
1265       // root DFS number.
1266       auto RefSCCNodes = make_range(
1267           PendingRefSCCStack.rbegin(),
1268           find_if(reverse(PendingRefSCCStack), [RootDFSNumber](const Node *N) {
1269             return N->DFSNumber < RootDFSNumber;
1270           }));
1271 
1272       // Mark the postorder number for these nodes and clear them off the
1273       // stack. We'll use the postorder number to pull them into RefSCCs at the
1274       // end. FIXME: Fuse with the loop above.
1275       int RefSCCNumber = PostOrderNumber++;
1276       for (Node *N : RefSCCNodes)
1277         MarkNodeForSCCNumber(*N, RefSCCNumber);
1278 
1279       PendingRefSCCStack.erase(RefSCCNodes.end().base(),
1280                                PendingRefSCCStack.end());
1281     } while (!DFSStack.empty());
1282 
1283     assert(DFSStack.empty() && "Didn't flush the entire DFS stack!");
1284     assert(PendingRefSCCStack.empty() && "Didn't flush all pending nodes!");
1285   } while (!Worklist.empty());
1286 
1287   // We now have a post-order numbering for RefSCCs and a mapping from each
1288   // node in this RefSCC to its final RefSCC. We create each new RefSCC node
1289   // (re-using this RefSCC node for the root) and build a radix-sort style map
1290   // from postorder number to the RefSCC. We then append SCCs to each of these
1291   // RefSCCs in the order they occured in the original SCCs container.
1292   for (int i = 1; i < PostOrderNumber; ++i)
1293     Result.push_back(G->createRefSCC(*G));
1294 
1295   // Insert the resulting postorder sequence into the global graph postorder
1296   // sequence before the current RefSCC in that sequence. The idea being that
1297   // this RefSCC is the target of the reference edge removed, and thus has
1298   // a direct or indirect edge to every other RefSCC formed and so must be at
1299   // the end of any postorder traversal.
1300   //
1301   // FIXME: It'd be nice to change the APIs so that we returned an iterator
1302   // range over the global postorder sequence and generally use that sequence
1303   // rather than building a separate result vector here.
1304   if (!Result.empty()) {
1305     int Idx = G->getRefSCCIndex(*this);
1306     G->PostOrderRefSCCs.insert(G->PostOrderRefSCCs.begin() + Idx,
1307                                Result.begin(), Result.end());
1308     for (int i : seq<int>(Idx, G->PostOrderRefSCCs.size()))
1309       G->RefSCCIndices[G->PostOrderRefSCCs[i]] = i;
1310     assert(G->PostOrderRefSCCs[G->getRefSCCIndex(*this)] == this &&
1311            "Failed to update this RefSCC's index after insertion!");
1312   }
1313 
1314   for (SCC *C : SCCs) {
1315     auto PostOrderI = PostOrderMapping.find(&*C->begin());
1316     assert(PostOrderI != PostOrderMapping.end() &&
1317            "Cannot have missing mappings for nodes!");
1318     int SCCNumber = PostOrderI->second;
1319 #ifndef NDEBUG
1320     for (Node &N : *C)
1321       assert(PostOrderMapping.find(&N)->second == SCCNumber &&
1322              "Cannot have different numbers for nodes in the same SCC!");
1323 #endif
1324     if (SCCNumber == 0)
1325       // The root node is handled separately by removing the SCCs.
1326       continue;
1327 
1328     RefSCC &RC = *Result[SCCNumber - 1];
1329     int SCCIndex = RC.SCCs.size();
1330     RC.SCCs.push_back(C);
1331     RC.SCCIndices[C] = SCCIndex;
1332     C->OuterRefSCC = &RC;
1333   }
1334 
1335   // FIXME: We re-walk the edges in each RefSCC to establish whether it is
1336   // a leaf and connect it to the rest of the graph's parents lists. This is
1337   // really wasteful. We should instead do this during the DFS to avoid yet
1338   // another edge walk.
1339   for (RefSCC *RC : Result)
1340     G->connectRefSCC(*RC);
1341 
1342   // Now erase all but the root's SCCs.
1343   SCCs.erase(remove_if(SCCs,
1344                        [&](SCC *C) {
1345                          return PostOrderMapping.lookup(&*C->begin()) !=
1346                                 RootPostOrderNumber;
1347                        }),
1348              SCCs.end());
1349   SCCIndices.clear();
1350   for (int i = 0, Size = SCCs.size(); i < Size; ++i)
1351     SCCIndices[SCCs[i]] = i;
1352 
1353 #ifndef NDEBUG
1354   // Now we need to reconnect the current (root) SCC to the graph. We do this
1355   // manually because we can special case our leaf handling and detect errors.
1356   bool IsLeaf = true;
1357 #endif
1358   for (SCC *C : SCCs)
1359     for (Node &N : *C) {
1360       for (Edge &E : N) {
1361         assert(E.getNode() && "Cannot have a missing node in a visited SCC!");
1362         RefSCC &ChildRC = *G->lookupRefSCC(*E.getNode());
1363         if (&ChildRC == this)
1364           continue;
1365         ChildRC.Parents.insert(this);
1366 #ifndef NDEBUG
1367         IsLeaf = false;
1368 #endif
1369       }
1370     }
1371 #ifndef NDEBUG
1372   if (!Result.empty())
1373     assert(!IsLeaf && "This SCC cannot be a leaf as we have split out new "
1374                       "SCCs by removing this edge.");
1375   if (none_of(G->LeafRefSCCs, [&](RefSCC *C) { return C == this; }))
1376     assert(!IsLeaf && "This SCC cannot be a leaf as it already had child "
1377                       "SCCs before we removed this edge.");
1378 #endif
1379   // And connect both this RefSCC and all the new ones to the correct parents.
1380   // The easiest way to do this is just to re-analyze the old parent set.
1381   SmallVector<RefSCC *, 4> OldParents(Parents.begin(), Parents.end());
1382   Parents.clear();
1383   for (RefSCC *ParentRC : OldParents)
1384     for (SCC &ParentC : *ParentRC)
1385       for (Node &ParentN : ParentC)
1386         for (Edge &E : ParentN) {
1387           assert(E.getNode() && "Cannot have a missing node in a visited SCC!");
1388           RefSCC &RC = *G->lookupRefSCC(*E.getNode());
1389           if (&RC != ParentRC)
1390             RC.Parents.insert(ParentRC);
1391         }
1392 
1393   // If this SCC stopped being a leaf through this edge removal, remove it from
1394   // the leaf SCC list. Note that this DTRT in the case where this was never
1395   // a leaf.
1396   // FIXME: As LeafRefSCCs could be very large, we might want to not walk the
1397   // entire list if this RefSCC wasn't a leaf before the edge removal.
1398   if (!Result.empty())
1399     G->LeafRefSCCs.erase(
1400         std::remove(G->LeafRefSCCs.begin(), G->LeafRefSCCs.end(), this),
1401         G->LeafRefSCCs.end());
1402 
1403 #ifndef NDEBUG
1404   // Verify all of the new RefSCCs.
1405   for (RefSCC *RC : Result)
1406     RC->verify();
1407 #endif
1408 
1409   // Return the new list of SCCs.
1410   return Result;
1411 }
1412 
1413 void LazyCallGraph::RefSCC::handleTrivialEdgeInsertion(Node &SourceN,
1414                                                        Node &TargetN) {
1415   // The only trivial case that requires any graph updates is when we add new
1416   // ref edge and may connect different RefSCCs along that path. This is only
1417   // because of the parents set. Every other part of the graph remains constant
1418   // after this edge insertion.
1419   assert(G->lookupRefSCC(SourceN) == this && "Source must be in this RefSCC.");
1420   RefSCC &TargetRC = *G->lookupRefSCC(TargetN);
1421   if (&TargetRC == this) {
1422 
1423     return;
1424   }
1425 
1426   assert(TargetRC.isDescendantOf(*this) &&
1427          "Target must be a descendant of the Source.");
1428   // The only change required is to add this RefSCC to the parent set of the
1429   // target. This is a set and so idempotent if the edge already existed.
1430   TargetRC.Parents.insert(this);
1431 }
1432 
1433 void LazyCallGraph::RefSCC::insertTrivialCallEdge(Node &SourceN,
1434                                                   Node &TargetN) {
1435 #ifndef NDEBUG
1436   // Check that the RefSCC is still valid when we finish.
1437   auto ExitVerifier = make_scope_exit([this] { verify(); });
1438 
1439   // Check that we aren't breaking some invariants of the SCC graph.
1440   SCC &SourceC = *G->lookupSCC(SourceN);
1441   SCC &TargetC = *G->lookupSCC(TargetN);
1442   if (&SourceC != &TargetC)
1443     assert(SourceC.isAncestorOf(TargetC) &&
1444            "Call edge is not trivial in the SCC graph!");
1445 #endif
1446   // First insert it into the source or find the existing edge.
1447   auto InsertResult = SourceN.EdgeIndexMap.insert(
1448       {&TargetN.getFunction(), SourceN.Edges.size()});
1449   if (!InsertResult.second) {
1450     // Already an edge, just update it.
1451     Edge &E = SourceN.Edges[InsertResult.first->second];
1452     if (E.isCall())
1453       return; // Nothing to do!
1454     E.setKind(Edge::Call);
1455   } else {
1456     // Create the new edge.
1457     SourceN.Edges.emplace_back(TargetN, Edge::Call);
1458   }
1459 
1460   // Now that we have the edge, handle the graph fallout.
1461   handleTrivialEdgeInsertion(SourceN, TargetN);
1462 }
1463 
1464 void LazyCallGraph::RefSCC::insertTrivialRefEdge(Node &SourceN, Node &TargetN) {
1465 #ifndef NDEBUG
1466   // Check that the RefSCC is still valid when we finish.
1467   auto ExitVerifier = make_scope_exit([this] { verify(); });
1468 
1469   // Check that we aren't breaking some invariants of the RefSCC graph.
1470   RefSCC &SourceRC = *G->lookupRefSCC(SourceN);
1471   RefSCC &TargetRC = *G->lookupRefSCC(TargetN);
1472   if (&SourceRC != &TargetRC)
1473     assert(SourceRC.isAncestorOf(TargetRC) &&
1474            "Ref edge is not trivial in the RefSCC graph!");
1475 #endif
1476   // First insert it into the source or find the existing edge.
1477   auto InsertResult = SourceN.EdgeIndexMap.insert(
1478       {&TargetN.getFunction(), SourceN.Edges.size()});
1479   if (!InsertResult.second)
1480     // Already an edge, we're done.
1481     return;
1482 
1483   // Create the new edge.
1484   SourceN.Edges.emplace_back(TargetN, Edge::Ref);
1485 
1486   // Now that we have the edge, handle the graph fallout.
1487   handleTrivialEdgeInsertion(SourceN, TargetN);
1488 }
1489 
1490 void LazyCallGraph::insertEdge(Node &SourceN, Function &Target, Edge::Kind EK) {
1491   assert(SCCMap.empty() && DFSStack.empty() &&
1492          "This method cannot be called after SCCs have been formed!");
1493 
1494   return SourceN.insertEdgeInternal(Target, EK);
1495 }
1496 
1497 void LazyCallGraph::removeEdge(Node &SourceN, Function &Target) {
1498   assert(SCCMap.empty() && DFSStack.empty() &&
1499          "This method cannot be called after SCCs have been formed!");
1500 
1501   return SourceN.removeEdgeInternal(Target);
1502 }
1503 
1504 void LazyCallGraph::removeDeadFunction(Function &F) {
1505   // FIXME: This is unnecessarily restrictive. We should be able to remove
1506   // functions which recursively call themselves.
1507   assert(F.use_empty() &&
1508          "This routine should only be called on trivially dead functions!");
1509 
1510   auto EII = EntryIndexMap.find(&F);
1511   if (EII != EntryIndexMap.end()) {
1512     EntryEdges[EII->second] = Edge();
1513     EntryIndexMap.erase(EII);
1514   }
1515 
1516   // It's safe to just remove un-visited functions from the RefSCC entry list.
1517   // FIXME: This is a linear operation which could become hot and benefit from
1518   // an index map.
1519   auto RENI = find(RefSCCEntryNodes, &F);
1520   if (RENI != RefSCCEntryNodes.end())
1521     RefSCCEntryNodes.erase(RENI);
1522 
1523   auto NI = NodeMap.find(&F);
1524   if (NI == NodeMap.end())
1525     // Not in the graph at all!
1526     return;
1527 
1528   Node &N = *NI->second;
1529   NodeMap.erase(NI);
1530 
1531   if (SCCMap.empty() && DFSStack.empty()) {
1532     // No SCC walk has begun, so removing this is fine and there is nothing
1533     // else necessary at this point but clearing out the node.
1534     N.clear();
1535     return;
1536   }
1537 
1538   // Check that we aren't going to break the DFS walk.
1539   assert(all_of(DFSStack,
1540                 [&N](const std::pair<Node *, edge_iterator> &Element) {
1541                   return Element.first != &N;
1542                 }) &&
1543          "Tried to remove a function currently in the DFS stack!");
1544   assert(find(PendingRefSCCStack, &N) == PendingRefSCCStack.end() &&
1545          "Tried to remove a function currently pending to add to a RefSCC!");
1546 
1547   // Cannot remove a function which has yet to be visited in the DFS walk, so
1548   // if we have a node at all then we must have an SCC and RefSCC.
1549   auto CI = SCCMap.find(&N);
1550   assert(CI != SCCMap.end() &&
1551          "Tried to remove a node without an SCC after DFS walk started!");
1552   SCC &C = *CI->second;
1553   SCCMap.erase(CI);
1554   RefSCC &RC = C.getOuterRefSCC();
1555 
1556   // This node must be the only member of its SCC as it has no callers, and
1557   // that SCC must be the only member of a RefSCC as it has no references.
1558   // Validate these properties first.
1559   assert(C.size() == 1 && "Dead functions must be in a singular SCC");
1560   assert(RC.size() == 1 && "Dead functions must be in a singular RefSCC");
1561   assert(RC.Parents.empty() && "Cannot have parents of a dead RefSCC!");
1562 
1563   // Now remove this RefSCC from any parents sets and the leaf list.
1564   for (Edge &E : N)
1565     if (Node *TargetN = E.getNode())
1566       if (RefSCC *TargetRC = lookupRefSCC(*TargetN))
1567         TargetRC->Parents.erase(&RC);
1568   // FIXME: This is a linear operation which could become hot and benefit from
1569   // an index map.
1570   auto LRI = find(LeafRefSCCs, &RC);
1571   if (LRI != LeafRefSCCs.end())
1572     LeafRefSCCs.erase(LRI);
1573 
1574   auto RCIndexI = RefSCCIndices.find(&RC);
1575   int RCIndex = RCIndexI->second;
1576   PostOrderRefSCCs.erase(PostOrderRefSCCs.begin() + RCIndex);
1577   RefSCCIndices.erase(RCIndexI);
1578   for (int i = RCIndex, Size = PostOrderRefSCCs.size(); i < Size; ++i)
1579     RefSCCIndices[PostOrderRefSCCs[i]] = i;
1580 
1581   // Finally clear out all the data structures from the node down through the
1582   // components.
1583   N.clear();
1584   C.clear();
1585   RC.clear();
1586 
1587   // Nothing to delete as all the objects are allocated in stable bump pointer
1588   // allocators.
1589 }
1590 
1591 LazyCallGraph::Node &LazyCallGraph::insertInto(Function &F, Node *&MappedN) {
1592   return *new (MappedN = BPA.Allocate()) Node(*this, F);
1593 }
1594 
1595 void LazyCallGraph::updateGraphPtrs() {
1596   // Process all nodes updating the graph pointers.
1597   {
1598     SmallVector<Node *, 16> Worklist;
1599     for (Edge &E : EntryEdges)
1600       if (Node *EntryN = E.getNode())
1601         Worklist.push_back(EntryN);
1602 
1603     while (!Worklist.empty()) {
1604       Node *N = Worklist.pop_back_val();
1605       N->G = this;
1606       for (Edge &E : N->Edges)
1607         if (Node *TargetN = E.getNode())
1608           Worklist.push_back(TargetN);
1609     }
1610   }
1611 
1612   // Process all SCCs updating the graph pointers.
1613   {
1614     SmallVector<RefSCC *, 16> Worklist(LeafRefSCCs.begin(), LeafRefSCCs.end());
1615 
1616     while (!Worklist.empty()) {
1617       RefSCC &C = *Worklist.pop_back_val();
1618       C.G = this;
1619       for (RefSCC &ParentC : C.parents())
1620         Worklist.push_back(&ParentC);
1621     }
1622   }
1623 }
1624 
1625 /// Build the internal SCCs for a RefSCC from a sequence of nodes.
1626 ///
1627 /// Appends the SCCs to the provided vector and updates the map with their
1628 /// indices. Both the vector and map must be empty when passed into this
1629 /// routine.
1630 void LazyCallGraph::buildSCCs(RefSCC &RC, node_stack_range Nodes) {
1631   assert(RC.SCCs.empty() && "Already built SCCs!");
1632   assert(RC.SCCIndices.empty() && "Already mapped SCC indices!");
1633 
1634   for (Node *N : Nodes) {
1635     assert(N->LowLink >= (*Nodes.begin())->LowLink &&
1636            "We cannot have a low link in an SCC lower than its root on the "
1637            "stack!");
1638 
1639     // This node will go into the next RefSCC, clear out its DFS and low link
1640     // as we scan.
1641     N->DFSNumber = N->LowLink = 0;
1642   }
1643 
1644   // Each RefSCC contains a DAG of the call SCCs. To build these, we do
1645   // a direct walk of the call edges using Tarjan's algorithm. We reuse the
1646   // internal storage as we won't need it for the outer graph's DFS any longer.
1647 
1648   SmallVector<std::pair<Node *, call_edge_iterator>, 16> DFSStack;
1649   SmallVector<Node *, 16> PendingSCCStack;
1650 
1651   // Scan down the stack and DFS across the call edges.
1652   for (Node *RootN : Nodes) {
1653     assert(DFSStack.empty() &&
1654            "Cannot begin a new root with a non-empty DFS stack!");
1655     assert(PendingSCCStack.empty() &&
1656            "Cannot begin a new root with pending nodes for an SCC!");
1657 
1658     // Skip any nodes we've already reached in the DFS.
1659     if (RootN->DFSNumber != 0) {
1660       assert(RootN->DFSNumber == -1 &&
1661              "Shouldn't have any mid-DFS root nodes!");
1662       continue;
1663     }
1664 
1665     RootN->DFSNumber = RootN->LowLink = 1;
1666     int NextDFSNumber = 2;
1667 
1668     DFSStack.push_back({RootN, RootN->call_begin()});
1669     do {
1670       Node *N;
1671       call_edge_iterator I;
1672       std::tie(N, I) = DFSStack.pop_back_val();
1673       auto E = N->call_end();
1674       while (I != E) {
1675         Node &ChildN = *I->getNode();
1676         if (ChildN.DFSNumber == 0) {
1677           // We haven't yet visited this child, so descend, pushing the current
1678           // node onto the stack.
1679           DFSStack.push_back({N, I});
1680 
1681           assert(!lookupSCC(ChildN) &&
1682                  "Found a node with 0 DFS number but already in an SCC!");
1683           ChildN.DFSNumber = ChildN.LowLink = NextDFSNumber++;
1684           N = &ChildN;
1685           I = N->call_begin();
1686           E = N->call_end();
1687           continue;
1688         }
1689 
1690         // If the child has already been added to some child component, it
1691         // couldn't impact the low-link of this parent because it isn't
1692         // connected, and thus its low-link isn't relevant so skip it.
1693         if (ChildN.DFSNumber == -1) {
1694           ++I;
1695           continue;
1696         }
1697 
1698         // Track the lowest linked child as the lowest link for this node.
1699         assert(ChildN.LowLink > 0 && "Must have a positive low-link number!");
1700         if (ChildN.LowLink < N->LowLink)
1701           N->LowLink = ChildN.LowLink;
1702 
1703         // Move to the next edge.
1704         ++I;
1705       }
1706 
1707       // We've finished processing N and its descendents, put it on our pending
1708       // SCC stack to eventually get merged into an SCC of nodes.
1709       PendingSCCStack.push_back(N);
1710 
1711       // If this node is linked to some lower entry, continue walking up the
1712       // stack.
1713       if (N->LowLink != N->DFSNumber)
1714         continue;
1715 
1716       // Otherwise, we've completed an SCC. Append it to our post order list of
1717       // SCCs.
1718       int RootDFSNumber = N->DFSNumber;
1719       // Find the range of the node stack by walking down until we pass the
1720       // root DFS number.
1721       auto SCCNodes = make_range(
1722           PendingSCCStack.rbegin(),
1723           find_if(reverse(PendingSCCStack), [RootDFSNumber](const Node *N) {
1724             return N->DFSNumber < RootDFSNumber;
1725           }));
1726       // Form a new SCC out of these nodes and then clear them off our pending
1727       // stack.
1728       RC.SCCs.push_back(createSCC(RC, SCCNodes));
1729       for (Node &N : *RC.SCCs.back()) {
1730         N.DFSNumber = N.LowLink = -1;
1731         SCCMap[&N] = RC.SCCs.back();
1732       }
1733       PendingSCCStack.erase(SCCNodes.end().base(), PendingSCCStack.end());
1734     } while (!DFSStack.empty());
1735   }
1736 
1737   // Wire up the SCC indices.
1738   for (int i = 0, Size = RC.SCCs.size(); i < Size; ++i)
1739     RC.SCCIndices[RC.SCCs[i]] = i;
1740 }
1741 
1742 // FIXME: We should move callers of this to embed the parent linking and leaf
1743 // tracking into their DFS in order to remove a full walk of all edges.
1744 void LazyCallGraph::connectRefSCC(RefSCC &RC) {
1745   // Walk all edges in the RefSCC (this remains linear as we only do this once
1746   // when we build the RefSCC) to connect it to the parent sets of its
1747   // children.
1748   bool IsLeaf = true;
1749   for (SCC &C : RC)
1750     for (Node &N : C)
1751       for (Edge &E : N) {
1752         assert(E.getNode() &&
1753                "Cannot have a missing node in a visited part of the graph!");
1754         RefSCC &ChildRC = *lookupRefSCC(*E.getNode());
1755         if (&ChildRC == &RC)
1756           continue;
1757         ChildRC.Parents.insert(&RC);
1758         IsLeaf = false;
1759       }
1760 
1761   // For the SCCs where we find no child SCCs, add them to the leaf list.
1762   if (IsLeaf)
1763     LeafRefSCCs.push_back(&RC);
1764 }
1765 
1766 bool LazyCallGraph::buildNextRefSCCInPostOrder() {
1767   if (DFSStack.empty()) {
1768     Node *N;
1769     do {
1770       // If we've handled all candidate entry nodes to the SCC forest, we're
1771       // done.
1772       if (RefSCCEntryNodes.empty())
1773         return false;
1774 
1775       N = &get(*RefSCCEntryNodes.pop_back_val());
1776     } while (N->DFSNumber != 0);
1777 
1778     // Found a new root, begin the DFS here.
1779     N->LowLink = N->DFSNumber = 1;
1780     NextDFSNumber = 2;
1781     DFSStack.push_back({N, N->begin()});
1782   }
1783 
1784   for (;;) {
1785     Node *N;
1786     edge_iterator I;
1787     std::tie(N, I) = DFSStack.pop_back_val();
1788 
1789     assert(N->DFSNumber > 0 && "We should always assign a DFS number "
1790                                "before placing a node onto the stack.");
1791 
1792     auto E = N->end();
1793     while (I != E) {
1794       Node &ChildN = I->getNode(*this);
1795       if (ChildN.DFSNumber == 0) {
1796         // We haven't yet visited this child, so descend, pushing the current
1797         // node onto the stack.
1798         DFSStack.push_back({N, N->begin()});
1799 
1800         assert(!SCCMap.count(&ChildN) &&
1801                "Found a node with 0 DFS number but already in an SCC!");
1802         ChildN.LowLink = ChildN.DFSNumber = NextDFSNumber++;
1803         N = &ChildN;
1804         I = N->begin();
1805         E = N->end();
1806         continue;
1807       }
1808 
1809       // If the child has already been added to some child component, it
1810       // couldn't impact the low-link of this parent because it isn't
1811       // connected, and thus its low-link isn't relevant so skip it.
1812       if (ChildN.DFSNumber == -1) {
1813         ++I;
1814         continue;
1815       }
1816 
1817       // Track the lowest linked child as the lowest link for this node.
1818       assert(ChildN.LowLink > 0 && "Must have a positive low-link number!");
1819       if (ChildN.LowLink < N->LowLink)
1820         N->LowLink = ChildN.LowLink;
1821 
1822       // Move to the next edge.
1823       ++I;
1824     }
1825 
1826     // We've finished processing N and its descendents, put it on our pending
1827     // SCC stack to eventually get merged into an SCC of nodes.
1828     PendingRefSCCStack.push_back(N);
1829 
1830     // If this node is linked to some lower entry, continue walking up the
1831     // stack.
1832     if (N->LowLink != N->DFSNumber) {
1833       assert(!DFSStack.empty() &&
1834              "We never found a viable root for an SCC to pop off!");
1835       continue;
1836     }
1837 
1838     // Otherwise, form a new RefSCC from the top of the pending node stack.
1839     int RootDFSNumber = N->DFSNumber;
1840     // Find the range of the node stack by walking down until we pass the
1841     // root DFS number.
1842     auto RefSCCNodes = node_stack_range(
1843         PendingRefSCCStack.rbegin(),
1844         find_if(reverse(PendingRefSCCStack), [RootDFSNumber](const Node *N) {
1845           return N->DFSNumber < RootDFSNumber;
1846         }));
1847     // Form a new RefSCC out of these nodes and then clear them off our pending
1848     // stack.
1849     RefSCC *NewRC = createRefSCC(*this);
1850     buildSCCs(*NewRC, RefSCCNodes);
1851     connectRefSCC(*NewRC);
1852     PendingRefSCCStack.erase(RefSCCNodes.end().base(),
1853                              PendingRefSCCStack.end());
1854 
1855     // Push the new node into the postorder list and return true indicating we
1856     // successfully grew the postorder sequence by one.
1857     bool Inserted =
1858         RefSCCIndices.insert({NewRC, PostOrderRefSCCs.size()}).second;
1859     (void)Inserted;
1860     assert(Inserted && "Cannot already have this RefSCC in the index map!");
1861     PostOrderRefSCCs.push_back(NewRC);
1862     return true;
1863   }
1864 }
1865 
1866 AnalysisKey LazyCallGraphAnalysis::Key;
1867 
1868 LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) : OS(OS) {}
1869 
1870 static void printNode(raw_ostream &OS, LazyCallGraph::Node &N) {
1871   OS << "  Edges in function: " << N.getFunction().getName() << "\n";
1872   for (const LazyCallGraph::Edge &E : N)
1873     OS << "    " << (E.isCall() ? "call" : "ref ") << " -> "
1874        << E.getFunction().getName() << "\n";
1875 
1876   OS << "\n";
1877 }
1878 
1879 static void printSCC(raw_ostream &OS, LazyCallGraph::SCC &C) {
1880   ptrdiff_t Size = std::distance(C.begin(), C.end());
1881   OS << "    SCC with " << Size << " functions:\n";
1882 
1883   for (LazyCallGraph::Node &N : C)
1884     OS << "      " << N.getFunction().getName() << "\n";
1885 }
1886 
1887 static void printRefSCC(raw_ostream &OS, LazyCallGraph::RefSCC &C) {
1888   ptrdiff_t Size = std::distance(C.begin(), C.end());
1889   OS << "  RefSCC with " << Size << " call SCCs:\n";
1890 
1891   for (LazyCallGraph::SCC &InnerC : C)
1892     printSCC(OS, InnerC);
1893 
1894   OS << "\n";
1895 }
1896 
1897 PreservedAnalyses LazyCallGraphPrinterPass::run(Module &M,
1898                                                 ModuleAnalysisManager &AM) {
1899   LazyCallGraph &G = AM.getResult<LazyCallGraphAnalysis>(M);
1900 
1901   OS << "Printing the call graph for module: " << M.getModuleIdentifier()
1902      << "\n\n";
1903 
1904   for (Function &F : M)
1905     printNode(OS, G.get(F));
1906 
1907   for (LazyCallGraph::RefSCC &C : G.postorder_ref_sccs())
1908     printRefSCC(OS, C);
1909 
1910   return PreservedAnalyses::all();
1911 }
1912 
1913 LazyCallGraphDOTPrinterPass::LazyCallGraphDOTPrinterPass(raw_ostream &OS)
1914     : OS(OS) {}
1915 
1916 static void printNodeDOT(raw_ostream &OS, LazyCallGraph::Node &N) {
1917   std::string Name = "\"" + DOT::EscapeString(N.getFunction().getName()) + "\"";
1918 
1919   for (const LazyCallGraph::Edge &E : N) {
1920     OS << "  " << Name << " -> \""
1921        << DOT::EscapeString(E.getFunction().getName()) << "\"";
1922     if (!E.isCall()) // It is a ref edge.
1923       OS << " [style=dashed,label=\"ref\"]";
1924     OS << ";\n";
1925   }
1926 
1927   OS << "\n";
1928 }
1929 
1930 PreservedAnalyses LazyCallGraphDOTPrinterPass::run(Module &M,
1931                                                    ModuleAnalysisManager &AM) {
1932   LazyCallGraph &G = AM.getResult<LazyCallGraphAnalysis>(M);
1933 
1934   OS << "digraph \"" << DOT::EscapeString(M.getModuleIdentifier()) << "\" {\n";
1935 
1936   for (Function &F : M)
1937     printNodeDOT(OS, G.get(F));
1938 
1939   OS << "}\n";
1940 
1941   return PreservedAnalyses::all();
1942 }
1943