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