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/raw_ostream.h" 18 19 using namespace llvm; 20 21 #define DEBUG_TYPE "lcg" 22 23 static void findCallees( 24 SmallVectorImpl<Constant *> &Worklist, SmallPtrSetImpl<Constant *> &Visited, 25 SmallVectorImpl<PointerUnion<Function *, LazyCallGraph::Node *>> &Callees, 26 DenseMap<Function *, size_t> &CalleeIndexMap) { 27 while (!Worklist.empty()) { 28 Constant *C = Worklist.pop_back_val(); 29 30 if (Function *F = dyn_cast<Function>(C)) { 31 // Note that we consider *any* function with a definition to be a viable 32 // edge. Even if the function's definition is subject to replacement by 33 // some other module (say, a weak definition) there may still be 34 // optimizations which essentially speculate based on the definition and 35 // a way to check that the specific definition is in fact the one being 36 // used. For example, this could be done by moving the weak definition to 37 // a strong (internal) definition and making the weak definition be an 38 // alias. Then a test of the address of the weak function against the new 39 // strong definition's address would be an effective way to determine the 40 // safety of optimizing a direct call edge. 41 if (!F->isDeclaration() && 42 CalleeIndexMap.insert(std::make_pair(F, Callees.size())).second) { 43 DEBUG(dbgs() << " Added callable function: " << F->getName() 44 << "\n"); 45 Callees.push_back(F); 46 } 47 continue; 48 } 49 50 for (Value *Op : C->operand_values()) 51 if (Visited.insert(cast<Constant>(Op))) 52 Worklist.push_back(cast<Constant>(Op)); 53 } 54 } 55 56 LazyCallGraph::Node::Node(LazyCallGraph &G, Function &F) 57 : G(&G), F(F), DFSNumber(0), LowLink(0) { 58 DEBUG(dbgs() << " Adding functions called by '" << F.getName() 59 << "' to the graph.\n"); 60 61 SmallVector<Constant *, 16> Worklist; 62 SmallPtrSet<Constant *, 16> Visited; 63 // Find all the potential callees in this function. First walk the 64 // instructions and add every operand which is a constant to the worklist. 65 for (BasicBlock &BB : F) 66 for (Instruction &I : BB) 67 for (Value *Op : I.operand_values()) 68 if (Constant *C = dyn_cast<Constant>(Op)) 69 if (Visited.insert(C)) 70 Worklist.push_back(C); 71 72 // We've collected all the constant (and thus potentially function or 73 // function containing) operands to all of the instructions in the function. 74 // Process them (recursively) collecting every function found. 75 findCallees(Worklist, Visited, Callees, CalleeIndexMap); 76 } 77 78 LazyCallGraph::LazyCallGraph(Module &M) : NextDFSNumber(0) { 79 DEBUG(dbgs() << "Building CG for module: " << M.getModuleIdentifier() 80 << "\n"); 81 for (Function &F : M) 82 if (!F.isDeclaration() && !F.hasLocalLinkage()) 83 if (EntryIndexMap.insert(std::make_pair(&F, EntryNodes.size())).second) { 84 DEBUG(dbgs() << " Adding '" << F.getName() 85 << "' to entry set of the graph.\n"); 86 EntryNodes.push_back(&F); 87 } 88 89 // Now add entry nodes for functions reachable via initializers to globals. 90 SmallVector<Constant *, 16> Worklist; 91 SmallPtrSet<Constant *, 16> Visited; 92 for (GlobalVariable &GV : M.globals()) 93 if (GV.hasInitializer()) 94 if (Visited.insert(GV.getInitializer())) 95 Worklist.push_back(GV.getInitializer()); 96 97 DEBUG(dbgs() << " Adding functions referenced by global initializers to the " 98 "entry set.\n"); 99 findCallees(Worklist, Visited, EntryNodes, EntryIndexMap); 100 101 for (auto &Entry : EntryNodes) 102 if (Function *F = Entry.dyn_cast<Function *>()) 103 SCCEntryNodes.insert(F); 104 else 105 SCCEntryNodes.insert(&Entry.get<Node *>()->getFunction()); 106 } 107 108 LazyCallGraph::LazyCallGraph(LazyCallGraph &&G) 109 : BPA(std::move(G.BPA)), NodeMap(std::move(G.NodeMap)), 110 EntryNodes(std::move(G.EntryNodes)), 111 EntryIndexMap(std::move(G.EntryIndexMap)), SCCBPA(std::move(G.SCCBPA)), 112 SCCMap(std::move(G.SCCMap)), LeafSCCs(std::move(G.LeafSCCs)), 113 DFSStack(std::move(G.DFSStack)), 114 SCCEntryNodes(std::move(G.SCCEntryNodes)), 115 NextDFSNumber(G.NextDFSNumber) { 116 updateGraphPtrs(); 117 } 118 119 LazyCallGraph &LazyCallGraph::operator=(LazyCallGraph &&G) { 120 BPA = std::move(G.BPA); 121 NodeMap = std::move(G.NodeMap); 122 EntryNodes = std::move(G.EntryNodes); 123 EntryIndexMap = std::move(G.EntryIndexMap); 124 SCCBPA = std::move(G.SCCBPA); 125 SCCMap = std::move(G.SCCMap); 126 LeafSCCs = std::move(G.LeafSCCs); 127 DFSStack = std::move(G.DFSStack); 128 SCCEntryNodes = std::move(G.SCCEntryNodes); 129 NextDFSNumber = G.NextDFSNumber; 130 updateGraphPtrs(); 131 return *this; 132 } 133 134 void LazyCallGraph::SCC::removeEdge(LazyCallGraph &G, Function &Caller, 135 Function &Callee, SCC &CalleeC) { 136 assert(std::find(G.LeafSCCs.begin(), G.LeafSCCs.end(), this) == 137 G.LeafSCCs.end() && 138 "Cannot have a leaf SCC caller with a different SCC callee."); 139 140 bool HasOtherCallToCalleeC = false; 141 bool HasOtherCallOutsideSCC = false; 142 for (Node *N : *this) { 143 for (Node *Callee : *N) { 144 SCC *OtherCalleeC = G.SCCMap.lookup(&Callee->F); 145 if (OtherCalleeC == &CalleeC) { 146 HasOtherCallToCalleeC = true; 147 break; 148 } 149 if (OtherCalleeC != this) 150 HasOtherCallOutsideSCC = true; 151 } 152 if (HasOtherCallToCalleeC) 153 break; 154 } 155 // Because the SCCs form a DAG, deleting such an edge cannot change the set 156 // of SCCs in the graph. However, it may cut an edge of the SCC DAG, making 157 // the caller no longer a parent of the callee. Walk the other call edges 158 // in the caller to tell. 159 if (!HasOtherCallToCalleeC) { 160 bool Removed = CalleeC.ParentSCCs.remove(this); 161 (void)Removed; 162 assert(Removed && 163 "Did not find the caller SCC in the callee SCC's parent list!"); 164 165 // It may orphan an SCC if it is the last edge reaching it, but that does 166 // not violate any invariants of the graph. 167 if (CalleeC.ParentSCCs.empty()) 168 DEBUG(dbgs() << "LCG: Update removing " << Caller.getName() << " -> " 169 << Callee.getName() << " edge orphaned the callee's SCC!\n"); 170 } 171 172 // It may make the Caller SCC a leaf SCC. 173 if (!HasOtherCallOutsideSCC) 174 G.LeafSCCs.push_back(this); 175 } 176 177 SmallVector<LazyCallGraph::SCC *, 1> 178 LazyCallGraph::SCC::removeInternalEdge(LazyCallGraph &G, Node &Caller, 179 Node &Callee) { 180 // We return a list of the resulting SCCs, where 'this' is always the first 181 // element. 182 SmallVector<SCC *, 1> ResultSCCs; 183 ResultSCCs.push_back(this); 184 185 // We're going to do a full mini-Tarjan's walk using a local stack here. 186 int NextDFSNumber = 1; 187 SmallVector<std::pair<Node *, Node::iterator>, 4> DFSStack; 188 189 // The worklist is every node in the original SCC. FIXME: switch the SCC to 190 // use a SmallSetVector and swap here. 191 SmallSetVector<Node *, 1> Worklist; 192 for (Node *N : Nodes) { 193 // Clear these to 0 while we re-run Tarjan's over the SCC. 194 N->DFSNumber = 0; 195 N->LowLink = 0; 196 Worklist.insert(N); 197 } 198 199 // The callee can already reach every node in this SCC (by definition). It is 200 // the only node we know will stay inside this SCC. Everything which 201 // transitively reaches Callee will also remain in the SCC. To model this we 202 // incrementally add any chain of nodes which reaches something in the new 203 // node set to the new node set. This short circuits one side of the Tarjan's 204 // walk. 205 SmallSetVector<Node *, 1> NewNodes; 206 NewNodes.insert(&Callee); 207 208 for (;;) { 209 if (DFSStack.empty()) { 210 if (Worklist.empty()) 211 break; 212 Node *N = Worklist.pop_back_val(); 213 DFSStack.push_back(std::make_pair(N, N->begin())); 214 } 215 216 Node *N = DFSStack.back().first; 217 218 // Check if we have reached a node in the new (known connected) set. If so, 219 // the entire stack is necessarily in that set and we can re-start. 220 if (NewNodes.count(N)) { 221 DFSStack.pop_back(); 222 while (!DFSStack.empty()) 223 NewNodes.insert(DFSStack.pop_back_val().first); 224 continue; 225 } 226 227 if (N->DFSNumber == 0) { 228 N->LowLink = N->DFSNumber = NextDFSNumber++; 229 Worklist.remove(N); 230 } 231 232 auto SI = DFSStack.rbegin(); 233 bool PushedChildNode = false; 234 do { 235 N = SI->first; 236 for (auto I = SI->second, E = N->end(); I != E; ++I) { 237 Node *ChildN = *I; 238 // If this child isn't currently in this SCC, no need to process it. 239 // However, we do need to remove this SCC from its SCC's parent set. 240 SCC *ChildSCC = G.SCCMap.lookup(&ChildN->F); 241 assert(ChildSCC && 242 "Everything reachable must already be in *some* SCC"); 243 if (ChildSCC != this) { 244 ChildSCC->ParentSCCs.remove(this); 245 continue; 246 } 247 248 if (ChildN->DFSNumber == 0) { 249 // Mark that we should start at this child when next this node is the 250 // top of the stack. We don't start at the next child to ensure this 251 // child's lowlink is reflected. 252 SI->second = I; 253 254 // Recurse onto this node via a tail call. 255 DFSStack.push_back(std::make_pair(ChildN, ChildN->begin())); 256 PushedChildNode = true; 257 break; 258 } 259 260 // Track the lowest link of the childen, if any are still in the stack. 261 // Any child not on the stack will have a LowLink of -1. 262 assert(ChildN->LowLink != 0 && 263 "Impossible with a non-zero DFS number."); 264 if (ChildN->LowLink >= 0 && ChildN->LowLink < N->LowLink) 265 N->LowLink = ChildN->LowLink; 266 } 267 if (!PushedChildNode) 268 // No more children to process for this stack entry. 269 SI->second = N->end(); 270 271 ++SI; 272 // If nothing is new on the stack and this isn't the SCC root, walk 273 // upward. 274 } while (!PushedChildNode && N->LowLink != N->DFSNumber && 275 SI != DFSStack.rend()); 276 277 if (PushedChildNode) 278 continue; 279 280 // Form the new SCC out of the top of the DFS stack. 281 ResultSCCs.push_back(G.formSCCFromDFSStack(DFSStack, SI.base())); 282 } 283 284 // Replace this SCC with the NewNodes we collected above. 285 // FIXME: Simplify this when the SCC's datastructure is just a list. 286 Nodes.clear(); 287 NodeSet.clear(); 288 289 // Now we need to reconnect the current SCC to the graph. 290 bool IsLeafSCC = true; 291 for (Node *N : NewNodes) { 292 N->DFSNumber = -1; 293 N->LowLink = -1; 294 Nodes.push_back(N); 295 NodeSet.insert(&N->getFunction()); 296 for (Node *ChildN : *N) { 297 if (NewNodes.count(ChildN)) 298 continue; 299 SCC *ChildSCC = G.SCCMap.lookup(&ChildN->getFunction()); 300 assert(ChildSCC && 301 "Must have all child SCCs processed when building a new SCC!"); 302 ChildSCC->ParentSCCs.insert(this); 303 IsLeafSCC = false; 304 } 305 } 306 #ifndef NDEBUG 307 if (ResultSCCs.size() > 1) 308 assert(!IsLeafSCC && "This SCC cannot be a leaf as we have split out new " 309 "SCCs by removing this edge."); 310 if (!std::any_of(G.LeafSCCs.begin(), G.LeafSCCs.end(), 311 [&](SCC *C) { return C == this; })) 312 assert(!IsLeafSCC && "This SCC cannot be a leaf as it already had child " 313 "SCCs before we removed this edge."); 314 #endif 315 // If this SCC stopped being a leaf through this edge removal, remove it from 316 // the leaf SCC list. 317 if (!IsLeafSCC && ResultSCCs.size() > 1) 318 G.LeafSCCs.erase(std::remove(G.LeafSCCs.begin(), G.LeafSCCs.end(), this), 319 G.LeafSCCs.end()); 320 321 // Return the new list of SCCs. 322 return ResultSCCs; 323 } 324 325 void LazyCallGraph::removeEdge(Node &CallerN, Function &Callee) { 326 auto IndexMapI = CallerN.CalleeIndexMap.find(&Callee); 327 assert(IndexMapI != CallerN.CalleeIndexMap.end() && 328 "Callee not in the callee set for the caller?"); 329 330 Node *CalleeN = CallerN.Callees[IndexMapI->second].dyn_cast<Node *>(); 331 CallerN.Callees.erase(CallerN.Callees.begin() + IndexMapI->second); 332 CallerN.CalleeIndexMap.erase(IndexMapI); 333 334 SCC *CallerC = SCCMap.lookup(&CallerN.F); 335 if (!CallerC) { 336 // We can only remove edges when the edge isn't actively participating in 337 // a DFS walk. Either it must have been popped into an SCC, or it must not 338 // yet have been reached by the DFS walk. Assert the latter here. 339 assert(std::all_of(DFSStack.begin(), DFSStack.end(), 340 [&](const std::pair<Node *, iterator> &StackEntry) { 341 return StackEntry.first != &CallerN; 342 }) && 343 "Found the caller on the DFSStack!"); 344 return; 345 } 346 347 assert(CalleeN && "If the caller is in an SCC, we have to have explored all " 348 "its transitively called functions."); 349 350 SCC *CalleeC = SCCMap.lookup(&Callee); 351 assert(CalleeC && 352 "The caller has an SCC, and thus by necessity so does the callee."); 353 354 // The easy case is when they are different SCCs. 355 if (CallerC != CalleeC) { 356 CallerC->removeEdge(*this, CallerN.getFunction(), Callee, *CalleeC); 357 return; 358 } 359 360 // The hard case is when we remove an edge within a SCC. This may cause new 361 // SCCs to need to be added to the graph. 362 CallerC->removeInternalEdge(*this, CallerN, *CalleeN); 363 } 364 365 LazyCallGraph::Node *LazyCallGraph::insertInto(Function &F, Node *&MappedN) { 366 return new (MappedN = BPA.Allocate()) Node(*this, F); 367 } 368 369 void LazyCallGraph::updateGraphPtrs() { 370 // Process all nodes updating the graph pointers. 371 SmallVector<Node *, 16> Worklist; 372 for (auto &Entry : EntryNodes) 373 if (Node *EntryN = Entry.dyn_cast<Node *>()) 374 Worklist.push_back(EntryN); 375 376 while (!Worklist.empty()) { 377 Node *N = Worklist.pop_back_val(); 378 N->G = this; 379 for (auto &Callee : N->Callees) 380 if (Node *CalleeN = Callee.dyn_cast<Node *>()) 381 Worklist.push_back(CalleeN); 382 } 383 } 384 385 LazyCallGraph::SCC *LazyCallGraph::formSCCFromDFSStack( 386 SmallVectorImpl<std::pair<Node *, Node::iterator>> &DFSStack, 387 SmallVectorImpl<std::pair<Node *, Node::iterator>>::iterator SCCBegin) { 388 // The tail of the stack is the new SCC. Allocate the SCC and pop the stack 389 // into it. 390 SCC *NewSCC = new (SCCBPA.Allocate()) SCC(); 391 392 for (auto I = SCCBegin, E = DFSStack.end(); I != E; ++I) { 393 Node *SCCN = I->first; 394 assert(SCCN->LowLink >= SCCBegin->first->LowLink && 395 "We cannot have a low link in an SCC lower than its root on the " 396 "stack!"); 397 398 SCCMap[&SCCN->getFunction()] = NewSCC; 399 NewSCC->Nodes.push_back(SCCN); 400 bool Inserted = 401 NewSCC->NodeSet.insert(&SCCN->getFunction()); 402 (void)Inserted; 403 assert(Inserted && "Cannot have duplicates in the DFSStack!"); 404 } 405 DFSStack.erase(SCCBegin, DFSStack.end()); 406 407 // A final pass over all edges in the SCC (this remains linear as we only 408 // do this once when we build the SCC) to connect it to the parent sets of 409 // its children. 410 bool IsLeafSCC = true; 411 for (Node *SCCN : NewSCC->Nodes) 412 for (Node *SCCChildN : *SCCN) { 413 if (NewSCC->NodeSet.count(&SCCChildN->getFunction())) 414 continue; 415 SCC *ChildSCC = SCCMap.lookup(&SCCChildN->getFunction()); 416 assert(ChildSCC && 417 "Must have all child SCCs processed when building a new SCC!"); 418 ChildSCC->ParentSCCs.insert(NewSCC); 419 IsLeafSCC = false; 420 } 421 422 // For the SCCs where we fine no child SCCs, add them to the leaf list. 423 if (IsLeafSCC) 424 LeafSCCs.push_back(NewSCC); 425 426 return NewSCC; 427 } 428 429 LazyCallGraph::SCC *LazyCallGraph::getNextSCCInPostOrder() { 430 // When the stack is empty, there are no more SCCs to walk in this graph. 431 if (DFSStack.empty()) { 432 // If we've handled all candidate entry nodes to the SCC forest, we're done. 433 if (SCCEntryNodes.empty()) 434 return nullptr; 435 436 // Reset the DFS numbering. 437 NextDFSNumber = 1; 438 Node *N = get(*SCCEntryNodes.pop_back_val()); 439 DFSStack.push_back(std::make_pair(N, N->begin())); 440 } 441 442 auto SI = DFSStack.rbegin(); 443 if (SI->first->DFSNumber == 0) { 444 // This node hasn't been visited before, assign it a DFS number and remove 445 // it from the entry set. 446 assert(!SCCMap.count(&SI->first->getFunction()) && 447 "Found a node with 0 DFS number but already in an SCC!"); 448 SI->first->LowLink = SI->first->DFSNumber = NextDFSNumber++; 449 SCCEntryNodes.remove(&SI->first->getFunction()); 450 } 451 452 do { 453 Node *N = SI->first; 454 for (auto I = SI->second, E = N->end(); I != E; ++I) { 455 Node *ChildN = *I; 456 if (ChildN->DFSNumber == 0) { 457 // Mark that we should start at this child when next this node is the 458 // top of the stack. We don't start at the next child to ensure this 459 // child's lowlink is reflected. 460 SI->second = I; 461 462 // Recurse onto this node via a tail call. 463 DFSStack.push_back(std::make_pair(ChildN, ChildN->begin())); 464 return LazyCallGraph::getNextSCCInPostOrder(); 465 } 466 467 // Track the lowest link of the childen, if any are still in the stack. 468 if (ChildN->LowLink < N->LowLink && !SCCMap.count(&ChildN->getFunction())) 469 N->LowLink = ChildN->LowLink; 470 } 471 // No more children to process for this stack entry. 472 SI->second = N->end(); 473 474 if (N->LowLink == N->DFSNumber) 475 // Form the new SCC out of the top of the DFS stack. 476 return formSCCFromDFSStack(DFSStack, std::prev(SI.base())); 477 478 ++SI; 479 } while (SI != DFSStack.rend()); 480 481 llvm_unreachable( 482 "We cannot reach the bottom of the stack without popping an SCC."); 483 } 484 485 char LazyCallGraphAnalysis::PassID; 486 487 LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) : OS(OS) {} 488 489 static void printNodes(raw_ostream &OS, LazyCallGraph::Node &N, 490 SmallPtrSetImpl<LazyCallGraph::Node *> &Printed) { 491 // Recurse depth first through the nodes. 492 for (LazyCallGraph::Node *ChildN : N) 493 if (Printed.insert(ChildN)) 494 printNodes(OS, *ChildN, Printed); 495 496 OS << " Call edges in function: " << N.getFunction().getName() << "\n"; 497 for (LazyCallGraph::iterator I = N.begin(), E = N.end(); I != E; ++I) 498 OS << " -> " << I->getFunction().getName() << "\n"; 499 500 OS << "\n"; 501 } 502 503 static void printSCC(raw_ostream &OS, LazyCallGraph::SCC &SCC) { 504 ptrdiff_t SCCSize = std::distance(SCC.begin(), SCC.end()); 505 OS << " SCC with " << SCCSize << " functions:\n"; 506 507 for (LazyCallGraph::Node *N : SCC) 508 OS << " " << N->getFunction().getName() << "\n"; 509 510 OS << "\n"; 511 } 512 513 PreservedAnalyses LazyCallGraphPrinterPass::run(Module *M, 514 ModuleAnalysisManager *AM) { 515 LazyCallGraph &G = AM->getResult<LazyCallGraphAnalysis>(M); 516 517 OS << "Printing the call graph for module: " << M->getModuleIdentifier() 518 << "\n\n"; 519 520 SmallPtrSet<LazyCallGraph::Node *, 16> Printed; 521 for (LazyCallGraph::Node *N : G) 522 if (Printed.insert(N)) 523 printNodes(OS, *N, Printed); 524 525 for (LazyCallGraph::SCC *SCC : G.postorder_sccs()) 526 printSCC(OS, *SCC); 527 528 return PreservedAnalyses::all(); 529 530 } 531