1 //===- FunctionAttrs.cpp - Pass which marks functions attributes ----------===// 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 /// \file 11 /// This file implements interprocedural passes which walk the 12 /// call-graph deducing and/or propagating function attributes. 13 /// 14 //===----------------------------------------------------------------------===// 15 16 #include "llvm/Transforms/IPO/FunctionAttrs.h" 17 #include "llvm/Transforms/IPO.h" 18 #include "llvm/ADT/SCCIterator.h" 19 #include "llvm/ADT/SetVector.h" 20 #include "llvm/ADT/SmallSet.h" 21 #include "llvm/ADT/Statistic.h" 22 #include "llvm/ADT/StringSwitch.h" 23 #include "llvm/Analysis/AliasAnalysis.h" 24 #include "llvm/Analysis/AssumptionCache.h" 25 #include "llvm/Analysis/BasicAliasAnalysis.h" 26 #include "llvm/Analysis/CallGraph.h" 27 #include "llvm/Analysis/CallGraphSCCPass.h" 28 #include "llvm/Analysis/CaptureTracking.h" 29 #include "llvm/Analysis/TargetLibraryInfo.h" 30 #include "llvm/Analysis/ValueTracking.h" 31 #include "llvm/IR/GlobalVariable.h" 32 #include "llvm/IR/InstIterator.h" 33 #include "llvm/IR/IntrinsicInst.h" 34 #include "llvm/IR/LLVMContext.h" 35 #include "llvm/Support/Debug.h" 36 #include "llvm/Support/raw_ostream.h" 37 #include "llvm/Analysis/TargetLibraryInfo.h" 38 using namespace llvm; 39 40 #define DEBUG_TYPE "functionattrs" 41 42 STATISTIC(NumReadNone, "Number of functions marked readnone"); 43 STATISTIC(NumReadOnly, "Number of functions marked readonly"); 44 STATISTIC(NumNoCapture, "Number of arguments marked nocapture"); 45 STATISTIC(NumReturned, "Number of arguments marked returned"); 46 STATISTIC(NumReadNoneArg, "Number of arguments marked readnone"); 47 STATISTIC(NumReadOnlyArg, "Number of arguments marked readonly"); 48 STATISTIC(NumNoAlias, "Number of function returns marked noalias"); 49 STATISTIC(NumNonNullReturn, "Number of function returns marked nonnull"); 50 STATISTIC(NumNoRecurse, "Number of functions marked as norecurse"); 51 52 namespace { 53 typedef SmallSetVector<Function *, 8> SCCNodeSet; 54 } 55 56 namespace { 57 /// The three kinds of memory access relevant to 'readonly' and 58 /// 'readnone' attributes. 59 enum MemoryAccessKind { 60 MAK_ReadNone = 0, 61 MAK_ReadOnly = 1, 62 MAK_MayWrite = 2 63 }; 64 } 65 66 static MemoryAccessKind checkFunctionMemoryAccess(Function &F, AAResults &AAR, 67 const SCCNodeSet &SCCNodes) { 68 FunctionModRefBehavior MRB = AAR.getModRefBehavior(&F); 69 if (MRB == FMRB_DoesNotAccessMemory) 70 // Already perfect! 71 return MAK_ReadNone; 72 73 // Non-exact function definitions may not be selected at link time, and an 74 // alternative version that writes to memory may be selected. See the comment 75 // on GlobalValue::isDefinitionExact for more details. 76 if (!F.hasExactDefinition()) { 77 if (AliasAnalysis::onlyReadsMemory(MRB)) 78 return MAK_ReadOnly; 79 80 // Conservatively assume it writes to memory. 81 return MAK_MayWrite; 82 } 83 84 // Scan the function body for instructions that may read or write memory. 85 bool ReadsMemory = false; 86 for (inst_iterator II = inst_begin(F), E = inst_end(F); II != E; ++II) { 87 Instruction *I = &*II; 88 89 // Some instructions can be ignored even if they read or write memory. 90 // Detect these now, skipping to the next instruction if one is found. 91 CallSite CS(cast<Value>(I)); 92 if (CS) { 93 // Ignore calls to functions in the same SCC, as long as the call sites 94 // don't have operand bundles. Calls with operand bundles are allowed to 95 // have memory effects not described by the memory effects of the call 96 // target. 97 if (!CS.hasOperandBundles() && CS.getCalledFunction() && 98 SCCNodes.count(CS.getCalledFunction())) 99 continue; 100 FunctionModRefBehavior MRB = AAR.getModRefBehavior(CS); 101 102 // If the call doesn't access memory, we're done. 103 if (!(MRB & MRI_ModRef)) 104 continue; 105 106 if (!AliasAnalysis::onlyAccessesArgPointees(MRB)) { 107 // The call could access any memory. If that includes writes, give up. 108 if (MRB & MRI_Mod) 109 return MAK_MayWrite; 110 // If it reads, note it. 111 if (MRB & MRI_Ref) 112 ReadsMemory = true; 113 continue; 114 } 115 116 // Check whether all pointer arguments point to local memory, and 117 // ignore calls that only access local memory. 118 for (CallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end(); 119 CI != CE; ++CI) { 120 Value *Arg = *CI; 121 if (!Arg->getType()->isPtrOrPtrVectorTy()) 122 continue; 123 124 AAMDNodes AAInfo; 125 I->getAAMetadata(AAInfo); 126 MemoryLocation Loc(Arg, MemoryLocation::UnknownSize, AAInfo); 127 128 // Skip accesses to local or constant memory as they don't impact the 129 // externally visible mod/ref behavior. 130 if (AAR.pointsToConstantMemory(Loc, /*OrLocal=*/true)) 131 continue; 132 133 if (MRB & MRI_Mod) 134 // Writes non-local memory. Give up. 135 return MAK_MayWrite; 136 if (MRB & MRI_Ref) 137 // Ok, it reads non-local memory. 138 ReadsMemory = true; 139 } 140 continue; 141 } else if (LoadInst *LI = dyn_cast<LoadInst>(I)) { 142 // Ignore non-volatile loads from local memory. (Atomic is okay here.) 143 if (!LI->isVolatile()) { 144 MemoryLocation Loc = MemoryLocation::get(LI); 145 if (AAR.pointsToConstantMemory(Loc, /*OrLocal=*/true)) 146 continue; 147 } 148 } else if (StoreInst *SI = dyn_cast<StoreInst>(I)) { 149 // Ignore non-volatile stores to local memory. (Atomic is okay here.) 150 if (!SI->isVolatile()) { 151 MemoryLocation Loc = MemoryLocation::get(SI); 152 if (AAR.pointsToConstantMemory(Loc, /*OrLocal=*/true)) 153 continue; 154 } 155 } else if (VAArgInst *VI = dyn_cast<VAArgInst>(I)) { 156 // Ignore vaargs on local memory. 157 MemoryLocation Loc = MemoryLocation::get(VI); 158 if (AAR.pointsToConstantMemory(Loc, /*OrLocal=*/true)) 159 continue; 160 } 161 162 // Any remaining instructions need to be taken seriously! Check if they 163 // read or write memory. 164 if (I->mayWriteToMemory()) 165 // Writes memory. Just give up. 166 return MAK_MayWrite; 167 168 // If this instruction may read memory, remember that. 169 ReadsMemory |= I->mayReadFromMemory(); 170 } 171 172 return ReadsMemory ? MAK_ReadOnly : MAK_ReadNone; 173 } 174 175 /// Deduce readonly/readnone attributes for the SCC. 176 template <typename AARGetterT> 177 static bool addReadAttrs(const SCCNodeSet &SCCNodes, AARGetterT AARGetter) { 178 // Check if any of the functions in the SCC read or write memory. If they 179 // write memory then they can't be marked readnone or readonly. 180 bool ReadsMemory = false; 181 for (Function *F : SCCNodes) { 182 // Call the callable parameter to look up AA results for this function. 183 AAResults &AAR = AARGetter(*F); 184 185 switch (checkFunctionMemoryAccess(*F, AAR, SCCNodes)) { 186 case MAK_MayWrite: 187 return false; 188 case MAK_ReadOnly: 189 ReadsMemory = true; 190 break; 191 case MAK_ReadNone: 192 // Nothing to do! 193 break; 194 } 195 } 196 197 // Success! Functions in this SCC do not access memory, or only read memory. 198 // Give them the appropriate attribute. 199 bool MadeChange = false; 200 for (Function *F : SCCNodes) { 201 if (F->doesNotAccessMemory()) 202 // Already perfect! 203 continue; 204 205 if (F->onlyReadsMemory() && ReadsMemory) 206 // No change. 207 continue; 208 209 MadeChange = true; 210 211 // Clear out any existing attributes. 212 AttrBuilder B; 213 B.addAttribute(Attribute::ReadOnly).addAttribute(Attribute::ReadNone); 214 F->removeAttributes( 215 AttributeSet::FunctionIndex, 216 AttributeSet::get(F->getContext(), AttributeSet::FunctionIndex, B)); 217 218 // Add in the new attribute. 219 F->addAttribute(AttributeSet::FunctionIndex, 220 ReadsMemory ? Attribute::ReadOnly : Attribute::ReadNone); 221 222 if (ReadsMemory) 223 ++NumReadOnly; 224 else 225 ++NumReadNone; 226 } 227 228 return MadeChange; 229 } 230 231 namespace { 232 /// For a given pointer Argument, this retains a list of Arguments of functions 233 /// in the same SCC that the pointer data flows into. We use this to build an 234 /// SCC of the arguments. 235 struct ArgumentGraphNode { 236 Argument *Definition; 237 SmallVector<ArgumentGraphNode *, 4> Uses; 238 }; 239 240 class ArgumentGraph { 241 // We store pointers to ArgumentGraphNode objects, so it's important that 242 // that they not move around upon insert. 243 typedef std::map<Argument *, ArgumentGraphNode> ArgumentMapTy; 244 245 ArgumentMapTy ArgumentMap; 246 247 // There is no root node for the argument graph, in fact: 248 // void f(int *x, int *y) { if (...) f(x, y); } 249 // is an example where the graph is disconnected. The SCCIterator requires a 250 // single entry point, so we maintain a fake ("synthetic") root node that 251 // uses every node. Because the graph is directed and nothing points into 252 // the root, it will not participate in any SCCs (except for its own). 253 ArgumentGraphNode SyntheticRoot; 254 255 public: 256 ArgumentGraph() { SyntheticRoot.Definition = nullptr; } 257 258 typedef SmallVectorImpl<ArgumentGraphNode *>::iterator iterator; 259 260 iterator begin() { return SyntheticRoot.Uses.begin(); } 261 iterator end() { return SyntheticRoot.Uses.end(); } 262 ArgumentGraphNode *getEntryNode() { return &SyntheticRoot; } 263 264 ArgumentGraphNode *operator[](Argument *A) { 265 ArgumentGraphNode &Node = ArgumentMap[A]; 266 Node.Definition = A; 267 SyntheticRoot.Uses.push_back(&Node); 268 return &Node; 269 } 270 }; 271 272 /// This tracker checks whether callees are in the SCC, and if so it does not 273 /// consider that a capture, instead adding it to the "Uses" list and 274 /// continuing with the analysis. 275 struct ArgumentUsesTracker : public CaptureTracker { 276 ArgumentUsesTracker(const SCCNodeSet &SCCNodes) 277 : Captured(false), SCCNodes(SCCNodes) {} 278 279 void tooManyUses() override { Captured = true; } 280 281 bool captured(const Use *U) override { 282 CallSite CS(U->getUser()); 283 if (!CS.getInstruction()) { 284 Captured = true; 285 return true; 286 } 287 288 Function *F = CS.getCalledFunction(); 289 if (!F || !F->hasExactDefinition() || !SCCNodes.count(F)) { 290 Captured = true; 291 return true; 292 } 293 294 // Note: the callee and the two successor blocks *follow* the argument 295 // operands. This means there is no need to adjust UseIndex to account for 296 // these. 297 298 unsigned UseIndex = 299 std::distance(const_cast<const Use *>(CS.arg_begin()), U); 300 301 assert(UseIndex < CS.data_operands_size() && 302 "Indirect function calls should have been filtered above!"); 303 304 if (UseIndex >= CS.getNumArgOperands()) { 305 // Data operand, but not a argument operand -- must be a bundle operand 306 assert(CS.hasOperandBundles() && "Must be!"); 307 308 // CaptureTracking told us that we're being captured by an operand bundle 309 // use. In this case it does not matter if the callee is within our SCC 310 // or not -- we've been captured in some unknown way, and we have to be 311 // conservative. 312 Captured = true; 313 return true; 314 } 315 316 if (UseIndex >= F->arg_size()) { 317 assert(F->isVarArg() && "More params than args in non-varargs call"); 318 Captured = true; 319 return true; 320 } 321 322 Uses.push_back(&*std::next(F->arg_begin(), UseIndex)); 323 return false; 324 } 325 326 bool Captured; // True only if certainly captured (used outside our SCC). 327 SmallVector<Argument *, 4> Uses; // Uses within our SCC. 328 329 const SCCNodeSet &SCCNodes; 330 }; 331 } 332 333 namespace llvm { 334 template <> struct GraphTraits<ArgumentGraphNode *> { 335 typedef ArgumentGraphNode *NodeRef; 336 typedef SmallVectorImpl<ArgumentGraphNode *>::iterator ChildIteratorType; 337 338 static inline NodeRef getEntryNode(NodeRef A) { return A; } 339 static inline ChildIteratorType child_begin(NodeRef N) { 340 return N->Uses.begin(); 341 } 342 static inline ChildIteratorType child_end(NodeRef N) { return N->Uses.end(); } 343 }; 344 template <> 345 struct GraphTraits<ArgumentGraph *> : public GraphTraits<ArgumentGraphNode *> { 346 static NodeRef getEntryNode(ArgumentGraph *AG) { return AG->getEntryNode(); } 347 static ChildIteratorType nodes_begin(ArgumentGraph *AG) { 348 return AG->begin(); 349 } 350 static ChildIteratorType nodes_end(ArgumentGraph *AG) { return AG->end(); } 351 }; 352 } 353 354 /// Returns Attribute::None, Attribute::ReadOnly or Attribute::ReadNone. 355 static Attribute::AttrKind 356 determinePointerReadAttrs(Argument *A, 357 const SmallPtrSet<Argument *, 8> &SCCNodes) { 358 359 SmallVector<Use *, 32> Worklist; 360 SmallSet<Use *, 32> Visited; 361 362 // inalloca arguments are always clobbered by the call. 363 if (A->hasInAllocaAttr()) 364 return Attribute::None; 365 366 bool IsRead = false; 367 // We don't need to track IsWritten. If A is written to, return immediately. 368 369 for (Use &U : A->uses()) { 370 Visited.insert(&U); 371 Worklist.push_back(&U); 372 } 373 374 while (!Worklist.empty()) { 375 Use *U = Worklist.pop_back_val(); 376 Instruction *I = cast<Instruction>(U->getUser()); 377 378 switch (I->getOpcode()) { 379 case Instruction::BitCast: 380 case Instruction::GetElementPtr: 381 case Instruction::PHI: 382 case Instruction::Select: 383 case Instruction::AddrSpaceCast: 384 // The original value is not read/written via this if the new value isn't. 385 for (Use &UU : I->uses()) 386 if (Visited.insert(&UU).second) 387 Worklist.push_back(&UU); 388 break; 389 390 case Instruction::Call: 391 case Instruction::Invoke: { 392 bool Captures = true; 393 394 if (I->getType()->isVoidTy()) 395 Captures = false; 396 397 auto AddUsersToWorklistIfCapturing = [&] { 398 if (Captures) 399 for (Use &UU : I->uses()) 400 if (Visited.insert(&UU).second) 401 Worklist.push_back(&UU); 402 }; 403 404 CallSite CS(I); 405 if (CS.doesNotAccessMemory()) { 406 AddUsersToWorklistIfCapturing(); 407 continue; 408 } 409 410 Function *F = CS.getCalledFunction(); 411 if (!F) { 412 if (CS.onlyReadsMemory()) { 413 IsRead = true; 414 AddUsersToWorklistIfCapturing(); 415 continue; 416 } 417 return Attribute::None; 418 } 419 420 // Note: the callee and the two successor blocks *follow* the argument 421 // operands. This means there is no need to adjust UseIndex to account 422 // for these. 423 424 unsigned UseIndex = std::distance(CS.arg_begin(), U); 425 426 // U cannot be the callee operand use: since we're exploring the 427 // transitive uses of an Argument, having such a use be a callee would 428 // imply the CallSite is an indirect call or invoke; and we'd take the 429 // early exit above. 430 assert(UseIndex < CS.data_operands_size() && 431 "Data operand use expected!"); 432 433 bool IsOperandBundleUse = UseIndex >= CS.getNumArgOperands(); 434 435 if (UseIndex >= F->arg_size() && !IsOperandBundleUse) { 436 assert(F->isVarArg() && "More params than args in non-varargs call"); 437 return Attribute::None; 438 } 439 440 Captures &= !CS.doesNotCapture(UseIndex); 441 442 // Since the optimizer (by design) cannot see the data flow corresponding 443 // to a operand bundle use, these cannot participate in the optimistic SCC 444 // analysis. Instead, we model the operand bundle uses as arguments in 445 // call to a function external to the SCC. 446 if (IsOperandBundleUse || 447 !SCCNodes.count(&*std::next(F->arg_begin(), UseIndex))) { 448 449 // The accessors used on CallSite here do the right thing for calls and 450 // invokes with operand bundles. 451 452 if (!CS.onlyReadsMemory() && !CS.onlyReadsMemory(UseIndex)) 453 return Attribute::None; 454 if (!CS.doesNotAccessMemory(UseIndex)) 455 IsRead = true; 456 } 457 458 AddUsersToWorklistIfCapturing(); 459 break; 460 } 461 462 case Instruction::Load: 463 // A volatile load has side effects beyond what readonly can be relied 464 // upon. 465 if (cast<LoadInst>(I)->isVolatile()) 466 return Attribute::None; 467 468 IsRead = true; 469 break; 470 471 case Instruction::ICmp: 472 case Instruction::Ret: 473 break; 474 475 default: 476 return Attribute::None; 477 } 478 } 479 480 return IsRead ? Attribute::ReadOnly : Attribute::ReadNone; 481 } 482 483 /// Deduce returned attributes for the SCC. 484 static bool addArgumentReturnedAttrs(const SCCNodeSet &SCCNodes) { 485 bool Changed = false; 486 487 AttrBuilder B; 488 B.addAttribute(Attribute::Returned); 489 490 // Check each function in turn, determining if an argument is always returned. 491 for (Function *F : SCCNodes) { 492 // We can infer and propagate function attributes only when we know that the 493 // definition we'll get at link time is *exactly* the definition we see now. 494 // For more details, see GlobalValue::mayBeDerefined. 495 if (!F->hasExactDefinition()) 496 continue; 497 498 if (F->getReturnType()->isVoidTy()) 499 continue; 500 501 auto FindRetArg = [&]() -> Value * { 502 Value *RetArg = nullptr; 503 for (BasicBlock &BB : *F) 504 if (auto *Ret = dyn_cast<ReturnInst>(BB.getTerminator())) { 505 // Note that stripPointerCasts should look through functions with 506 // returned arguments. 507 Value *RetVal = Ret->getReturnValue()->stripPointerCasts(); 508 if (!isa<Argument>(RetVal) || RetVal->getType() != F->getReturnType()) 509 return nullptr; 510 511 if (!RetArg) 512 RetArg = RetVal; 513 else if (RetArg != RetVal) 514 return nullptr; 515 } 516 517 return RetArg; 518 }; 519 520 if (Value *RetArg = FindRetArg()) { 521 auto *A = cast<Argument>(RetArg); 522 A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo() + 1, B)); 523 ++NumReturned; 524 Changed = true; 525 } 526 } 527 528 return Changed; 529 } 530 531 /// Deduce nocapture attributes for the SCC. 532 static bool addArgumentAttrs(const SCCNodeSet &SCCNodes) { 533 bool Changed = false; 534 535 ArgumentGraph AG; 536 537 AttrBuilder B; 538 B.addAttribute(Attribute::NoCapture); 539 540 // Check each function in turn, determining which pointer arguments are not 541 // captured. 542 for (Function *F : SCCNodes) { 543 // We can infer and propagate function attributes only when we know that the 544 // definition we'll get at link time is *exactly* the definition we see now. 545 // For more details, see GlobalValue::mayBeDerefined. 546 if (!F->hasExactDefinition()) 547 continue; 548 549 // Functions that are readonly (or readnone) and nounwind and don't return 550 // a value can't capture arguments. Don't analyze them. 551 if (F->onlyReadsMemory() && F->doesNotThrow() && 552 F->getReturnType()->isVoidTy()) { 553 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E; 554 ++A) { 555 if (A->getType()->isPointerTy() && !A->hasNoCaptureAttr()) { 556 A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo() + 1, B)); 557 ++NumNoCapture; 558 Changed = true; 559 } 560 } 561 continue; 562 } 563 564 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E; 565 ++A) { 566 if (!A->getType()->isPointerTy()) 567 continue; 568 bool HasNonLocalUses = false; 569 if (!A->hasNoCaptureAttr()) { 570 ArgumentUsesTracker Tracker(SCCNodes); 571 PointerMayBeCaptured(&*A, &Tracker); 572 if (!Tracker.Captured) { 573 if (Tracker.Uses.empty()) { 574 // If it's trivially not captured, mark it nocapture now. 575 A->addAttr( 576 AttributeSet::get(F->getContext(), A->getArgNo() + 1, B)); 577 ++NumNoCapture; 578 Changed = true; 579 } else { 580 // If it's not trivially captured and not trivially not captured, 581 // then it must be calling into another function in our SCC. Save 582 // its particulars for Argument-SCC analysis later. 583 ArgumentGraphNode *Node = AG[&*A]; 584 for (Argument *Use : Tracker.Uses) { 585 Node->Uses.push_back(AG[Use]); 586 if (Use != &*A) 587 HasNonLocalUses = true; 588 } 589 } 590 } 591 // Otherwise, it's captured. Don't bother doing SCC analysis on it. 592 } 593 if (!HasNonLocalUses && !A->onlyReadsMemory()) { 594 // Can we determine that it's readonly/readnone without doing an SCC? 595 // Note that we don't allow any calls at all here, or else our result 596 // will be dependent on the iteration order through the functions in the 597 // SCC. 598 SmallPtrSet<Argument *, 8> Self; 599 Self.insert(&*A); 600 Attribute::AttrKind R = determinePointerReadAttrs(&*A, Self); 601 if (R != Attribute::None) { 602 AttrBuilder B; 603 B.addAttribute(R); 604 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 605 Changed = true; 606 R == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg; 607 } 608 } 609 } 610 } 611 612 // The graph we've collected is partial because we stopped scanning for 613 // argument uses once we solved the argument trivially. These partial nodes 614 // show up as ArgumentGraphNode objects with an empty Uses list, and for 615 // these nodes the final decision about whether they capture has already been 616 // made. If the definition doesn't have a 'nocapture' attribute by now, it 617 // captures. 618 619 for (scc_iterator<ArgumentGraph *> I = scc_begin(&AG); !I.isAtEnd(); ++I) { 620 const std::vector<ArgumentGraphNode *> &ArgumentSCC = *I; 621 if (ArgumentSCC.size() == 1) { 622 if (!ArgumentSCC[0]->Definition) 623 continue; // synthetic root node 624 625 // eg. "void f(int* x) { if (...) f(x); }" 626 if (ArgumentSCC[0]->Uses.size() == 1 && 627 ArgumentSCC[0]->Uses[0] == ArgumentSCC[0]) { 628 Argument *A = ArgumentSCC[0]->Definition; 629 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 630 ++NumNoCapture; 631 Changed = true; 632 } 633 continue; 634 } 635 636 bool SCCCaptured = false; 637 for (auto I = ArgumentSCC.begin(), E = ArgumentSCC.end(); 638 I != E && !SCCCaptured; ++I) { 639 ArgumentGraphNode *Node = *I; 640 if (Node->Uses.empty()) { 641 if (!Node->Definition->hasNoCaptureAttr()) 642 SCCCaptured = true; 643 } 644 } 645 if (SCCCaptured) 646 continue; 647 648 SmallPtrSet<Argument *, 8> ArgumentSCCNodes; 649 // Fill ArgumentSCCNodes with the elements of the ArgumentSCC. Used for 650 // quickly looking up whether a given Argument is in this ArgumentSCC. 651 for (ArgumentGraphNode *I : ArgumentSCC) { 652 ArgumentSCCNodes.insert(I->Definition); 653 } 654 655 for (auto I = ArgumentSCC.begin(), E = ArgumentSCC.end(); 656 I != E && !SCCCaptured; ++I) { 657 ArgumentGraphNode *N = *I; 658 for (ArgumentGraphNode *Use : N->Uses) { 659 Argument *A = Use->Definition; 660 if (A->hasNoCaptureAttr() || ArgumentSCCNodes.count(A)) 661 continue; 662 SCCCaptured = true; 663 break; 664 } 665 } 666 if (SCCCaptured) 667 continue; 668 669 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) { 670 Argument *A = ArgumentSCC[i]->Definition; 671 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 672 ++NumNoCapture; 673 Changed = true; 674 } 675 676 // We also want to compute readonly/readnone. With a small number of false 677 // negatives, we can assume that any pointer which is captured isn't going 678 // to be provably readonly or readnone, since by definition we can't 679 // analyze all uses of a captured pointer. 680 // 681 // The false negatives happen when the pointer is captured by a function 682 // that promises readonly/readnone behaviour on the pointer, then the 683 // pointer's lifetime ends before anything that writes to arbitrary memory. 684 // Also, a readonly/readnone pointer may be returned, but returning a 685 // pointer is capturing it. 686 687 Attribute::AttrKind ReadAttr = Attribute::ReadNone; 688 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) { 689 Argument *A = ArgumentSCC[i]->Definition; 690 Attribute::AttrKind K = determinePointerReadAttrs(A, ArgumentSCCNodes); 691 if (K == Attribute::ReadNone) 692 continue; 693 if (K == Attribute::ReadOnly) { 694 ReadAttr = Attribute::ReadOnly; 695 continue; 696 } 697 ReadAttr = K; 698 break; 699 } 700 701 if (ReadAttr != Attribute::None) { 702 AttrBuilder B, R; 703 B.addAttribute(ReadAttr); 704 R.addAttribute(Attribute::ReadOnly).addAttribute(Attribute::ReadNone); 705 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) { 706 Argument *A = ArgumentSCC[i]->Definition; 707 // Clear out existing readonly/readnone attributes 708 A->removeAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, R)); 709 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 710 ReadAttr == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg; 711 Changed = true; 712 } 713 } 714 } 715 716 return Changed; 717 } 718 719 /// Tests whether a function is "malloc-like". 720 /// 721 /// A function is "malloc-like" if it returns either null or a pointer that 722 /// doesn't alias any other pointer visible to the caller. 723 static bool isFunctionMallocLike(Function *F, const SCCNodeSet &SCCNodes) { 724 SmallSetVector<Value *, 8> FlowsToReturn; 725 for (BasicBlock &BB : *F) 726 if (ReturnInst *Ret = dyn_cast<ReturnInst>(BB.getTerminator())) 727 FlowsToReturn.insert(Ret->getReturnValue()); 728 729 for (unsigned i = 0; i != FlowsToReturn.size(); ++i) { 730 Value *RetVal = FlowsToReturn[i]; 731 732 if (Constant *C = dyn_cast<Constant>(RetVal)) { 733 if (!C->isNullValue() && !isa<UndefValue>(C)) 734 return false; 735 736 continue; 737 } 738 739 if (isa<Argument>(RetVal)) 740 return false; 741 742 if (Instruction *RVI = dyn_cast<Instruction>(RetVal)) 743 switch (RVI->getOpcode()) { 744 // Extend the analysis by looking upwards. 745 case Instruction::BitCast: 746 case Instruction::GetElementPtr: 747 case Instruction::AddrSpaceCast: 748 FlowsToReturn.insert(RVI->getOperand(0)); 749 continue; 750 case Instruction::Select: { 751 SelectInst *SI = cast<SelectInst>(RVI); 752 FlowsToReturn.insert(SI->getTrueValue()); 753 FlowsToReturn.insert(SI->getFalseValue()); 754 continue; 755 } 756 case Instruction::PHI: { 757 PHINode *PN = cast<PHINode>(RVI); 758 for (Value *IncValue : PN->incoming_values()) 759 FlowsToReturn.insert(IncValue); 760 continue; 761 } 762 763 // Check whether the pointer came from an allocation. 764 case Instruction::Alloca: 765 break; 766 case Instruction::Call: 767 case Instruction::Invoke: { 768 CallSite CS(RVI); 769 if (CS.paramHasAttr(0, Attribute::NoAlias)) 770 break; 771 if (CS.getCalledFunction() && SCCNodes.count(CS.getCalledFunction())) 772 break; 773 LLVM_FALLTHROUGH; 774 } 775 default: 776 return false; // Did not come from an allocation. 777 } 778 779 if (PointerMayBeCaptured(RetVal, false, /*StoreCaptures=*/false)) 780 return false; 781 } 782 783 return true; 784 } 785 786 /// Deduce noalias attributes for the SCC. 787 static bool addNoAliasAttrs(const SCCNodeSet &SCCNodes) { 788 // Check each function in turn, determining which functions return noalias 789 // pointers. 790 for (Function *F : SCCNodes) { 791 // Already noalias. 792 if (F->doesNotAlias(0)) 793 continue; 794 795 // We can infer and propagate function attributes only when we know that the 796 // definition we'll get at link time is *exactly* the definition we see now. 797 // For more details, see GlobalValue::mayBeDerefined. 798 if (!F->hasExactDefinition()) 799 return false; 800 801 // We annotate noalias return values, which are only applicable to 802 // pointer types. 803 if (!F->getReturnType()->isPointerTy()) 804 continue; 805 806 if (!isFunctionMallocLike(F, SCCNodes)) 807 return false; 808 } 809 810 bool MadeChange = false; 811 for (Function *F : SCCNodes) { 812 if (F->doesNotAlias(0) || !F->getReturnType()->isPointerTy()) 813 continue; 814 815 F->setDoesNotAlias(0); 816 ++NumNoAlias; 817 MadeChange = true; 818 } 819 820 return MadeChange; 821 } 822 823 /// Tests whether this function is known to not return null. 824 /// 825 /// Requires that the function returns a pointer. 826 /// 827 /// Returns true if it believes the function will not return a null, and sets 828 /// \p Speculative based on whether the returned conclusion is a speculative 829 /// conclusion due to SCC calls. 830 static bool isReturnNonNull(Function *F, const SCCNodeSet &SCCNodes, 831 bool &Speculative) { 832 assert(F->getReturnType()->isPointerTy() && 833 "nonnull only meaningful on pointer types"); 834 Speculative = false; 835 836 SmallSetVector<Value *, 8> FlowsToReturn; 837 for (BasicBlock &BB : *F) 838 if (auto *Ret = dyn_cast<ReturnInst>(BB.getTerminator())) 839 FlowsToReturn.insert(Ret->getReturnValue()); 840 841 for (unsigned i = 0; i != FlowsToReturn.size(); ++i) { 842 Value *RetVal = FlowsToReturn[i]; 843 844 // If this value is locally known to be non-null, we're good 845 if (isKnownNonNull(RetVal)) 846 continue; 847 848 // Otherwise, we need to look upwards since we can't make any local 849 // conclusions. 850 Instruction *RVI = dyn_cast<Instruction>(RetVal); 851 if (!RVI) 852 return false; 853 switch (RVI->getOpcode()) { 854 // Extend the analysis by looking upwards. 855 case Instruction::BitCast: 856 case Instruction::GetElementPtr: 857 case Instruction::AddrSpaceCast: 858 FlowsToReturn.insert(RVI->getOperand(0)); 859 continue; 860 case Instruction::Select: { 861 SelectInst *SI = cast<SelectInst>(RVI); 862 FlowsToReturn.insert(SI->getTrueValue()); 863 FlowsToReturn.insert(SI->getFalseValue()); 864 continue; 865 } 866 case Instruction::PHI: { 867 PHINode *PN = cast<PHINode>(RVI); 868 for (int i = 0, e = PN->getNumIncomingValues(); i != e; ++i) 869 FlowsToReturn.insert(PN->getIncomingValue(i)); 870 continue; 871 } 872 case Instruction::Call: 873 case Instruction::Invoke: { 874 CallSite CS(RVI); 875 Function *Callee = CS.getCalledFunction(); 876 // A call to a node within the SCC is assumed to return null until 877 // proven otherwise 878 if (Callee && SCCNodes.count(Callee)) { 879 Speculative = true; 880 continue; 881 } 882 return false; 883 } 884 default: 885 return false; // Unknown source, may be null 886 }; 887 llvm_unreachable("should have either continued or returned"); 888 } 889 890 return true; 891 } 892 893 /// Deduce nonnull attributes for the SCC. 894 static bool addNonNullAttrs(const SCCNodeSet &SCCNodes) { 895 // Speculative that all functions in the SCC return only nonnull 896 // pointers. We may refute this as we analyze functions. 897 bool SCCReturnsNonNull = true; 898 899 bool MadeChange = false; 900 901 // Check each function in turn, determining which functions return nonnull 902 // pointers. 903 for (Function *F : SCCNodes) { 904 // Already nonnull. 905 if (F->getAttributes().hasAttribute(AttributeSet::ReturnIndex, 906 Attribute::NonNull)) 907 continue; 908 909 // We can infer and propagate function attributes only when we know that the 910 // definition we'll get at link time is *exactly* the definition we see now. 911 // For more details, see GlobalValue::mayBeDerefined. 912 if (!F->hasExactDefinition()) 913 return false; 914 915 // We annotate nonnull return values, which are only applicable to 916 // pointer types. 917 if (!F->getReturnType()->isPointerTy()) 918 continue; 919 920 bool Speculative = false; 921 if (isReturnNonNull(F, SCCNodes, Speculative)) { 922 if (!Speculative) { 923 // Mark the function eagerly since we may discover a function 924 // which prevents us from speculating about the entire SCC 925 DEBUG(dbgs() << "Eagerly marking " << F->getName() << " as nonnull\n"); 926 F->addAttribute(AttributeSet::ReturnIndex, Attribute::NonNull); 927 ++NumNonNullReturn; 928 MadeChange = true; 929 } 930 continue; 931 } 932 // At least one function returns something which could be null, can't 933 // speculate any more. 934 SCCReturnsNonNull = false; 935 } 936 937 if (SCCReturnsNonNull) { 938 for (Function *F : SCCNodes) { 939 if (F->getAttributes().hasAttribute(AttributeSet::ReturnIndex, 940 Attribute::NonNull) || 941 !F->getReturnType()->isPointerTy()) 942 continue; 943 944 DEBUG(dbgs() << "SCC marking " << F->getName() << " as nonnull\n"); 945 F->addAttribute(AttributeSet::ReturnIndex, Attribute::NonNull); 946 ++NumNonNullReturn; 947 MadeChange = true; 948 } 949 } 950 951 return MadeChange; 952 } 953 954 /// Remove the convergent attribute from all functions in the SCC if every 955 /// callsite within the SCC is not convergent (except for calls to functions 956 /// within the SCC). Returns true if changes were made. 957 static bool removeConvergentAttrs(const SCCNodeSet &SCCNodes) { 958 // For every function in SCC, ensure that either 959 // * it is not convergent, or 960 // * we can remove its convergent attribute. 961 bool HasConvergentFn = false; 962 for (Function *F : SCCNodes) { 963 if (!F->isConvergent()) continue; 964 HasConvergentFn = true; 965 966 // Can't remove convergent from function declarations. 967 if (F->isDeclaration()) return false; 968 969 // Can't remove convergent if any of our functions has a convergent call to a 970 // function not in the SCC. 971 for (Instruction &I : instructions(*F)) { 972 CallSite CS(&I); 973 // Bail if CS is a convergent call to a function not in the SCC. 974 if (CS && CS.isConvergent() && 975 SCCNodes.count(CS.getCalledFunction()) == 0) 976 return false; 977 } 978 } 979 980 // If the SCC doesn't have any convergent functions, we have nothing to do. 981 if (!HasConvergentFn) return false; 982 983 // If we got here, all of the calls the SCC makes to functions not in the SCC 984 // are non-convergent. Therefore all of the SCC's functions can also be made 985 // non-convergent. We'll remove the attr from the callsites in 986 // InstCombineCalls. 987 for (Function *F : SCCNodes) { 988 if (!F->isConvergent()) continue; 989 990 DEBUG(dbgs() << "Removing convergent attr from fn " << F->getName() 991 << "\n"); 992 F->setNotConvergent(); 993 } 994 return true; 995 } 996 997 static bool setDoesNotRecurse(Function &F) { 998 if (F.doesNotRecurse()) 999 return false; 1000 F.setDoesNotRecurse(); 1001 ++NumNoRecurse; 1002 return true; 1003 } 1004 1005 static bool addNoRecurseAttrs(const SCCNodeSet &SCCNodes) { 1006 // Try and identify functions that do not recurse. 1007 1008 // If the SCC contains multiple nodes we know for sure there is recursion. 1009 if (SCCNodes.size() != 1) 1010 return false; 1011 1012 Function *F = *SCCNodes.begin(); 1013 if (!F || F->isDeclaration() || F->doesNotRecurse()) 1014 return false; 1015 1016 // If all of the calls in F are identifiable and are to norecurse functions, F 1017 // is norecurse. This check also detects self-recursion as F is not currently 1018 // marked norecurse, so any called from F to F will not be marked norecurse. 1019 for (Instruction &I : instructions(*F)) 1020 if (auto CS = CallSite(&I)) { 1021 Function *Callee = CS.getCalledFunction(); 1022 if (!Callee || Callee == F || !Callee->doesNotRecurse()) 1023 // Function calls a potentially recursive function. 1024 return false; 1025 } 1026 1027 // Every call was to a non-recursive function other than this function, and 1028 // we have no indirect recursion as the SCC size is one. This function cannot 1029 // recurse. 1030 return setDoesNotRecurse(*F); 1031 } 1032 1033 PreservedAnalyses PostOrderFunctionAttrsPass::run(LazyCallGraph::SCC &C, 1034 CGSCCAnalysisManager &AM, 1035 LazyCallGraph &CG, 1036 CGSCCUpdateResult &) { 1037 FunctionAnalysisManager &FAM = 1038 AM.getResult<FunctionAnalysisManagerCGSCCProxy>(C, CG).getManager(); 1039 1040 // We pass a lambda into functions to wire them up to the analysis manager 1041 // for getting function analyses. 1042 auto AARGetter = [&](Function &F) -> AAResults & { 1043 return FAM.getResult<AAManager>(F); 1044 }; 1045 1046 // Fill SCCNodes with the elements of the SCC. Also track whether there are 1047 // any external or opt-none nodes that will prevent us from optimizing any 1048 // part of the SCC. 1049 SCCNodeSet SCCNodes; 1050 bool HasUnknownCall = false; 1051 for (LazyCallGraph::Node &N : C) { 1052 Function &F = N.getFunction(); 1053 if (F.hasFnAttribute(Attribute::OptimizeNone)) { 1054 // Treat any function we're trying not to optimize as if it were an 1055 // indirect call and omit it from the node set used below. 1056 HasUnknownCall = true; 1057 continue; 1058 } 1059 // Track whether any functions in this SCC have an unknown call edge. 1060 // Note: if this is ever a performance hit, we can common it with 1061 // subsequent routines which also do scans over the instructions of the 1062 // function. 1063 if (!HasUnknownCall) 1064 for (Instruction &I : instructions(F)) 1065 if (auto CS = CallSite(&I)) 1066 if (!CS.getCalledFunction()) { 1067 HasUnknownCall = true; 1068 break; 1069 } 1070 1071 SCCNodes.insert(&F); 1072 } 1073 1074 bool Changed = false; 1075 Changed |= addArgumentReturnedAttrs(SCCNodes); 1076 Changed |= addReadAttrs(SCCNodes, AARGetter); 1077 Changed |= addArgumentAttrs(SCCNodes); 1078 1079 // If we have no external nodes participating in the SCC, we can deduce some 1080 // more precise attributes as well. 1081 if (!HasUnknownCall) { 1082 Changed |= addNoAliasAttrs(SCCNodes); 1083 Changed |= addNonNullAttrs(SCCNodes); 1084 Changed |= removeConvergentAttrs(SCCNodes); 1085 Changed |= addNoRecurseAttrs(SCCNodes); 1086 } 1087 1088 return Changed ? PreservedAnalyses::none() : PreservedAnalyses::all(); 1089 } 1090 1091 namespace { 1092 struct PostOrderFunctionAttrsLegacyPass : public CallGraphSCCPass { 1093 static char ID; // Pass identification, replacement for typeid 1094 PostOrderFunctionAttrsLegacyPass() : CallGraphSCCPass(ID) { 1095 initializePostOrderFunctionAttrsLegacyPassPass(*PassRegistry::getPassRegistry()); 1096 } 1097 1098 bool runOnSCC(CallGraphSCC &SCC) override; 1099 1100 void getAnalysisUsage(AnalysisUsage &AU) const override { 1101 AU.setPreservesCFG(); 1102 AU.addRequired<AssumptionCacheTracker>(); 1103 getAAResultsAnalysisUsage(AU); 1104 CallGraphSCCPass::getAnalysisUsage(AU); 1105 } 1106 }; 1107 } 1108 1109 char PostOrderFunctionAttrsLegacyPass::ID = 0; 1110 INITIALIZE_PASS_BEGIN(PostOrderFunctionAttrsLegacyPass, "functionattrs", 1111 "Deduce function attributes", false, false) 1112 INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) 1113 INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass) 1114 INITIALIZE_PASS_END(PostOrderFunctionAttrsLegacyPass, "functionattrs", 1115 "Deduce function attributes", false, false) 1116 1117 Pass *llvm::createPostOrderFunctionAttrsLegacyPass() { return new PostOrderFunctionAttrsLegacyPass(); } 1118 1119 template <typename AARGetterT> 1120 static bool runImpl(CallGraphSCC &SCC, AARGetterT AARGetter) { 1121 bool Changed = false; 1122 1123 // Fill SCCNodes with the elements of the SCC. Used for quickly looking up 1124 // whether a given CallGraphNode is in this SCC. Also track whether there are 1125 // any external or opt-none nodes that will prevent us from optimizing any 1126 // part of the SCC. 1127 SCCNodeSet SCCNodes; 1128 bool ExternalNode = false; 1129 for (CallGraphNode *I : SCC) { 1130 Function *F = I->getFunction(); 1131 if (!F || F->hasFnAttribute(Attribute::OptimizeNone)) { 1132 // External node or function we're trying not to optimize - we both avoid 1133 // transform them and avoid leveraging information they provide. 1134 ExternalNode = true; 1135 continue; 1136 } 1137 1138 SCCNodes.insert(F); 1139 } 1140 1141 Changed |= addArgumentReturnedAttrs(SCCNodes); 1142 Changed |= addReadAttrs(SCCNodes, AARGetter); 1143 Changed |= addArgumentAttrs(SCCNodes); 1144 1145 // If we have no external nodes participating in the SCC, we can deduce some 1146 // more precise attributes as well. 1147 if (!ExternalNode) { 1148 Changed |= addNoAliasAttrs(SCCNodes); 1149 Changed |= addNonNullAttrs(SCCNodes); 1150 Changed |= removeConvergentAttrs(SCCNodes); 1151 Changed |= addNoRecurseAttrs(SCCNodes); 1152 } 1153 1154 return Changed; 1155 } 1156 1157 bool PostOrderFunctionAttrsLegacyPass::runOnSCC(CallGraphSCC &SCC) { 1158 if (skipSCC(SCC)) 1159 return false; 1160 1161 // We compute dedicated AA results for each function in the SCC as needed. We 1162 // use a lambda referencing external objects so that they live long enough to 1163 // be queried, but we re-use them each time. 1164 Optional<BasicAAResult> BAR; 1165 Optional<AAResults> AAR; 1166 auto AARGetter = [&](Function &F) -> AAResults & { 1167 BAR.emplace(createLegacyPMBasicAAResult(*this, F)); 1168 AAR.emplace(createLegacyPMAAResults(*this, F, *BAR)); 1169 return *AAR; 1170 }; 1171 1172 return runImpl(SCC, AARGetter); 1173 } 1174 1175 namespace { 1176 struct ReversePostOrderFunctionAttrsLegacyPass : public ModulePass { 1177 static char ID; // Pass identification, replacement for typeid 1178 ReversePostOrderFunctionAttrsLegacyPass() : ModulePass(ID) { 1179 initializeReversePostOrderFunctionAttrsLegacyPassPass(*PassRegistry::getPassRegistry()); 1180 } 1181 1182 bool runOnModule(Module &M) override; 1183 1184 void getAnalysisUsage(AnalysisUsage &AU) const override { 1185 AU.setPreservesCFG(); 1186 AU.addRequired<CallGraphWrapperPass>(); 1187 AU.addPreserved<CallGraphWrapperPass>(); 1188 } 1189 }; 1190 } 1191 1192 char ReversePostOrderFunctionAttrsLegacyPass::ID = 0; 1193 INITIALIZE_PASS_BEGIN(ReversePostOrderFunctionAttrsLegacyPass, "rpo-functionattrs", 1194 "Deduce function attributes in RPO", false, false) 1195 INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass) 1196 INITIALIZE_PASS_END(ReversePostOrderFunctionAttrsLegacyPass, "rpo-functionattrs", 1197 "Deduce function attributes in RPO", false, false) 1198 1199 Pass *llvm::createReversePostOrderFunctionAttrsPass() { 1200 return new ReversePostOrderFunctionAttrsLegacyPass(); 1201 } 1202 1203 static bool addNoRecurseAttrsTopDown(Function &F) { 1204 // We check the preconditions for the function prior to calling this to avoid 1205 // the cost of building up a reversible post-order list. We assert them here 1206 // to make sure none of the invariants this relies on were violated. 1207 assert(!F.isDeclaration() && "Cannot deduce norecurse without a definition!"); 1208 assert(!F.doesNotRecurse() && 1209 "This function has already been deduced as norecurs!"); 1210 assert(F.hasInternalLinkage() && 1211 "Can only do top-down deduction for internal linkage functions!"); 1212 1213 // If F is internal and all of its uses are calls from a non-recursive 1214 // functions, then none of its calls could in fact recurse without going 1215 // through a function marked norecurse, and so we can mark this function too 1216 // as norecurse. Note that the uses must actually be calls -- otherwise 1217 // a pointer to this function could be returned from a norecurse function but 1218 // this function could be recursively (indirectly) called. Note that this 1219 // also detects if F is directly recursive as F is not yet marked as 1220 // a norecurse function. 1221 for (auto *U : F.users()) { 1222 auto *I = dyn_cast<Instruction>(U); 1223 if (!I) 1224 return false; 1225 CallSite CS(I); 1226 if (!CS || !CS.getParent()->getParent()->doesNotRecurse()) 1227 return false; 1228 } 1229 return setDoesNotRecurse(F); 1230 } 1231 1232 static bool deduceFunctionAttributeInRPO(Module &M, CallGraph &CG) { 1233 // We only have a post-order SCC traversal (because SCCs are inherently 1234 // discovered in post-order), so we accumulate them in a vector and then walk 1235 // it in reverse. This is simpler than using the RPO iterator infrastructure 1236 // because we need to combine SCC detection and the PO walk of the call 1237 // graph. We can also cheat egregiously because we're primarily interested in 1238 // synthesizing norecurse and so we can only save the singular SCCs as SCCs 1239 // with multiple functions in them will clearly be recursive. 1240 SmallVector<Function *, 16> Worklist; 1241 for (scc_iterator<CallGraph *> I = scc_begin(&CG); !I.isAtEnd(); ++I) { 1242 if (I->size() != 1) 1243 continue; 1244 1245 Function *F = I->front()->getFunction(); 1246 if (F && !F->isDeclaration() && !F->doesNotRecurse() && 1247 F->hasInternalLinkage()) 1248 Worklist.push_back(F); 1249 } 1250 1251 bool Changed = false; 1252 for (auto *F : reverse(Worklist)) 1253 Changed |= addNoRecurseAttrsTopDown(*F); 1254 1255 return Changed; 1256 } 1257 1258 bool ReversePostOrderFunctionAttrsLegacyPass::runOnModule(Module &M) { 1259 if (skipModule(M)) 1260 return false; 1261 1262 auto &CG = getAnalysis<CallGraphWrapperPass>().getCallGraph(); 1263 1264 return deduceFunctionAttributeInRPO(M, CG); 1265 } 1266 1267 PreservedAnalyses 1268 ReversePostOrderFunctionAttrsPass::run(Module &M, ModuleAnalysisManager &AM) { 1269 auto &CG = AM.getResult<CallGraphAnalysis>(M); 1270 1271 bool Changed = deduceFunctionAttributeInRPO(M, CG); 1272 1273 // CallGraphAnalysis holds AssertingVH and must be invalidated eagerly so 1274 // that other passes don't delete stuff from under it. 1275 // FIXME: We need to invalidate this to avoid PR28400. Is there a better 1276 // solution? 1277 AM.invalidate<CallGraphAnalysis>(M); 1278 1279 if (!Changed) 1280 return PreservedAnalyses::all(); 1281 PreservedAnalyses PA; 1282 PA.preserve<CallGraphAnalysis>(); 1283 return PA; 1284 } 1285