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 // This file implements a simple interprocedural pass which walks the 11 // call-graph, looking for functions which do not access or only read 12 // non-local memory, and marking them readnone/readonly. It does the 13 // same with function arguments independently, marking them readonly/ 14 // readnone/nocapture. Finally, well-known library call declarations 15 // are marked with all attributes that are consistent with the 16 // function's standard definition. This pass is implemented as a 17 // bottom-up traversal of the call-graph. 18 // 19 //===----------------------------------------------------------------------===// 20 21 #include "llvm/Transforms/IPO.h" 22 #include "llvm/ADT/SCCIterator.h" 23 #include "llvm/ADT/SetVector.h" 24 #include "llvm/ADT/SmallSet.h" 25 #include "llvm/ADT/Statistic.h" 26 #include "llvm/Analysis/AliasAnalysis.h" 27 #include "llvm/Analysis/CallGraph.h" 28 #include "llvm/Analysis/CallGraphSCCPass.h" 29 #include "llvm/Analysis/CaptureTracking.h" 30 #include "llvm/IR/GlobalVariable.h" 31 #include "llvm/IR/InstIterator.h" 32 #include "llvm/IR/IntrinsicInst.h" 33 #include "llvm/IR/LLVMContext.h" 34 #include "llvm/Target/TargetLibraryInfo.h" 35 using namespace llvm; 36 37 #define DEBUG_TYPE "functionattrs" 38 39 STATISTIC(NumReadNone, "Number of functions marked readnone"); 40 STATISTIC(NumReadOnly, "Number of functions marked readonly"); 41 STATISTIC(NumNoCapture, "Number of arguments marked nocapture"); 42 STATISTIC(NumReadNoneArg, "Number of arguments marked readnone"); 43 STATISTIC(NumReadOnlyArg, "Number of arguments marked readonly"); 44 STATISTIC(NumNoAlias, "Number of function returns marked noalias"); 45 STATISTIC(NumAnnotated, "Number of attributes added to library functions"); 46 47 namespace { 48 struct FunctionAttrs : public CallGraphSCCPass { 49 static char ID; // Pass identification, replacement for typeid 50 FunctionAttrs() : CallGraphSCCPass(ID), AA(nullptr) { 51 initializeFunctionAttrsPass(*PassRegistry::getPassRegistry()); 52 } 53 54 // runOnSCC - Analyze the SCC, performing the transformation if possible. 55 bool runOnSCC(CallGraphSCC &SCC) override; 56 57 // AddReadAttrs - Deduce readonly/readnone attributes for the SCC. 58 bool AddReadAttrs(const CallGraphSCC &SCC); 59 60 // AddArgumentAttrs - Deduce nocapture attributes for the SCC. 61 bool AddArgumentAttrs(const CallGraphSCC &SCC); 62 63 // IsFunctionMallocLike - Does this function allocate new memory? 64 bool IsFunctionMallocLike(Function *F, 65 SmallPtrSet<Function*, 8> &) const; 66 67 // AddNoAliasAttrs - Deduce noalias attributes for the SCC. 68 bool AddNoAliasAttrs(const CallGraphSCC &SCC); 69 70 // Utility methods used by inferPrototypeAttributes to add attributes 71 // and maintain annotation statistics. 72 73 void setDoesNotAccessMemory(Function &F) { 74 if (!F.doesNotAccessMemory()) { 75 F.setDoesNotAccessMemory(); 76 ++NumAnnotated; 77 } 78 } 79 80 void setOnlyReadsMemory(Function &F) { 81 if (!F.onlyReadsMemory()) { 82 F.setOnlyReadsMemory(); 83 ++NumAnnotated; 84 } 85 } 86 87 void setDoesNotThrow(Function &F) { 88 if (!F.doesNotThrow()) { 89 F.setDoesNotThrow(); 90 ++NumAnnotated; 91 } 92 } 93 94 void setDoesNotCapture(Function &F, unsigned n) { 95 if (!F.doesNotCapture(n)) { 96 F.setDoesNotCapture(n); 97 ++NumAnnotated; 98 } 99 } 100 101 void setOnlyReadsMemory(Function &F, unsigned n) { 102 if (!F.onlyReadsMemory(n)) { 103 F.setOnlyReadsMemory(n); 104 ++NumAnnotated; 105 } 106 } 107 108 void setDoesNotAlias(Function &F, unsigned n) { 109 if (!F.doesNotAlias(n)) { 110 F.setDoesNotAlias(n); 111 ++NumAnnotated; 112 } 113 } 114 115 // inferPrototypeAttributes - Analyze the name and prototype of the 116 // given function and set any applicable attributes. Returns true 117 // if any attributes were set and false otherwise. 118 bool inferPrototypeAttributes(Function &F); 119 120 // annotateLibraryCalls - Adds attributes to well-known standard library 121 // call declarations. 122 bool annotateLibraryCalls(const CallGraphSCC &SCC); 123 124 void getAnalysisUsage(AnalysisUsage &AU) const override { 125 AU.setPreservesCFG(); 126 AU.addRequired<AliasAnalysis>(); 127 AU.addRequired<TargetLibraryInfo>(); 128 CallGraphSCCPass::getAnalysisUsage(AU); 129 } 130 131 private: 132 AliasAnalysis *AA; 133 TargetLibraryInfo *TLI; 134 }; 135 } 136 137 char FunctionAttrs::ID = 0; 138 INITIALIZE_PASS_BEGIN(FunctionAttrs, "functionattrs", 139 "Deduce function attributes", false, false) 140 INITIALIZE_AG_DEPENDENCY(AliasAnalysis) 141 INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass) 142 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo) 143 INITIALIZE_PASS_END(FunctionAttrs, "functionattrs", 144 "Deduce function attributes", false, false) 145 146 Pass *llvm::createFunctionAttrsPass() { return new FunctionAttrs(); } 147 148 149 /// AddReadAttrs - Deduce readonly/readnone attributes for the SCC. 150 bool FunctionAttrs::AddReadAttrs(const CallGraphSCC &SCC) { 151 SmallPtrSet<Function*, 8> SCCNodes; 152 153 // Fill SCCNodes with the elements of the SCC. Used for quickly 154 // looking up whether a given CallGraphNode is in this SCC. 155 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) 156 SCCNodes.insert((*I)->getFunction()); 157 158 // Check if any of the functions in the SCC read or write memory. If they 159 // write memory then they can't be marked readnone or readonly. 160 bool ReadsMemory = false; 161 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 162 Function *F = (*I)->getFunction(); 163 164 if (!F) 165 // External node - may write memory. Just give up. 166 return false; 167 168 AliasAnalysis::ModRefBehavior MRB = AA->getModRefBehavior(F); 169 if (MRB == AliasAnalysis::DoesNotAccessMemory) 170 // Already perfect! 171 continue; 172 173 // Definitions with weak linkage may be overridden at linktime with 174 // something that writes memory, so treat them like declarations. 175 if (F->isDeclaration() || F->mayBeOverridden()) { 176 if (!AliasAnalysis::onlyReadsMemory(MRB)) 177 // May write memory. Just give up. 178 return false; 179 180 ReadsMemory = true; 181 continue; 182 } 183 184 // Scan the function body for instructions that may read or write memory. 185 for (inst_iterator II = inst_begin(F), E = inst_end(F); II != E; ++II) { 186 Instruction *I = &*II; 187 188 // Some instructions can be ignored even if they read or write memory. 189 // Detect these now, skipping to the next instruction if one is found. 190 CallSite CS(cast<Value>(I)); 191 if (CS) { 192 // Ignore calls to functions in the same SCC. 193 if (CS.getCalledFunction() && SCCNodes.count(CS.getCalledFunction())) 194 continue; 195 AliasAnalysis::ModRefBehavior MRB = AA->getModRefBehavior(CS); 196 // If the call doesn't access arbitrary memory, we may be able to 197 // figure out something. 198 if (AliasAnalysis::onlyAccessesArgPointees(MRB)) { 199 // If the call does access argument pointees, check each argument. 200 if (AliasAnalysis::doesAccessArgPointees(MRB)) 201 // Check whether all pointer arguments point to local memory, and 202 // ignore calls that only access local memory. 203 for (CallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end(); 204 CI != CE; ++CI) { 205 Value *Arg = *CI; 206 if (Arg->getType()->isPointerTy()) { 207 AliasAnalysis::Location Loc(Arg, 208 AliasAnalysis::UnknownSize, 209 I->getMetadata(LLVMContext::MD_tbaa)); 210 if (!AA->pointsToConstantMemory(Loc, /*OrLocal=*/true)) { 211 if (MRB & AliasAnalysis::Mod) 212 // Writes non-local memory. Give up. 213 return false; 214 if (MRB & AliasAnalysis::Ref) 215 // Ok, it reads non-local memory. 216 ReadsMemory = true; 217 } 218 } 219 } 220 continue; 221 } 222 // The call could access any memory. If that includes writes, give up. 223 if (MRB & AliasAnalysis::Mod) 224 return false; 225 // If it reads, note it. 226 if (MRB & AliasAnalysis::Ref) 227 ReadsMemory = true; 228 continue; 229 } else if (LoadInst *LI = dyn_cast<LoadInst>(I)) { 230 // Ignore non-volatile loads from local memory. (Atomic is okay here.) 231 if (!LI->isVolatile()) { 232 AliasAnalysis::Location Loc = AA->getLocation(LI); 233 if (AA->pointsToConstantMemory(Loc, /*OrLocal=*/true)) 234 continue; 235 } 236 } else if (StoreInst *SI = dyn_cast<StoreInst>(I)) { 237 // Ignore non-volatile stores to local memory. (Atomic is okay here.) 238 if (!SI->isVolatile()) { 239 AliasAnalysis::Location Loc = AA->getLocation(SI); 240 if (AA->pointsToConstantMemory(Loc, /*OrLocal=*/true)) 241 continue; 242 } 243 } else if (VAArgInst *VI = dyn_cast<VAArgInst>(I)) { 244 // Ignore vaargs on local memory. 245 AliasAnalysis::Location Loc = AA->getLocation(VI); 246 if (AA->pointsToConstantMemory(Loc, /*OrLocal=*/true)) 247 continue; 248 } 249 250 // Any remaining instructions need to be taken seriously! Check if they 251 // read or write memory. 252 if (I->mayWriteToMemory()) 253 // Writes memory. Just give up. 254 return false; 255 256 // If this instruction may read memory, remember that. 257 ReadsMemory |= I->mayReadFromMemory(); 258 } 259 } 260 261 // Success! Functions in this SCC do not access memory, or only read memory. 262 // Give them the appropriate attribute. 263 bool MadeChange = false; 264 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 265 Function *F = (*I)->getFunction(); 266 267 if (F->doesNotAccessMemory()) 268 // Already perfect! 269 continue; 270 271 if (F->onlyReadsMemory() && ReadsMemory) 272 // No change. 273 continue; 274 275 MadeChange = true; 276 277 // Clear out any existing attributes. 278 AttrBuilder B; 279 B.addAttribute(Attribute::ReadOnly) 280 .addAttribute(Attribute::ReadNone); 281 F->removeAttributes(AttributeSet::FunctionIndex, 282 AttributeSet::get(F->getContext(), 283 AttributeSet::FunctionIndex, B)); 284 285 // Add in the new attribute. 286 F->addAttribute(AttributeSet::FunctionIndex, 287 ReadsMemory ? Attribute::ReadOnly : Attribute::ReadNone); 288 289 if (ReadsMemory) 290 ++NumReadOnly; 291 else 292 ++NumReadNone; 293 } 294 295 return MadeChange; 296 } 297 298 namespace { 299 // For a given pointer Argument, this retains a list of Arguments of functions 300 // in the same SCC that the pointer data flows into. We use this to build an 301 // SCC of the arguments. 302 struct ArgumentGraphNode { 303 Argument *Definition; 304 SmallVector<ArgumentGraphNode*, 4> Uses; 305 }; 306 307 class ArgumentGraph { 308 // We store pointers to ArgumentGraphNode objects, so it's important that 309 // that they not move around upon insert. 310 typedef std::map<Argument*, ArgumentGraphNode> ArgumentMapTy; 311 312 ArgumentMapTy ArgumentMap; 313 314 // There is no root node for the argument graph, in fact: 315 // void f(int *x, int *y) { if (...) f(x, y); } 316 // is an example where the graph is disconnected. The SCCIterator requires a 317 // single entry point, so we maintain a fake ("synthetic") root node that 318 // uses every node. Because the graph is directed and nothing points into 319 // the root, it will not participate in any SCCs (except for its own). 320 ArgumentGraphNode SyntheticRoot; 321 322 public: 323 ArgumentGraph() { SyntheticRoot.Definition = nullptr; } 324 325 typedef SmallVectorImpl<ArgumentGraphNode*>::iterator iterator; 326 327 iterator begin() { return SyntheticRoot.Uses.begin(); } 328 iterator end() { return SyntheticRoot.Uses.end(); } 329 ArgumentGraphNode *getEntryNode() { return &SyntheticRoot; } 330 331 ArgumentGraphNode *operator[](Argument *A) { 332 ArgumentGraphNode &Node = ArgumentMap[A]; 333 Node.Definition = A; 334 SyntheticRoot.Uses.push_back(&Node); 335 return &Node; 336 } 337 }; 338 339 // This tracker checks whether callees are in the SCC, and if so it does not 340 // consider that a capture, instead adding it to the "Uses" list and 341 // continuing with the analysis. 342 struct ArgumentUsesTracker : public CaptureTracker { 343 ArgumentUsesTracker(const SmallPtrSet<Function*, 8> &SCCNodes) 344 : Captured(false), SCCNodes(SCCNodes) {} 345 346 void tooManyUses() override { Captured = true; } 347 348 bool captured(const Use *U) override { 349 CallSite CS(U->getUser()); 350 if (!CS.getInstruction()) { Captured = true; return true; } 351 352 Function *F = CS.getCalledFunction(); 353 if (!F || !SCCNodes.count(F)) { Captured = true; return true; } 354 355 bool Found = false; 356 Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end(); 357 for (CallSite::arg_iterator PI = CS.arg_begin(), PE = CS.arg_end(); 358 PI != PE; ++PI, ++AI) { 359 if (AI == AE) { 360 assert(F->isVarArg() && "More params than args in non-varargs call"); 361 Captured = true; 362 return true; 363 } 364 if (PI == U) { 365 Uses.push_back(AI); 366 Found = true; 367 break; 368 } 369 } 370 assert(Found && "Capturing call-site captured nothing?"); 371 (void)Found; 372 return false; 373 } 374 375 bool Captured; // True only if certainly captured (used outside our SCC). 376 SmallVector<Argument*, 4> Uses; // Uses within our SCC. 377 378 const SmallPtrSet<Function*, 8> &SCCNodes; 379 }; 380 } 381 382 namespace llvm { 383 template<> struct GraphTraits<ArgumentGraphNode*> { 384 typedef ArgumentGraphNode NodeType; 385 typedef SmallVectorImpl<ArgumentGraphNode*>::iterator ChildIteratorType; 386 387 static inline NodeType *getEntryNode(NodeType *A) { return A; } 388 static inline ChildIteratorType child_begin(NodeType *N) { 389 return N->Uses.begin(); 390 } 391 static inline ChildIteratorType child_end(NodeType *N) { 392 return N->Uses.end(); 393 } 394 }; 395 template<> struct GraphTraits<ArgumentGraph*> 396 : public GraphTraits<ArgumentGraphNode*> { 397 static NodeType *getEntryNode(ArgumentGraph *AG) { 398 return AG->getEntryNode(); 399 } 400 static ChildIteratorType nodes_begin(ArgumentGraph *AG) { 401 return AG->begin(); 402 } 403 static ChildIteratorType nodes_end(ArgumentGraph *AG) { 404 return AG->end(); 405 } 406 }; 407 } 408 409 // Returns Attribute::None, Attribute::ReadOnly or Attribute::ReadNone. 410 static Attribute::AttrKind 411 determinePointerReadAttrs(Argument *A, 412 const SmallPtrSet<Argument*, 8> &SCCNodes) { 413 414 SmallVector<Use*, 32> Worklist; 415 SmallSet<Use*, 32> Visited; 416 int Count = 0; 417 418 // inalloca arguments are always clobbered by the call. 419 if (A->hasInAllocaAttr()) 420 return Attribute::None; 421 422 bool IsRead = false; 423 // We don't need to track IsWritten. If A is written to, return immediately. 424 425 for (Use &U : A->uses()) { 426 if (Count++ >= 20) 427 return Attribute::None; 428 429 Visited.insert(&U); 430 Worklist.push_back(&U); 431 } 432 433 while (!Worklist.empty()) { 434 Use *U = Worklist.pop_back_val(); 435 Instruction *I = cast<Instruction>(U->getUser()); 436 Value *V = U->get(); 437 438 switch (I->getOpcode()) { 439 case Instruction::BitCast: 440 case Instruction::GetElementPtr: 441 case Instruction::PHI: 442 case Instruction::Select: 443 case Instruction::AddrSpaceCast: 444 // The original value is not read/written via this if the new value isn't. 445 for (Use &UU : I->uses()) 446 if (Visited.insert(&UU)) 447 Worklist.push_back(&UU); 448 break; 449 450 case Instruction::Call: 451 case Instruction::Invoke: { 452 bool Captures = true; 453 454 if (I->getType()->isVoidTy()) 455 Captures = false; 456 457 auto AddUsersToWorklistIfCapturing = [&] { 458 if (Captures) 459 for (Use &UU : I->uses()) 460 if (Visited.insert(&UU)) 461 Worklist.push_back(&UU); 462 }; 463 464 CallSite CS(I); 465 if (CS.doesNotAccessMemory()) { 466 AddUsersToWorklistIfCapturing(); 467 continue; 468 } 469 470 Function *F = CS.getCalledFunction(); 471 if (!F) { 472 if (CS.onlyReadsMemory()) { 473 IsRead = true; 474 AddUsersToWorklistIfCapturing(); 475 continue; 476 } 477 return Attribute::None; 478 } 479 480 Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end(); 481 CallSite::arg_iterator B = CS.arg_begin(), E = CS.arg_end(); 482 for (CallSite::arg_iterator A = B; A != E; ++A, ++AI) { 483 if (A->get() == V) { 484 if (AI == AE) { 485 assert(F->isVarArg() && 486 "More params than args in non-varargs call."); 487 return Attribute::None; 488 } 489 Captures &= !CS.doesNotCapture(A - B); 490 if (SCCNodes.count(AI)) 491 continue; 492 if (!CS.onlyReadsMemory() && !CS.onlyReadsMemory(A - B)) 493 return Attribute::None; 494 if (!CS.doesNotAccessMemory(A - B)) 495 IsRead = true; 496 } 497 } 498 AddUsersToWorklistIfCapturing(); 499 break; 500 } 501 502 case Instruction::Load: 503 IsRead = true; 504 break; 505 506 case Instruction::ICmp: 507 case Instruction::Ret: 508 break; 509 510 default: 511 return Attribute::None; 512 } 513 } 514 515 return IsRead ? Attribute::ReadOnly : Attribute::ReadNone; 516 } 517 518 /// AddArgumentAttrs - Deduce nocapture attributes for the SCC. 519 bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) { 520 bool Changed = false; 521 522 SmallPtrSet<Function*, 8> SCCNodes; 523 524 // Fill SCCNodes with the elements of the SCC. Used for quickly 525 // looking up whether a given CallGraphNode is in this SCC. 526 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 527 Function *F = (*I)->getFunction(); 528 if (F && !F->isDeclaration() && !F->mayBeOverridden()) 529 SCCNodes.insert(F); 530 } 531 532 ArgumentGraph AG; 533 534 AttrBuilder B; 535 B.addAttribute(Attribute::NoCapture); 536 537 // Check each function in turn, determining which pointer arguments are not 538 // captured. 539 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 540 Function *F = (*I)->getFunction(); 541 542 if (!F) 543 // External node - only a problem for arguments that we pass to it. 544 continue; 545 546 // Definitions with weak linkage may be overridden at linktime with 547 // something that captures pointers, so treat them like declarations. 548 if (F->isDeclaration() || F->mayBeOverridden()) 549 continue; 550 551 // Functions that are readonly (or readnone) and nounwind and don't return 552 // a value can't capture arguments. Don't analyze them. 553 if (F->onlyReadsMemory() && F->doesNotThrow() && 554 F->getReturnType()->isVoidTy()) { 555 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); 556 A != E; ++A) { 557 if (A->getType()->isPointerTy() && !A->hasNoCaptureAttr()) { 558 A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo() + 1, B)); 559 ++NumNoCapture; 560 Changed = true; 561 } 562 } 563 continue; 564 } 565 566 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); 567 A != E; ++A) { 568 if (!A->getType()->isPointerTy()) continue; 569 bool HasNonLocalUses = false; 570 if (!A->hasNoCaptureAttr()) { 571 ArgumentUsesTracker Tracker(SCCNodes); 572 PointerMayBeCaptured(A, &Tracker); 573 if (!Tracker.Captured) { 574 if (Tracker.Uses.empty()) { 575 // If it's trivially not captured, mark it nocapture now. 576 A->addAttr(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 (SmallVectorImpl<Argument*>::iterator UI = Tracker.Uses.begin(), 585 UE = Tracker.Uses.end(); UI != UE; ++UI) { 586 Node->Uses.push_back(AG[*UI]); 587 if (*UI != A) 588 HasNonLocalUses = true; 589 } 590 } 591 } 592 // Otherwise, it's captured. Don't bother doing SCC analysis on it. 593 } 594 if (!HasNonLocalUses && !A->onlyReadsMemory()) { 595 // Can we determine that it's readonly/readnone without doing an SCC? 596 // Note that we don't allow any calls at all here, or else our result 597 // will be dependent on the iteration order through the functions in the 598 // SCC. 599 SmallPtrSet<Argument*, 8> Self; 600 Self.insert(A); 601 Attribute::AttrKind R = determinePointerReadAttrs(A, Self); 602 if (R != Attribute::None) { 603 AttrBuilder B; 604 B.addAttribute(R); 605 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 606 Changed = true; 607 R == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg; 608 } 609 } 610 } 611 } 612 613 // The graph we've collected is partial because we stopped scanning for 614 // argument uses once we solved the argument trivially. These partial nodes 615 // show up as ArgumentGraphNode objects with an empty Uses list, and for 616 // these nodes the final decision about whether they capture has already been 617 // made. If the definition doesn't have a 'nocapture' attribute by now, it 618 // captures. 619 620 for (scc_iterator<ArgumentGraph*> I = scc_begin(&AG); !I.isAtEnd(); ++I) { 621 const std::vector<ArgumentGraphNode *> &ArgumentSCC = *I; 622 if (ArgumentSCC.size() == 1) { 623 if (!ArgumentSCC[0]->Definition) 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) continue; 646 647 SmallPtrSet<Argument*, 8> ArgumentSCCNodes; 648 // Fill ArgumentSCCNodes with the elements of the ArgumentSCC. Used for 649 // quickly looking up whether a given Argument is in this ArgumentSCC. 650 for (auto I = ArgumentSCC.begin(), E = ArgumentSCC.end(); I != E; ++I) { 651 ArgumentSCCNodes.insert((*I)->Definition); 652 } 653 654 for (auto I = ArgumentSCC.begin(), E = ArgumentSCC.end(); 655 I != E && !SCCCaptured; ++I) { 656 ArgumentGraphNode *N = *I; 657 for (SmallVectorImpl<ArgumentGraphNode*>::iterator UI = N->Uses.begin(), 658 UE = N->Uses.end(); UI != UE; ++UI) { 659 Argument *A = (*UI)->Definition; 660 if (A->hasNoCaptureAttr() || ArgumentSCCNodes.count(A)) 661 continue; 662 SCCCaptured = true; 663 break; 664 } 665 } 666 if (SCCCaptured) continue; 667 668 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) { 669 Argument *A = ArgumentSCC[i]->Definition; 670 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 671 ++NumNoCapture; 672 Changed = true; 673 } 674 675 // We also want to compute readonly/readnone. With a small number of false 676 // negatives, we can assume that any pointer which is captured isn't going 677 // to be provably readonly or readnone, since by definition we can't 678 // analyze all uses of a captured pointer. 679 // 680 // The false negatives happen when the pointer is captured by a function 681 // that promises readonly/readnone behaviour on the pointer, then the 682 // pointer's lifetime ends before anything that writes to arbitrary memory. 683 // Also, a readonly/readnone pointer may be returned, but returning a 684 // pointer is capturing it. 685 686 Attribute::AttrKind ReadAttr = Attribute::ReadNone; 687 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) { 688 Argument *A = ArgumentSCC[i]->Definition; 689 Attribute::AttrKind K = determinePointerReadAttrs(A, ArgumentSCCNodes); 690 if (K == Attribute::ReadNone) 691 continue; 692 if (K == Attribute::ReadOnly) { 693 ReadAttr = Attribute::ReadOnly; 694 continue; 695 } 696 ReadAttr = K; 697 break; 698 } 699 700 if (ReadAttr != Attribute::None) { 701 AttrBuilder B; 702 B.addAttribute(ReadAttr); 703 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) { 704 Argument *A = ArgumentSCC[i]->Definition; 705 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 706 ReadAttr == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg; 707 Changed = true; 708 } 709 } 710 } 711 712 return Changed; 713 } 714 715 /// IsFunctionMallocLike - A function is malloc-like if it returns either null 716 /// or a pointer that doesn't alias any other pointer visible to the caller. 717 bool FunctionAttrs::IsFunctionMallocLike(Function *F, 718 SmallPtrSet<Function*, 8> &SCCNodes) const { 719 SmallSetVector<Value *, 8> FlowsToReturn; 720 for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) 721 if (ReturnInst *Ret = dyn_cast<ReturnInst>(I->getTerminator())) 722 FlowsToReturn.insert(Ret->getReturnValue()); 723 724 for (unsigned i = 0; i != FlowsToReturn.size(); ++i) { 725 Value *RetVal = FlowsToReturn[i]; 726 727 if (Constant *C = dyn_cast<Constant>(RetVal)) { 728 if (!C->isNullValue() && !isa<UndefValue>(C)) 729 return false; 730 731 continue; 732 } 733 734 if (isa<Argument>(RetVal)) 735 return false; 736 737 if (Instruction *RVI = dyn_cast<Instruction>(RetVal)) 738 switch (RVI->getOpcode()) { 739 // Extend the analysis by looking upwards. 740 case Instruction::BitCast: 741 case Instruction::GetElementPtr: 742 case Instruction::AddrSpaceCast: 743 FlowsToReturn.insert(RVI->getOperand(0)); 744 continue; 745 case Instruction::Select: { 746 SelectInst *SI = cast<SelectInst>(RVI); 747 FlowsToReturn.insert(SI->getTrueValue()); 748 FlowsToReturn.insert(SI->getFalseValue()); 749 continue; 750 } 751 case Instruction::PHI: { 752 PHINode *PN = cast<PHINode>(RVI); 753 for (int i = 0, e = PN->getNumIncomingValues(); i != e; ++i) 754 FlowsToReturn.insert(PN->getIncomingValue(i)); 755 continue; 756 } 757 758 // Check whether the pointer came from an allocation. 759 case Instruction::Alloca: 760 break; 761 case Instruction::Call: 762 case Instruction::Invoke: { 763 CallSite CS(RVI); 764 if (CS.paramHasAttr(0, Attribute::NoAlias)) 765 break; 766 if (CS.getCalledFunction() && 767 SCCNodes.count(CS.getCalledFunction())) 768 break; 769 } // fall-through 770 default: 771 return false; // Did not come from an allocation. 772 } 773 774 if (PointerMayBeCaptured(RetVal, false, /*StoreCaptures=*/false)) 775 return false; 776 } 777 778 return true; 779 } 780 781 /// AddNoAliasAttrs - Deduce noalias attributes for the SCC. 782 bool FunctionAttrs::AddNoAliasAttrs(const CallGraphSCC &SCC) { 783 SmallPtrSet<Function*, 8> SCCNodes; 784 785 // Fill SCCNodes with the elements of the SCC. Used for quickly 786 // looking up whether a given CallGraphNode is in this SCC. 787 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) 788 SCCNodes.insert((*I)->getFunction()); 789 790 // Check each function in turn, determining which functions return noalias 791 // pointers. 792 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 793 Function *F = (*I)->getFunction(); 794 795 if (!F) 796 // External node - skip it; 797 return false; 798 799 // Already noalias. 800 if (F->doesNotAlias(0)) 801 continue; 802 803 // Definitions with weak linkage may be overridden at linktime, so 804 // treat them like declarations. 805 if (F->isDeclaration() || F->mayBeOverridden()) 806 return false; 807 808 // We annotate noalias return values, which are only applicable to 809 // pointer types. 810 if (!F->getReturnType()->isPointerTy()) 811 continue; 812 813 if (!IsFunctionMallocLike(F, SCCNodes)) 814 return false; 815 } 816 817 bool MadeChange = false; 818 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 819 Function *F = (*I)->getFunction(); 820 if (F->doesNotAlias(0) || !F->getReturnType()->isPointerTy()) 821 continue; 822 823 F->setDoesNotAlias(0); 824 ++NumNoAlias; 825 MadeChange = true; 826 } 827 828 return MadeChange; 829 } 830 831 /// inferPrototypeAttributes - Analyze the name and prototype of the 832 /// given function and set any applicable attributes. Returns true 833 /// if any attributes were set and false otherwise. 834 bool FunctionAttrs::inferPrototypeAttributes(Function &F) { 835 FunctionType *FTy = F.getFunctionType(); 836 LibFunc::Func TheLibFunc; 837 if (!(TLI->getLibFunc(F.getName(), TheLibFunc) && TLI->has(TheLibFunc))) 838 return false; 839 840 switch (TheLibFunc) { 841 case LibFunc::strlen: 842 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 843 return false; 844 setOnlyReadsMemory(F); 845 setDoesNotThrow(F); 846 setDoesNotCapture(F, 1); 847 break; 848 case LibFunc::strchr: 849 case LibFunc::strrchr: 850 if (FTy->getNumParams() != 2 || 851 !FTy->getParamType(0)->isPointerTy() || 852 !FTy->getParamType(1)->isIntegerTy()) 853 return false; 854 setOnlyReadsMemory(F); 855 setDoesNotThrow(F); 856 break; 857 case LibFunc::strtol: 858 case LibFunc::strtod: 859 case LibFunc::strtof: 860 case LibFunc::strtoul: 861 case LibFunc::strtoll: 862 case LibFunc::strtold: 863 case LibFunc::strtoull: 864 if (FTy->getNumParams() < 2 || 865 !FTy->getParamType(1)->isPointerTy()) 866 return false; 867 setDoesNotThrow(F); 868 setDoesNotCapture(F, 2); 869 setOnlyReadsMemory(F, 1); 870 break; 871 case LibFunc::strcpy: 872 case LibFunc::stpcpy: 873 case LibFunc::strcat: 874 case LibFunc::strncat: 875 case LibFunc::strncpy: 876 case LibFunc::stpncpy: 877 if (FTy->getNumParams() < 2 || 878 !FTy->getParamType(1)->isPointerTy()) 879 return false; 880 setDoesNotThrow(F); 881 setDoesNotCapture(F, 2); 882 setOnlyReadsMemory(F, 2); 883 break; 884 case LibFunc::strxfrm: 885 if (FTy->getNumParams() != 3 || 886 !FTy->getParamType(0)->isPointerTy() || 887 !FTy->getParamType(1)->isPointerTy()) 888 return false; 889 setDoesNotThrow(F); 890 setDoesNotCapture(F, 1); 891 setDoesNotCapture(F, 2); 892 setOnlyReadsMemory(F, 2); 893 break; 894 case LibFunc::strcmp: //0,1 895 case LibFunc::strspn: // 0,1 896 case LibFunc::strncmp: // 0,1 897 case LibFunc::strcspn: //0,1 898 case LibFunc::strcoll: //0,1 899 case LibFunc::strcasecmp: // 0,1 900 case LibFunc::strncasecmp: // 901 if (FTy->getNumParams() < 2 || 902 !FTy->getParamType(0)->isPointerTy() || 903 !FTy->getParamType(1)->isPointerTy()) 904 return false; 905 setOnlyReadsMemory(F); 906 setDoesNotThrow(F); 907 setDoesNotCapture(F, 1); 908 setDoesNotCapture(F, 2); 909 break; 910 case LibFunc::strstr: 911 case LibFunc::strpbrk: 912 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 913 return false; 914 setOnlyReadsMemory(F); 915 setDoesNotThrow(F); 916 setDoesNotCapture(F, 2); 917 break; 918 case LibFunc::strtok: 919 case LibFunc::strtok_r: 920 if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy()) 921 return false; 922 setDoesNotThrow(F); 923 setDoesNotCapture(F, 2); 924 setOnlyReadsMemory(F, 2); 925 break; 926 case LibFunc::scanf: 927 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy()) 928 return false; 929 setDoesNotThrow(F); 930 setDoesNotCapture(F, 1); 931 setOnlyReadsMemory(F, 1); 932 break; 933 case LibFunc::setbuf: 934 case LibFunc::setvbuf: 935 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy()) 936 return false; 937 setDoesNotThrow(F); 938 setDoesNotCapture(F, 1); 939 break; 940 case LibFunc::strdup: 941 case LibFunc::strndup: 942 if (FTy->getNumParams() < 1 || !FTy->getReturnType()->isPointerTy() || 943 !FTy->getParamType(0)->isPointerTy()) 944 return false; 945 setDoesNotThrow(F); 946 setDoesNotAlias(F, 0); 947 setDoesNotCapture(F, 1); 948 setOnlyReadsMemory(F, 1); 949 break; 950 case LibFunc::stat: 951 case LibFunc::statvfs: 952 if (FTy->getNumParams() < 2 || 953 !FTy->getParamType(0)->isPointerTy() || 954 !FTy->getParamType(1)->isPointerTy()) 955 return false; 956 setDoesNotThrow(F); 957 setDoesNotCapture(F, 1); 958 setDoesNotCapture(F, 2); 959 setOnlyReadsMemory(F, 1); 960 break; 961 case LibFunc::sscanf: 962 if (FTy->getNumParams() < 2 || 963 !FTy->getParamType(0)->isPointerTy() || 964 !FTy->getParamType(1)->isPointerTy()) 965 return false; 966 setDoesNotThrow(F); 967 setDoesNotCapture(F, 1); 968 setDoesNotCapture(F, 2); 969 setOnlyReadsMemory(F, 1); 970 setOnlyReadsMemory(F, 2); 971 break; 972 case LibFunc::sprintf: 973 if (FTy->getNumParams() < 2 || 974 !FTy->getParamType(0)->isPointerTy() || 975 !FTy->getParamType(1)->isPointerTy()) 976 return false; 977 setDoesNotThrow(F); 978 setDoesNotCapture(F, 1); 979 setDoesNotCapture(F, 2); 980 setOnlyReadsMemory(F, 2); 981 break; 982 case LibFunc::snprintf: 983 if (FTy->getNumParams() != 3 || 984 !FTy->getParamType(0)->isPointerTy() || 985 !FTy->getParamType(2)->isPointerTy()) 986 return false; 987 setDoesNotThrow(F); 988 setDoesNotCapture(F, 1); 989 setDoesNotCapture(F, 3); 990 setOnlyReadsMemory(F, 3); 991 break; 992 case LibFunc::setitimer: 993 if (FTy->getNumParams() != 3 || 994 !FTy->getParamType(1)->isPointerTy() || 995 !FTy->getParamType(2)->isPointerTy()) 996 return false; 997 setDoesNotThrow(F); 998 setDoesNotCapture(F, 2); 999 setDoesNotCapture(F, 3); 1000 setOnlyReadsMemory(F, 2); 1001 break; 1002 case LibFunc::system: 1003 if (FTy->getNumParams() != 1 || 1004 !FTy->getParamType(0)->isPointerTy()) 1005 return false; 1006 // May throw; "system" is a valid pthread cancellation point. 1007 setDoesNotCapture(F, 1); 1008 setOnlyReadsMemory(F, 1); 1009 break; 1010 case LibFunc::malloc: 1011 if (FTy->getNumParams() != 1 || 1012 !FTy->getReturnType()->isPointerTy()) 1013 return false; 1014 setDoesNotThrow(F); 1015 setDoesNotAlias(F, 0); 1016 break; 1017 case LibFunc::memcmp: 1018 if (FTy->getNumParams() != 3 || 1019 !FTy->getParamType(0)->isPointerTy() || 1020 !FTy->getParamType(1)->isPointerTy()) 1021 return false; 1022 setOnlyReadsMemory(F); 1023 setDoesNotThrow(F); 1024 setDoesNotCapture(F, 1); 1025 setDoesNotCapture(F, 2); 1026 break; 1027 case LibFunc::memchr: 1028 case LibFunc::memrchr: 1029 if (FTy->getNumParams() != 3) 1030 return false; 1031 setOnlyReadsMemory(F); 1032 setDoesNotThrow(F); 1033 break; 1034 case LibFunc::modf: 1035 case LibFunc::modff: 1036 case LibFunc::modfl: 1037 if (FTy->getNumParams() < 2 || 1038 !FTy->getParamType(1)->isPointerTy()) 1039 return false; 1040 setDoesNotThrow(F); 1041 setDoesNotCapture(F, 2); 1042 break; 1043 case LibFunc::memcpy: 1044 case LibFunc::memccpy: 1045 case LibFunc::memmove: 1046 if (FTy->getNumParams() < 2 || 1047 !FTy->getParamType(1)->isPointerTy()) 1048 return false; 1049 setDoesNotThrow(F); 1050 setDoesNotCapture(F, 2); 1051 setOnlyReadsMemory(F, 2); 1052 break; 1053 case LibFunc::memalign: 1054 if (!FTy->getReturnType()->isPointerTy()) 1055 return false; 1056 setDoesNotAlias(F, 0); 1057 break; 1058 case LibFunc::mkdir: 1059 if (FTy->getNumParams() == 0 || 1060 !FTy->getParamType(0)->isPointerTy()) 1061 return false; 1062 setDoesNotThrow(F); 1063 setDoesNotCapture(F, 1); 1064 setOnlyReadsMemory(F, 1); 1065 break; 1066 case LibFunc::mktime: 1067 if (FTy->getNumParams() == 0 || 1068 !FTy->getParamType(0)->isPointerTy()) 1069 return false; 1070 setDoesNotThrow(F); 1071 setDoesNotCapture(F, 1); 1072 break; 1073 case LibFunc::realloc: 1074 if (FTy->getNumParams() != 2 || 1075 !FTy->getParamType(0)->isPointerTy() || 1076 !FTy->getReturnType()->isPointerTy()) 1077 return false; 1078 setDoesNotThrow(F); 1079 setDoesNotAlias(F, 0); 1080 setDoesNotCapture(F, 1); 1081 break; 1082 case LibFunc::read: 1083 if (FTy->getNumParams() != 3 || 1084 !FTy->getParamType(1)->isPointerTy()) 1085 return false; 1086 // May throw; "read" is a valid pthread cancellation point. 1087 setDoesNotCapture(F, 2); 1088 break; 1089 case LibFunc::rewind: 1090 if (FTy->getNumParams() < 1 || 1091 !FTy->getParamType(0)->isPointerTy()) 1092 return false; 1093 setDoesNotThrow(F); 1094 setDoesNotCapture(F, 1); 1095 break; 1096 case LibFunc::rmdir: 1097 case LibFunc::remove: 1098 case LibFunc::realpath: 1099 if (FTy->getNumParams() < 1 || 1100 !FTy->getParamType(0)->isPointerTy()) 1101 return false; 1102 setDoesNotThrow(F); 1103 setDoesNotCapture(F, 1); 1104 setOnlyReadsMemory(F, 1); 1105 break; 1106 case LibFunc::rename: 1107 if (FTy->getNumParams() < 2 || 1108 !FTy->getParamType(0)->isPointerTy() || 1109 !FTy->getParamType(1)->isPointerTy()) 1110 return false; 1111 setDoesNotThrow(F); 1112 setDoesNotCapture(F, 1); 1113 setDoesNotCapture(F, 2); 1114 setOnlyReadsMemory(F, 1); 1115 setOnlyReadsMemory(F, 2); 1116 break; 1117 case LibFunc::readlink: 1118 if (FTy->getNumParams() < 2 || 1119 !FTy->getParamType(0)->isPointerTy() || 1120 !FTy->getParamType(1)->isPointerTy()) 1121 return false; 1122 setDoesNotThrow(F); 1123 setDoesNotCapture(F, 1); 1124 setDoesNotCapture(F, 2); 1125 setOnlyReadsMemory(F, 1); 1126 break; 1127 case LibFunc::write: 1128 if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy()) 1129 return false; 1130 // May throw; "write" is a valid pthread cancellation point. 1131 setDoesNotCapture(F, 2); 1132 setOnlyReadsMemory(F, 2); 1133 break; 1134 case LibFunc::bcopy: 1135 if (FTy->getNumParams() != 3 || 1136 !FTy->getParamType(0)->isPointerTy() || 1137 !FTy->getParamType(1)->isPointerTy()) 1138 return false; 1139 setDoesNotThrow(F); 1140 setDoesNotCapture(F, 1); 1141 setDoesNotCapture(F, 2); 1142 setOnlyReadsMemory(F, 1); 1143 break; 1144 case LibFunc::bcmp: 1145 if (FTy->getNumParams() != 3 || 1146 !FTy->getParamType(0)->isPointerTy() || 1147 !FTy->getParamType(1)->isPointerTy()) 1148 return false; 1149 setDoesNotThrow(F); 1150 setOnlyReadsMemory(F); 1151 setDoesNotCapture(F, 1); 1152 setDoesNotCapture(F, 2); 1153 break; 1154 case LibFunc::bzero: 1155 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy()) 1156 return false; 1157 setDoesNotThrow(F); 1158 setDoesNotCapture(F, 1); 1159 break; 1160 case LibFunc::calloc: 1161 if (FTy->getNumParams() != 2 || 1162 !FTy->getReturnType()->isPointerTy()) 1163 return false; 1164 setDoesNotThrow(F); 1165 setDoesNotAlias(F, 0); 1166 break; 1167 case LibFunc::chmod: 1168 case LibFunc::chown: 1169 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1170 return false; 1171 setDoesNotThrow(F); 1172 setDoesNotCapture(F, 1); 1173 setOnlyReadsMemory(F, 1); 1174 break; 1175 case LibFunc::ctermid: 1176 case LibFunc::clearerr: 1177 case LibFunc::closedir: 1178 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1179 return false; 1180 setDoesNotThrow(F); 1181 setDoesNotCapture(F, 1); 1182 break; 1183 case LibFunc::atoi: 1184 case LibFunc::atol: 1185 case LibFunc::atof: 1186 case LibFunc::atoll: 1187 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1188 return false; 1189 setDoesNotThrow(F); 1190 setOnlyReadsMemory(F); 1191 setDoesNotCapture(F, 1); 1192 break; 1193 case LibFunc::access: 1194 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy()) 1195 return false; 1196 setDoesNotThrow(F); 1197 setDoesNotCapture(F, 1); 1198 setOnlyReadsMemory(F, 1); 1199 break; 1200 case LibFunc::fopen: 1201 if (FTy->getNumParams() != 2 || 1202 !FTy->getReturnType()->isPointerTy() || 1203 !FTy->getParamType(0)->isPointerTy() || 1204 !FTy->getParamType(1)->isPointerTy()) 1205 return false; 1206 setDoesNotThrow(F); 1207 setDoesNotAlias(F, 0); 1208 setDoesNotCapture(F, 1); 1209 setDoesNotCapture(F, 2); 1210 setOnlyReadsMemory(F, 1); 1211 setOnlyReadsMemory(F, 2); 1212 break; 1213 case LibFunc::fdopen: 1214 if (FTy->getNumParams() != 2 || 1215 !FTy->getReturnType()->isPointerTy() || 1216 !FTy->getParamType(1)->isPointerTy()) 1217 return false; 1218 setDoesNotThrow(F); 1219 setDoesNotAlias(F, 0); 1220 setDoesNotCapture(F, 2); 1221 setOnlyReadsMemory(F, 2); 1222 break; 1223 case LibFunc::feof: 1224 case LibFunc::free: 1225 case LibFunc::fseek: 1226 case LibFunc::ftell: 1227 case LibFunc::fgetc: 1228 case LibFunc::fseeko: 1229 case LibFunc::ftello: 1230 case LibFunc::fileno: 1231 case LibFunc::fflush: 1232 case LibFunc::fclose: 1233 case LibFunc::fsetpos: 1234 case LibFunc::flockfile: 1235 case LibFunc::funlockfile: 1236 case LibFunc::ftrylockfile: 1237 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1238 return false; 1239 setDoesNotThrow(F); 1240 setDoesNotCapture(F, 1); 1241 break; 1242 case LibFunc::ferror: 1243 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1244 return false; 1245 setDoesNotThrow(F); 1246 setDoesNotCapture(F, 1); 1247 setOnlyReadsMemory(F); 1248 break; 1249 case LibFunc::fputc: 1250 case LibFunc::fstat: 1251 case LibFunc::frexp: 1252 case LibFunc::frexpf: 1253 case LibFunc::frexpl: 1254 case LibFunc::fstatvfs: 1255 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1256 return false; 1257 setDoesNotThrow(F); 1258 setDoesNotCapture(F, 2); 1259 break; 1260 case LibFunc::fgets: 1261 if (FTy->getNumParams() != 3 || 1262 !FTy->getParamType(0)->isPointerTy() || 1263 !FTy->getParamType(2)->isPointerTy()) 1264 return false; 1265 setDoesNotThrow(F); 1266 setDoesNotCapture(F, 3); 1267 break; 1268 case LibFunc::fread: 1269 if (FTy->getNumParams() != 4 || 1270 !FTy->getParamType(0)->isPointerTy() || 1271 !FTy->getParamType(3)->isPointerTy()) 1272 return false; 1273 setDoesNotThrow(F); 1274 setDoesNotCapture(F, 1); 1275 setDoesNotCapture(F, 4); 1276 break; 1277 case LibFunc::fwrite: 1278 if (FTy->getNumParams() != 4 || 1279 !FTy->getParamType(0)->isPointerTy() || 1280 !FTy->getParamType(3)->isPointerTy()) 1281 return false; 1282 setDoesNotThrow(F); 1283 setDoesNotCapture(F, 1); 1284 setDoesNotCapture(F, 4); 1285 break; 1286 case LibFunc::fputs: 1287 if (FTy->getNumParams() < 2 || 1288 !FTy->getParamType(0)->isPointerTy() || 1289 !FTy->getParamType(1)->isPointerTy()) 1290 return false; 1291 setDoesNotThrow(F); 1292 setDoesNotCapture(F, 1); 1293 setDoesNotCapture(F, 2); 1294 setOnlyReadsMemory(F, 1); 1295 break; 1296 case LibFunc::fscanf: 1297 case LibFunc::fprintf: 1298 if (FTy->getNumParams() < 2 || 1299 !FTy->getParamType(0)->isPointerTy() || 1300 !FTy->getParamType(1)->isPointerTy()) 1301 return false; 1302 setDoesNotThrow(F); 1303 setDoesNotCapture(F, 1); 1304 setDoesNotCapture(F, 2); 1305 setOnlyReadsMemory(F, 2); 1306 break; 1307 case LibFunc::fgetpos: 1308 if (FTy->getNumParams() < 2 || 1309 !FTy->getParamType(0)->isPointerTy() || 1310 !FTy->getParamType(1)->isPointerTy()) 1311 return false; 1312 setDoesNotThrow(F); 1313 setDoesNotCapture(F, 1); 1314 setDoesNotCapture(F, 2); 1315 break; 1316 case LibFunc::getc: 1317 case LibFunc::getlogin_r: 1318 case LibFunc::getc_unlocked: 1319 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1320 return false; 1321 setDoesNotThrow(F); 1322 setDoesNotCapture(F, 1); 1323 break; 1324 case LibFunc::getenv: 1325 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1326 return false; 1327 setDoesNotThrow(F); 1328 setOnlyReadsMemory(F); 1329 setDoesNotCapture(F, 1); 1330 break; 1331 case LibFunc::gets: 1332 case LibFunc::getchar: 1333 setDoesNotThrow(F); 1334 break; 1335 case LibFunc::getitimer: 1336 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1337 return false; 1338 setDoesNotThrow(F); 1339 setDoesNotCapture(F, 2); 1340 break; 1341 case LibFunc::getpwnam: 1342 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1343 return false; 1344 setDoesNotThrow(F); 1345 setDoesNotCapture(F, 1); 1346 setOnlyReadsMemory(F, 1); 1347 break; 1348 case LibFunc::ungetc: 1349 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1350 return false; 1351 setDoesNotThrow(F); 1352 setDoesNotCapture(F, 2); 1353 break; 1354 case LibFunc::uname: 1355 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1356 return false; 1357 setDoesNotThrow(F); 1358 setDoesNotCapture(F, 1); 1359 break; 1360 case LibFunc::unlink: 1361 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1362 return false; 1363 setDoesNotThrow(F); 1364 setDoesNotCapture(F, 1); 1365 setOnlyReadsMemory(F, 1); 1366 break; 1367 case LibFunc::unsetenv: 1368 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1369 return false; 1370 setDoesNotThrow(F); 1371 setDoesNotCapture(F, 1); 1372 setOnlyReadsMemory(F, 1); 1373 break; 1374 case LibFunc::utime: 1375 case LibFunc::utimes: 1376 if (FTy->getNumParams() != 2 || 1377 !FTy->getParamType(0)->isPointerTy() || 1378 !FTy->getParamType(1)->isPointerTy()) 1379 return false; 1380 setDoesNotThrow(F); 1381 setDoesNotCapture(F, 1); 1382 setDoesNotCapture(F, 2); 1383 setOnlyReadsMemory(F, 1); 1384 setOnlyReadsMemory(F, 2); 1385 break; 1386 case LibFunc::putc: 1387 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1388 return false; 1389 setDoesNotThrow(F); 1390 setDoesNotCapture(F, 2); 1391 break; 1392 case LibFunc::puts: 1393 case LibFunc::printf: 1394 case LibFunc::perror: 1395 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1396 return false; 1397 setDoesNotThrow(F); 1398 setDoesNotCapture(F, 1); 1399 setOnlyReadsMemory(F, 1); 1400 break; 1401 case LibFunc::pread: 1402 if (FTy->getNumParams() != 4 || !FTy->getParamType(1)->isPointerTy()) 1403 return false; 1404 // May throw; "pread" is a valid pthread cancellation point. 1405 setDoesNotCapture(F, 2); 1406 break; 1407 case LibFunc::pwrite: 1408 if (FTy->getNumParams() != 4 || !FTy->getParamType(1)->isPointerTy()) 1409 return false; 1410 // May throw; "pwrite" is a valid pthread cancellation point. 1411 setDoesNotCapture(F, 2); 1412 setOnlyReadsMemory(F, 2); 1413 break; 1414 case LibFunc::putchar: 1415 setDoesNotThrow(F); 1416 break; 1417 case LibFunc::popen: 1418 if (FTy->getNumParams() != 2 || 1419 !FTy->getReturnType()->isPointerTy() || 1420 !FTy->getParamType(0)->isPointerTy() || 1421 !FTy->getParamType(1)->isPointerTy()) 1422 return false; 1423 setDoesNotThrow(F); 1424 setDoesNotAlias(F, 0); 1425 setDoesNotCapture(F, 1); 1426 setDoesNotCapture(F, 2); 1427 setOnlyReadsMemory(F, 1); 1428 setOnlyReadsMemory(F, 2); 1429 break; 1430 case LibFunc::pclose: 1431 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1432 return false; 1433 setDoesNotThrow(F); 1434 setDoesNotCapture(F, 1); 1435 break; 1436 case LibFunc::vscanf: 1437 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1438 return false; 1439 setDoesNotThrow(F); 1440 setDoesNotCapture(F, 1); 1441 setOnlyReadsMemory(F, 1); 1442 break; 1443 case LibFunc::vsscanf: 1444 if (FTy->getNumParams() != 3 || 1445 !FTy->getParamType(1)->isPointerTy() || 1446 !FTy->getParamType(2)->isPointerTy()) 1447 return false; 1448 setDoesNotThrow(F); 1449 setDoesNotCapture(F, 1); 1450 setDoesNotCapture(F, 2); 1451 setOnlyReadsMemory(F, 1); 1452 setOnlyReadsMemory(F, 2); 1453 break; 1454 case LibFunc::vfscanf: 1455 if (FTy->getNumParams() != 3 || 1456 !FTy->getParamType(1)->isPointerTy() || 1457 !FTy->getParamType(2)->isPointerTy()) 1458 return false; 1459 setDoesNotThrow(F); 1460 setDoesNotCapture(F, 1); 1461 setDoesNotCapture(F, 2); 1462 setOnlyReadsMemory(F, 2); 1463 break; 1464 case LibFunc::valloc: 1465 if (!FTy->getReturnType()->isPointerTy()) 1466 return false; 1467 setDoesNotThrow(F); 1468 setDoesNotAlias(F, 0); 1469 break; 1470 case LibFunc::vprintf: 1471 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy()) 1472 return false; 1473 setDoesNotThrow(F); 1474 setDoesNotCapture(F, 1); 1475 setOnlyReadsMemory(F, 1); 1476 break; 1477 case LibFunc::vfprintf: 1478 case LibFunc::vsprintf: 1479 if (FTy->getNumParams() != 3 || 1480 !FTy->getParamType(0)->isPointerTy() || 1481 !FTy->getParamType(1)->isPointerTy()) 1482 return false; 1483 setDoesNotThrow(F); 1484 setDoesNotCapture(F, 1); 1485 setDoesNotCapture(F, 2); 1486 setOnlyReadsMemory(F, 2); 1487 break; 1488 case LibFunc::vsnprintf: 1489 if (FTy->getNumParams() != 4 || 1490 !FTy->getParamType(0)->isPointerTy() || 1491 !FTy->getParamType(2)->isPointerTy()) 1492 return false; 1493 setDoesNotThrow(F); 1494 setDoesNotCapture(F, 1); 1495 setDoesNotCapture(F, 3); 1496 setOnlyReadsMemory(F, 3); 1497 break; 1498 case LibFunc::open: 1499 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy()) 1500 return false; 1501 // May throw; "open" is a valid pthread cancellation point. 1502 setDoesNotCapture(F, 1); 1503 setOnlyReadsMemory(F, 1); 1504 break; 1505 case LibFunc::opendir: 1506 if (FTy->getNumParams() != 1 || 1507 !FTy->getReturnType()->isPointerTy() || 1508 !FTy->getParamType(0)->isPointerTy()) 1509 return false; 1510 setDoesNotThrow(F); 1511 setDoesNotAlias(F, 0); 1512 setDoesNotCapture(F, 1); 1513 setOnlyReadsMemory(F, 1); 1514 break; 1515 case LibFunc::tmpfile: 1516 if (!FTy->getReturnType()->isPointerTy()) 1517 return false; 1518 setDoesNotThrow(F); 1519 setDoesNotAlias(F, 0); 1520 break; 1521 case LibFunc::times: 1522 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1523 return false; 1524 setDoesNotThrow(F); 1525 setDoesNotCapture(F, 1); 1526 break; 1527 case LibFunc::htonl: 1528 case LibFunc::htons: 1529 case LibFunc::ntohl: 1530 case LibFunc::ntohs: 1531 setDoesNotThrow(F); 1532 setDoesNotAccessMemory(F); 1533 break; 1534 case LibFunc::lstat: 1535 if (FTy->getNumParams() != 2 || 1536 !FTy->getParamType(0)->isPointerTy() || 1537 !FTy->getParamType(1)->isPointerTy()) 1538 return false; 1539 setDoesNotThrow(F); 1540 setDoesNotCapture(F, 1); 1541 setDoesNotCapture(F, 2); 1542 setOnlyReadsMemory(F, 1); 1543 break; 1544 case LibFunc::lchown: 1545 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy()) 1546 return false; 1547 setDoesNotThrow(F); 1548 setDoesNotCapture(F, 1); 1549 setOnlyReadsMemory(F, 1); 1550 break; 1551 case LibFunc::qsort: 1552 if (FTy->getNumParams() != 4 || !FTy->getParamType(3)->isPointerTy()) 1553 return false; 1554 // May throw; places call through function pointer. 1555 setDoesNotCapture(F, 4); 1556 break; 1557 case LibFunc::dunder_strdup: 1558 case LibFunc::dunder_strndup: 1559 if (FTy->getNumParams() < 1 || 1560 !FTy->getReturnType()->isPointerTy() || 1561 !FTy->getParamType(0)->isPointerTy()) 1562 return false; 1563 setDoesNotThrow(F); 1564 setDoesNotAlias(F, 0); 1565 setDoesNotCapture(F, 1); 1566 setOnlyReadsMemory(F, 1); 1567 break; 1568 case LibFunc::dunder_strtok_r: 1569 if (FTy->getNumParams() != 3 || 1570 !FTy->getParamType(1)->isPointerTy()) 1571 return false; 1572 setDoesNotThrow(F); 1573 setDoesNotCapture(F, 2); 1574 setOnlyReadsMemory(F, 2); 1575 break; 1576 case LibFunc::under_IO_getc: 1577 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1578 return false; 1579 setDoesNotThrow(F); 1580 setDoesNotCapture(F, 1); 1581 break; 1582 case LibFunc::under_IO_putc: 1583 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1584 return false; 1585 setDoesNotThrow(F); 1586 setDoesNotCapture(F, 2); 1587 break; 1588 case LibFunc::dunder_isoc99_scanf: 1589 if (FTy->getNumParams() < 1 || 1590 !FTy->getParamType(0)->isPointerTy()) 1591 return false; 1592 setDoesNotThrow(F); 1593 setDoesNotCapture(F, 1); 1594 setOnlyReadsMemory(F, 1); 1595 break; 1596 case LibFunc::stat64: 1597 case LibFunc::lstat64: 1598 case LibFunc::statvfs64: 1599 if (FTy->getNumParams() < 1 || 1600 !FTy->getParamType(0)->isPointerTy() || 1601 !FTy->getParamType(1)->isPointerTy()) 1602 return false; 1603 setDoesNotThrow(F); 1604 setDoesNotCapture(F, 1); 1605 setDoesNotCapture(F, 2); 1606 setOnlyReadsMemory(F, 1); 1607 break; 1608 case LibFunc::dunder_isoc99_sscanf: 1609 if (FTy->getNumParams() < 1 || 1610 !FTy->getParamType(0)->isPointerTy() || 1611 !FTy->getParamType(1)->isPointerTy()) 1612 return false; 1613 setDoesNotThrow(F); 1614 setDoesNotCapture(F, 1); 1615 setDoesNotCapture(F, 2); 1616 setOnlyReadsMemory(F, 1); 1617 setOnlyReadsMemory(F, 2); 1618 break; 1619 case LibFunc::fopen64: 1620 if (FTy->getNumParams() != 2 || 1621 !FTy->getReturnType()->isPointerTy() || 1622 !FTy->getParamType(0)->isPointerTy() || 1623 !FTy->getParamType(1)->isPointerTy()) 1624 return false; 1625 setDoesNotThrow(F); 1626 setDoesNotAlias(F, 0); 1627 setDoesNotCapture(F, 1); 1628 setDoesNotCapture(F, 2); 1629 setOnlyReadsMemory(F, 1); 1630 setOnlyReadsMemory(F, 2); 1631 break; 1632 case LibFunc::fseeko64: 1633 case LibFunc::ftello64: 1634 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1635 return false; 1636 setDoesNotThrow(F); 1637 setDoesNotCapture(F, 1); 1638 break; 1639 case LibFunc::tmpfile64: 1640 if (!FTy->getReturnType()->isPointerTy()) 1641 return false; 1642 setDoesNotThrow(F); 1643 setDoesNotAlias(F, 0); 1644 break; 1645 case LibFunc::fstat64: 1646 case LibFunc::fstatvfs64: 1647 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1648 return false; 1649 setDoesNotThrow(F); 1650 setDoesNotCapture(F, 2); 1651 break; 1652 case LibFunc::open64: 1653 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy()) 1654 return false; 1655 // May throw; "open" is a valid pthread cancellation point. 1656 setDoesNotCapture(F, 1); 1657 setOnlyReadsMemory(F, 1); 1658 break; 1659 case LibFunc::gettimeofday: 1660 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() || 1661 !FTy->getParamType(1)->isPointerTy()) 1662 return false; 1663 // Currently some platforms have the restrict keyword on the arguments to 1664 // gettimeofday. To be conservative, do not add noalias to gettimeofday's 1665 // arguments. 1666 setDoesNotThrow(F); 1667 setDoesNotCapture(F, 1); 1668 setDoesNotCapture(F, 2); 1669 break; 1670 default: 1671 // Didn't mark any attributes. 1672 return false; 1673 } 1674 1675 return true; 1676 } 1677 1678 /// annotateLibraryCalls - Adds attributes to well-known standard library 1679 /// call declarations. 1680 bool FunctionAttrs::annotateLibraryCalls(const CallGraphSCC &SCC) { 1681 bool MadeChange = false; 1682 1683 // Check each function in turn annotating well-known library function 1684 // declarations with attributes. 1685 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 1686 Function *F = (*I)->getFunction(); 1687 1688 if (F && F->isDeclaration()) 1689 MadeChange |= inferPrototypeAttributes(*F); 1690 } 1691 1692 return MadeChange; 1693 } 1694 1695 bool FunctionAttrs::runOnSCC(CallGraphSCC &SCC) { 1696 AA = &getAnalysis<AliasAnalysis>(); 1697 TLI = &getAnalysis<TargetLibraryInfo>(); 1698 1699 bool Changed = annotateLibraryCalls(SCC); 1700 Changed |= AddReadAttrs(SCC); 1701 Changed |= AddArgumentAttrs(SCC); 1702 Changed |= AddNoAliasAttrs(SCC); 1703 return Changed; 1704 } 1705