FunctionAttrs.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
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" 35using namespace llvm; 36 37#define DEBUG_TYPE "functionattrs" 38 39STATISTIC(NumReadNone, "Number of functions marked readnone"); 40STATISTIC(NumReadOnly, "Number of functions marked readonly"); 41STATISTIC(NumNoCapture, "Number of arguments marked nocapture"); 42STATISTIC(NumReadNoneArg, "Number of arguments marked readnone"); 43STATISTIC(NumReadOnlyArg, "Number of arguments marked readonly"); 44STATISTIC(NumNoAlias, "Number of function returns marked noalias"); 45STATISTIC(NumAnnotated, "Number of attributes added to library functions"); 46 47namespace { 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 137char FunctionAttrs::ID = 0; 138INITIALIZE_PASS_BEGIN(FunctionAttrs, "functionattrs", 139 "Deduce function attributes", false, false) 140INITIALIZE_AG_DEPENDENCY(AliasAnalysis) 141INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass) 142INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo) 143INITIALIZE_PASS_END(FunctionAttrs, "functionattrs", 144 "Deduce function attributes", false, false) 145 146Pass *llvm::createFunctionAttrsPass() { return new FunctionAttrs(); } 147 148 149/// AddReadAttrs - Deduce readonly/readnone attributes for the SCC. 150bool 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 298namespace { 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 382namespace 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. 410static Attribute::AttrKind 411determinePointerReadAttrs(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 CallSite CS(I); 453 if (CS.doesNotAccessMemory()) 454 continue; 455 456 Function *F = CS.getCalledFunction(); 457 if (!F) { 458 if (CS.onlyReadsMemory()) { 459 IsRead = true; 460 continue; 461 } 462 return Attribute::None; 463 } 464 465 Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end(); 466 CallSite::arg_iterator B = CS.arg_begin(), E = CS.arg_end(); 467 for (CallSite::arg_iterator A = B; A != E; ++A, ++AI) { 468 if (A->get() == V) { 469 if (AI == AE) { 470 assert(F->isVarArg() && 471 "More params than args in non-varargs call."); 472 return Attribute::None; 473 } 474 if (SCCNodes.count(AI)) 475 continue; 476 if (!CS.onlyReadsMemory() && !CS.onlyReadsMemory(A - B)) 477 return Attribute::None; 478 if (!CS.doesNotAccessMemory(A - B)) 479 IsRead = true; 480 } 481 } 482 break; 483 } 484 485 case Instruction::Load: 486 IsRead = true; 487 break; 488 489 case Instruction::ICmp: 490 case Instruction::Ret: 491 break; 492 493 default: 494 return Attribute::None; 495 } 496 } 497 498 return IsRead ? Attribute::ReadOnly : Attribute::ReadNone; 499} 500 501/// AddArgumentAttrs - Deduce nocapture attributes for the SCC. 502bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) { 503 bool Changed = false; 504 505 SmallPtrSet<Function*, 8> SCCNodes; 506 507 // Fill SCCNodes with the elements of the SCC. Used for quickly 508 // looking up whether a given CallGraphNode is in this SCC. 509 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 510 Function *F = (*I)->getFunction(); 511 if (F && !F->isDeclaration() && !F->mayBeOverridden()) 512 SCCNodes.insert(F); 513 } 514 515 ArgumentGraph AG; 516 517 AttrBuilder B; 518 B.addAttribute(Attribute::NoCapture); 519 520 // Check each function in turn, determining which pointer arguments are not 521 // captured. 522 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 523 Function *F = (*I)->getFunction(); 524 525 if (!F) 526 // External node - only a problem for arguments that we pass to it. 527 continue; 528 529 // Definitions with weak linkage may be overridden at linktime with 530 // something that captures pointers, so treat them like declarations. 531 if (F->isDeclaration() || F->mayBeOverridden()) 532 continue; 533 534 // Functions that are readonly (or readnone) and nounwind and don't return 535 // a value can't capture arguments. Don't analyze them. 536 if (F->onlyReadsMemory() && F->doesNotThrow() && 537 F->getReturnType()->isVoidTy()) { 538 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); 539 A != E; ++A) { 540 if (A->getType()->isPointerTy() && !A->hasNoCaptureAttr()) { 541 A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo() + 1, B)); 542 ++NumNoCapture; 543 Changed = true; 544 } 545 } 546 continue; 547 } 548 549 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); 550 A != E; ++A) { 551 if (!A->getType()->isPointerTy()) continue; 552 bool HasNonLocalUses = false; 553 if (!A->hasNoCaptureAttr()) { 554 ArgumentUsesTracker Tracker(SCCNodes); 555 PointerMayBeCaptured(A, &Tracker); 556 if (!Tracker.Captured) { 557 if (Tracker.Uses.empty()) { 558 // If it's trivially not captured, mark it nocapture now. 559 A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo()+1, B)); 560 ++NumNoCapture; 561 Changed = true; 562 } else { 563 // If it's not trivially captured and not trivially not captured, 564 // then it must be calling into another function in our SCC. Save 565 // its particulars for Argument-SCC analysis later. 566 ArgumentGraphNode *Node = AG[A]; 567 for (SmallVectorImpl<Argument*>::iterator UI = Tracker.Uses.begin(), 568 UE = Tracker.Uses.end(); UI != UE; ++UI) { 569 Node->Uses.push_back(AG[*UI]); 570 if (*UI != A) 571 HasNonLocalUses = true; 572 } 573 } 574 } 575 // Otherwise, it's captured. Don't bother doing SCC analysis on it. 576 } 577 if (!HasNonLocalUses && !A->onlyReadsMemory()) { 578 // Can we determine that it's readonly/readnone without doing an SCC? 579 // Note that we don't allow any calls at all here, or else our result 580 // will be dependent on the iteration order through the functions in the 581 // SCC. 582 SmallPtrSet<Argument*, 8> Self; 583 Self.insert(A); 584 Attribute::AttrKind R = determinePointerReadAttrs(A, Self); 585 if (R != Attribute::None) { 586 AttrBuilder B; 587 B.addAttribute(R); 588 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 589 Changed = true; 590 R == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg; 591 } 592 } 593 } 594 } 595 596 // The graph we've collected is partial because we stopped scanning for 597 // argument uses once we solved the argument trivially. These partial nodes 598 // show up as ArgumentGraphNode objects with an empty Uses list, and for 599 // these nodes the final decision about whether they capture has already been 600 // made. If the definition doesn't have a 'nocapture' attribute by now, it 601 // captures. 602 603 for (scc_iterator<ArgumentGraph*> I = scc_begin(&AG); !I.isAtEnd(); ++I) { 604 const std::vector<ArgumentGraphNode *> &ArgumentSCC = *I; 605 if (ArgumentSCC.size() == 1) { 606 if (!ArgumentSCC[0]->Definition) continue; // synthetic root node 607 608 // eg. "void f(int* x) { if (...) f(x); }" 609 if (ArgumentSCC[0]->Uses.size() == 1 && 610 ArgumentSCC[0]->Uses[0] == ArgumentSCC[0]) { 611 Argument *A = ArgumentSCC[0]->Definition; 612 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 613 ++NumNoCapture; 614 Changed = true; 615 } 616 continue; 617 } 618 619 bool SCCCaptured = false; 620 for (auto I = ArgumentSCC.begin(), E = ArgumentSCC.end(); 621 I != E && !SCCCaptured; ++I) { 622 ArgumentGraphNode *Node = *I; 623 if (Node->Uses.empty()) { 624 if (!Node->Definition->hasNoCaptureAttr()) 625 SCCCaptured = true; 626 } 627 } 628 if (SCCCaptured) continue; 629 630 SmallPtrSet<Argument*, 8> ArgumentSCCNodes; 631 // Fill ArgumentSCCNodes with the elements of the ArgumentSCC. Used for 632 // quickly looking up whether a given Argument is in this ArgumentSCC. 633 for (auto I = ArgumentSCC.begin(), E = ArgumentSCC.end(); I != E; ++I) { 634 ArgumentSCCNodes.insert((*I)->Definition); 635 } 636 637 for (auto I = ArgumentSCC.begin(), E = ArgumentSCC.end(); 638 I != E && !SCCCaptured; ++I) { 639 ArgumentGraphNode *N = *I; 640 for (SmallVectorImpl<ArgumentGraphNode*>::iterator UI = N->Uses.begin(), 641 UE = N->Uses.end(); UI != UE; ++UI) { 642 Argument *A = (*UI)->Definition; 643 if (A->hasNoCaptureAttr() || ArgumentSCCNodes.count(A)) 644 continue; 645 SCCCaptured = true; 646 break; 647 } 648 } 649 if (SCCCaptured) continue; 650 651 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) { 652 Argument *A = ArgumentSCC[i]->Definition; 653 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 654 ++NumNoCapture; 655 Changed = true; 656 } 657 658 // We also want to compute readonly/readnone. With a small number of false 659 // negatives, we can assume that any pointer which is captured isn't going 660 // to be provably readonly or readnone, since by definition we can't 661 // analyze all uses of a captured pointer. 662 // 663 // The false negatives happen when the pointer is captured by a function 664 // that promises readonly/readnone behaviour on the pointer, then the 665 // pointer's lifetime ends before anything that writes to arbitrary memory. 666 // Also, a readonly/readnone pointer may be returned, but returning a 667 // pointer is capturing it. 668 669 Attribute::AttrKind ReadAttr = Attribute::ReadNone; 670 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) { 671 Argument *A = ArgumentSCC[i]->Definition; 672 Attribute::AttrKind K = determinePointerReadAttrs(A, ArgumentSCCNodes); 673 if (K == Attribute::ReadNone) 674 continue; 675 if (K == Attribute::ReadOnly) { 676 ReadAttr = Attribute::ReadOnly; 677 continue; 678 } 679 ReadAttr = K; 680 break; 681 } 682 683 if (ReadAttr != Attribute::None) { 684 AttrBuilder B; 685 B.addAttribute(ReadAttr); 686 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) { 687 Argument *A = ArgumentSCC[i]->Definition; 688 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B)); 689 ReadAttr == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg; 690 Changed = true; 691 } 692 } 693 } 694 695 return Changed; 696} 697 698/// IsFunctionMallocLike - A function is malloc-like if it returns either null 699/// or a pointer that doesn't alias any other pointer visible to the caller. 700bool FunctionAttrs::IsFunctionMallocLike(Function *F, 701 SmallPtrSet<Function*, 8> &SCCNodes) const { 702 SmallSetVector<Value *, 8> FlowsToReturn; 703 for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) 704 if (ReturnInst *Ret = dyn_cast<ReturnInst>(I->getTerminator())) 705 FlowsToReturn.insert(Ret->getReturnValue()); 706 707 for (unsigned i = 0; i != FlowsToReturn.size(); ++i) { 708 Value *RetVal = FlowsToReturn[i]; 709 710 if (Constant *C = dyn_cast<Constant>(RetVal)) { 711 if (!C->isNullValue() && !isa<UndefValue>(C)) 712 return false; 713 714 continue; 715 } 716 717 if (isa<Argument>(RetVal)) 718 return false; 719 720 if (Instruction *RVI = dyn_cast<Instruction>(RetVal)) 721 switch (RVI->getOpcode()) { 722 // Extend the analysis by looking upwards. 723 case Instruction::BitCast: 724 case Instruction::GetElementPtr: 725 case Instruction::AddrSpaceCast: 726 FlowsToReturn.insert(RVI->getOperand(0)); 727 continue; 728 case Instruction::Select: { 729 SelectInst *SI = cast<SelectInst>(RVI); 730 FlowsToReturn.insert(SI->getTrueValue()); 731 FlowsToReturn.insert(SI->getFalseValue()); 732 continue; 733 } 734 case Instruction::PHI: { 735 PHINode *PN = cast<PHINode>(RVI); 736 for (int i = 0, e = PN->getNumIncomingValues(); i != e; ++i) 737 FlowsToReturn.insert(PN->getIncomingValue(i)); 738 continue; 739 } 740 741 // Check whether the pointer came from an allocation. 742 case Instruction::Alloca: 743 break; 744 case Instruction::Call: 745 case Instruction::Invoke: { 746 CallSite CS(RVI); 747 if (CS.paramHasAttr(0, Attribute::NoAlias)) 748 break; 749 if (CS.getCalledFunction() && 750 SCCNodes.count(CS.getCalledFunction())) 751 break; 752 } // fall-through 753 default: 754 return false; // Did not come from an allocation. 755 } 756 757 if (PointerMayBeCaptured(RetVal, false, /*StoreCaptures=*/false)) 758 return false; 759 } 760 761 return true; 762} 763 764/// AddNoAliasAttrs - Deduce noalias attributes for the SCC. 765bool FunctionAttrs::AddNoAliasAttrs(const CallGraphSCC &SCC) { 766 SmallPtrSet<Function*, 8> SCCNodes; 767 768 // Fill SCCNodes with the elements of the SCC. Used for quickly 769 // looking up whether a given CallGraphNode is in this SCC. 770 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) 771 SCCNodes.insert((*I)->getFunction()); 772 773 // Check each function in turn, determining which functions return noalias 774 // pointers. 775 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 776 Function *F = (*I)->getFunction(); 777 778 if (!F) 779 // External node - skip it; 780 return false; 781 782 // Already noalias. 783 if (F->doesNotAlias(0)) 784 continue; 785 786 // Definitions with weak linkage may be overridden at linktime, so 787 // treat them like declarations. 788 if (F->isDeclaration() || F->mayBeOverridden()) 789 return false; 790 791 // We annotate noalias return values, which are only applicable to 792 // pointer types. 793 if (!F->getReturnType()->isPointerTy()) 794 continue; 795 796 if (!IsFunctionMallocLike(F, SCCNodes)) 797 return false; 798 } 799 800 bool MadeChange = false; 801 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 802 Function *F = (*I)->getFunction(); 803 if (F->doesNotAlias(0) || !F->getReturnType()->isPointerTy()) 804 continue; 805 806 F->setDoesNotAlias(0); 807 ++NumNoAlias; 808 MadeChange = true; 809 } 810 811 return MadeChange; 812} 813 814/// inferPrototypeAttributes - Analyze the name and prototype of the 815/// given function and set any applicable attributes. Returns true 816/// if any attributes were set and false otherwise. 817bool FunctionAttrs::inferPrototypeAttributes(Function &F) { 818 FunctionType *FTy = F.getFunctionType(); 819 LibFunc::Func TheLibFunc; 820 if (!(TLI->getLibFunc(F.getName(), TheLibFunc) && TLI->has(TheLibFunc))) 821 return false; 822 823 switch (TheLibFunc) { 824 case LibFunc::strlen: 825 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 826 return false; 827 setOnlyReadsMemory(F); 828 setDoesNotThrow(F); 829 setDoesNotCapture(F, 1); 830 break; 831 case LibFunc::strchr: 832 case LibFunc::strrchr: 833 if (FTy->getNumParams() != 2 || 834 !FTy->getParamType(0)->isPointerTy() || 835 !FTy->getParamType(1)->isIntegerTy()) 836 return false; 837 setOnlyReadsMemory(F); 838 setDoesNotThrow(F); 839 break; 840 case LibFunc::strtol: 841 case LibFunc::strtod: 842 case LibFunc::strtof: 843 case LibFunc::strtoul: 844 case LibFunc::strtoll: 845 case LibFunc::strtold: 846 case LibFunc::strtoull: 847 if (FTy->getNumParams() < 2 || 848 !FTy->getParamType(1)->isPointerTy()) 849 return false; 850 setDoesNotThrow(F); 851 setDoesNotCapture(F, 2); 852 setOnlyReadsMemory(F, 1); 853 break; 854 case LibFunc::strcpy: 855 case LibFunc::stpcpy: 856 case LibFunc::strcat: 857 case LibFunc::strncat: 858 case LibFunc::strncpy: 859 case LibFunc::stpncpy: 860 if (FTy->getNumParams() < 2 || 861 !FTy->getParamType(1)->isPointerTy()) 862 return false; 863 setDoesNotThrow(F); 864 setDoesNotCapture(F, 2); 865 setOnlyReadsMemory(F, 2); 866 break; 867 case LibFunc::strxfrm: 868 if (FTy->getNumParams() != 3 || 869 !FTy->getParamType(0)->isPointerTy() || 870 !FTy->getParamType(1)->isPointerTy()) 871 return false; 872 setDoesNotThrow(F); 873 setDoesNotCapture(F, 1); 874 setDoesNotCapture(F, 2); 875 setOnlyReadsMemory(F, 2); 876 break; 877 case LibFunc::strcmp: //0,1 878 case LibFunc::strspn: // 0,1 879 case LibFunc::strncmp: // 0,1 880 case LibFunc::strcspn: //0,1 881 case LibFunc::strcoll: //0,1 882 case LibFunc::strcasecmp: // 0,1 883 case LibFunc::strncasecmp: // 884 if (FTy->getNumParams() < 2 || 885 !FTy->getParamType(0)->isPointerTy() || 886 !FTy->getParamType(1)->isPointerTy()) 887 return false; 888 setOnlyReadsMemory(F); 889 setDoesNotThrow(F); 890 setDoesNotCapture(F, 1); 891 setDoesNotCapture(F, 2); 892 break; 893 case LibFunc::strstr: 894 case LibFunc::strpbrk: 895 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 896 return false; 897 setOnlyReadsMemory(F); 898 setDoesNotThrow(F); 899 setDoesNotCapture(F, 2); 900 break; 901 case LibFunc::strtok: 902 case LibFunc::strtok_r: 903 if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy()) 904 return false; 905 setDoesNotThrow(F); 906 setDoesNotCapture(F, 2); 907 setOnlyReadsMemory(F, 2); 908 break; 909 case LibFunc::scanf: 910 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy()) 911 return false; 912 setDoesNotThrow(F); 913 setDoesNotCapture(F, 1); 914 setOnlyReadsMemory(F, 1); 915 break; 916 case LibFunc::setbuf: 917 case LibFunc::setvbuf: 918 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy()) 919 return false; 920 setDoesNotThrow(F); 921 setDoesNotCapture(F, 1); 922 break; 923 case LibFunc::strdup: 924 case LibFunc::strndup: 925 if (FTy->getNumParams() < 1 || !FTy->getReturnType()->isPointerTy() || 926 !FTy->getParamType(0)->isPointerTy()) 927 return false; 928 setDoesNotThrow(F); 929 setDoesNotAlias(F, 0); 930 setDoesNotCapture(F, 1); 931 setOnlyReadsMemory(F, 1); 932 break; 933 case LibFunc::stat: 934 case LibFunc::statvfs: 935 if (FTy->getNumParams() < 2 || 936 !FTy->getParamType(0)->isPointerTy() || 937 !FTy->getParamType(1)->isPointerTy()) 938 return false; 939 setDoesNotThrow(F); 940 setDoesNotCapture(F, 1); 941 setDoesNotCapture(F, 2); 942 setOnlyReadsMemory(F, 1); 943 break; 944 case LibFunc::sscanf: 945 if (FTy->getNumParams() < 2 || 946 !FTy->getParamType(0)->isPointerTy() || 947 !FTy->getParamType(1)->isPointerTy()) 948 return false; 949 setDoesNotThrow(F); 950 setDoesNotCapture(F, 1); 951 setDoesNotCapture(F, 2); 952 setOnlyReadsMemory(F, 1); 953 setOnlyReadsMemory(F, 2); 954 break; 955 case LibFunc::sprintf: 956 if (FTy->getNumParams() < 2 || 957 !FTy->getParamType(0)->isPointerTy() || 958 !FTy->getParamType(1)->isPointerTy()) 959 return false; 960 setDoesNotThrow(F); 961 setDoesNotCapture(F, 1); 962 setDoesNotCapture(F, 2); 963 setOnlyReadsMemory(F, 2); 964 break; 965 case LibFunc::snprintf: 966 if (FTy->getNumParams() != 3 || 967 !FTy->getParamType(0)->isPointerTy() || 968 !FTy->getParamType(2)->isPointerTy()) 969 return false; 970 setDoesNotThrow(F); 971 setDoesNotCapture(F, 1); 972 setDoesNotCapture(F, 3); 973 setOnlyReadsMemory(F, 3); 974 break; 975 case LibFunc::setitimer: 976 if (FTy->getNumParams() != 3 || 977 !FTy->getParamType(1)->isPointerTy() || 978 !FTy->getParamType(2)->isPointerTy()) 979 return false; 980 setDoesNotThrow(F); 981 setDoesNotCapture(F, 2); 982 setDoesNotCapture(F, 3); 983 setOnlyReadsMemory(F, 2); 984 break; 985 case LibFunc::system: 986 if (FTy->getNumParams() != 1 || 987 !FTy->getParamType(0)->isPointerTy()) 988 return false; 989 // May throw; "system" is a valid pthread cancellation point. 990 setDoesNotCapture(F, 1); 991 setOnlyReadsMemory(F, 1); 992 break; 993 case LibFunc::malloc: 994 if (FTy->getNumParams() != 1 || 995 !FTy->getReturnType()->isPointerTy()) 996 return false; 997 setDoesNotThrow(F); 998 setDoesNotAlias(F, 0); 999 break; 1000 case LibFunc::memcmp: 1001 if (FTy->getNumParams() != 3 || 1002 !FTy->getParamType(0)->isPointerTy() || 1003 !FTy->getParamType(1)->isPointerTy()) 1004 return false; 1005 setOnlyReadsMemory(F); 1006 setDoesNotThrow(F); 1007 setDoesNotCapture(F, 1); 1008 setDoesNotCapture(F, 2); 1009 break; 1010 case LibFunc::memchr: 1011 case LibFunc::memrchr: 1012 if (FTy->getNumParams() != 3) 1013 return false; 1014 setOnlyReadsMemory(F); 1015 setDoesNotThrow(F); 1016 break; 1017 case LibFunc::modf: 1018 case LibFunc::modff: 1019 case LibFunc::modfl: 1020 if (FTy->getNumParams() < 2 || 1021 !FTy->getParamType(1)->isPointerTy()) 1022 return false; 1023 setDoesNotThrow(F); 1024 setDoesNotCapture(F, 2); 1025 break; 1026 case LibFunc::memcpy: 1027 case LibFunc::memccpy: 1028 case LibFunc::memmove: 1029 if (FTy->getNumParams() < 2 || 1030 !FTy->getParamType(1)->isPointerTy()) 1031 return false; 1032 setDoesNotThrow(F); 1033 setDoesNotCapture(F, 2); 1034 setOnlyReadsMemory(F, 2); 1035 break; 1036 case LibFunc::memalign: 1037 if (!FTy->getReturnType()->isPointerTy()) 1038 return false; 1039 setDoesNotAlias(F, 0); 1040 break; 1041 case LibFunc::mkdir: 1042 if (FTy->getNumParams() == 0 || 1043 !FTy->getParamType(0)->isPointerTy()) 1044 return false; 1045 setDoesNotThrow(F); 1046 setDoesNotCapture(F, 1); 1047 setOnlyReadsMemory(F, 1); 1048 break; 1049 case LibFunc::mktime: 1050 if (FTy->getNumParams() == 0 || 1051 !FTy->getParamType(0)->isPointerTy()) 1052 return false; 1053 setDoesNotThrow(F); 1054 setDoesNotCapture(F, 1); 1055 break; 1056 case LibFunc::realloc: 1057 if (FTy->getNumParams() != 2 || 1058 !FTy->getParamType(0)->isPointerTy() || 1059 !FTy->getReturnType()->isPointerTy()) 1060 return false; 1061 setDoesNotThrow(F); 1062 setDoesNotAlias(F, 0); 1063 setDoesNotCapture(F, 1); 1064 break; 1065 case LibFunc::read: 1066 if (FTy->getNumParams() != 3 || 1067 !FTy->getParamType(1)->isPointerTy()) 1068 return false; 1069 // May throw; "read" is a valid pthread cancellation point. 1070 setDoesNotCapture(F, 2); 1071 break; 1072 case LibFunc::rewind: 1073 if (FTy->getNumParams() < 1 || 1074 !FTy->getParamType(0)->isPointerTy()) 1075 return false; 1076 setDoesNotThrow(F); 1077 setDoesNotCapture(F, 1); 1078 break; 1079 case LibFunc::rmdir: 1080 case LibFunc::remove: 1081 case LibFunc::realpath: 1082 if (FTy->getNumParams() < 1 || 1083 !FTy->getParamType(0)->isPointerTy()) 1084 return false; 1085 setDoesNotThrow(F); 1086 setDoesNotCapture(F, 1); 1087 setOnlyReadsMemory(F, 1); 1088 break; 1089 case LibFunc::rename: 1090 if (FTy->getNumParams() < 2 || 1091 !FTy->getParamType(0)->isPointerTy() || 1092 !FTy->getParamType(1)->isPointerTy()) 1093 return false; 1094 setDoesNotThrow(F); 1095 setDoesNotCapture(F, 1); 1096 setDoesNotCapture(F, 2); 1097 setOnlyReadsMemory(F, 1); 1098 setOnlyReadsMemory(F, 2); 1099 break; 1100 case LibFunc::readlink: 1101 if (FTy->getNumParams() < 2 || 1102 !FTy->getParamType(0)->isPointerTy() || 1103 !FTy->getParamType(1)->isPointerTy()) 1104 return false; 1105 setDoesNotThrow(F); 1106 setDoesNotCapture(F, 1); 1107 setDoesNotCapture(F, 2); 1108 setOnlyReadsMemory(F, 1); 1109 break; 1110 case LibFunc::write: 1111 if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy()) 1112 return false; 1113 // May throw; "write" is a valid pthread cancellation point. 1114 setDoesNotCapture(F, 2); 1115 setOnlyReadsMemory(F, 2); 1116 break; 1117 case LibFunc::bcopy: 1118 if (FTy->getNumParams() != 3 || 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::bcmp: 1128 if (FTy->getNumParams() != 3 || 1129 !FTy->getParamType(0)->isPointerTy() || 1130 !FTy->getParamType(1)->isPointerTy()) 1131 return false; 1132 setDoesNotThrow(F); 1133 setOnlyReadsMemory(F); 1134 setDoesNotCapture(F, 1); 1135 setDoesNotCapture(F, 2); 1136 break; 1137 case LibFunc::bzero: 1138 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy()) 1139 return false; 1140 setDoesNotThrow(F); 1141 setDoesNotCapture(F, 1); 1142 break; 1143 case LibFunc::calloc: 1144 if (FTy->getNumParams() != 2 || 1145 !FTy->getReturnType()->isPointerTy()) 1146 return false; 1147 setDoesNotThrow(F); 1148 setDoesNotAlias(F, 0); 1149 break; 1150 case LibFunc::chmod: 1151 case LibFunc::chown: 1152 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1153 return false; 1154 setDoesNotThrow(F); 1155 setDoesNotCapture(F, 1); 1156 setOnlyReadsMemory(F, 1); 1157 break; 1158 case LibFunc::ctermid: 1159 case LibFunc::clearerr: 1160 case LibFunc::closedir: 1161 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1162 return false; 1163 setDoesNotThrow(F); 1164 setDoesNotCapture(F, 1); 1165 break; 1166 case LibFunc::atoi: 1167 case LibFunc::atol: 1168 case LibFunc::atof: 1169 case LibFunc::atoll: 1170 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1171 return false; 1172 setDoesNotThrow(F); 1173 setOnlyReadsMemory(F); 1174 setDoesNotCapture(F, 1); 1175 break; 1176 case LibFunc::access: 1177 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy()) 1178 return false; 1179 setDoesNotThrow(F); 1180 setDoesNotCapture(F, 1); 1181 setOnlyReadsMemory(F, 1); 1182 break; 1183 case LibFunc::fopen: 1184 if (FTy->getNumParams() != 2 || 1185 !FTy->getReturnType()->isPointerTy() || 1186 !FTy->getParamType(0)->isPointerTy() || 1187 !FTy->getParamType(1)->isPointerTy()) 1188 return false; 1189 setDoesNotThrow(F); 1190 setDoesNotAlias(F, 0); 1191 setDoesNotCapture(F, 1); 1192 setDoesNotCapture(F, 2); 1193 setOnlyReadsMemory(F, 1); 1194 setOnlyReadsMemory(F, 2); 1195 break; 1196 case LibFunc::fdopen: 1197 if (FTy->getNumParams() != 2 || 1198 !FTy->getReturnType()->isPointerTy() || 1199 !FTy->getParamType(1)->isPointerTy()) 1200 return false; 1201 setDoesNotThrow(F); 1202 setDoesNotAlias(F, 0); 1203 setDoesNotCapture(F, 2); 1204 setOnlyReadsMemory(F, 2); 1205 break; 1206 case LibFunc::feof: 1207 case LibFunc::free: 1208 case LibFunc::fseek: 1209 case LibFunc::ftell: 1210 case LibFunc::fgetc: 1211 case LibFunc::fseeko: 1212 case LibFunc::ftello: 1213 case LibFunc::fileno: 1214 case LibFunc::fflush: 1215 case LibFunc::fclose: 1216 case LibFunc::fsetpos: 1217 case LibFunc::flockfile: 1218 case LibFunc::funlockfile: 1219 case LibFunc::ftrylockfile: 1220 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1221 return false; 1222 setDoesNotThrow(F); 1223 setDoesNotCapture(F, 1); 1224 break; 1225 case LibFunc::ferror: 1226 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1227 return false; 1228 setDoesNotThrow(F); 1229 setDoesNotCapture(F, 1); 1230 setOnlyReadsMemory(F); 1231 break; 1232 case LibFunc::fputc: 1233 case LibFunc::fstat: 1234 case LibFunc::frexp: 1235 case LibFunc::frexpf: 1236 case LibFunc::frexpl: 1237 case LibFunc::fstatvfs: 1238 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1239 return false; 1240 setDoesNotThrow(F); 1241 setDoesNotCapture(F, 2); 1242 break; 1243 case LibFunc::fgets: 1244 if (FTy->getNumParams() != 3 || 1245 !FTy->getParamType(0)->isPointerTy() || 1246 !FTy->getParamType(2)->isPointerTy()) 1247 return false; 1248 setDoesNotThrow(F); 1249 setDoesNotCapture(F, 3); 1250 break; 1251 case LibFunc::fread: 1252 if (FTy->getNumParams() != 4 || 1253 !FTy->getParamType(0)->isPointerTy() || 1254 !FTy->getParamType(3)->isPointerTy()) 1255 return false; 1256 setDoesNotThrow(F); 1257 setDoesNotCapture(F, 1); 1258 setDoesNotCapture(F, 4); 1259 break; 1260 case LibFunc::fwrite: 1261 if (FTy->getNumParams() != 4 || 1262 !FTy->getParamType(0)->isPointerTy() || 1263 !FTy->getParamType(3)->isPointerTy()) 1264 return false; 1265 setDoesNotThrow(F); 1266 setDoesNotCapture(F, 1); 1267 setDoesNotCapture(F, 4); 1268 break; 1269 case LibFunc::fputs: 1270 if (FTy->getNumParams() < 2 || 1271 !FTy->getParamType(0)->isPointerTy() || 1272 !FTy->getParamType(1)->isPointerTy()) 1273 return false; 1274 setDoesNotThrow(F); 1275 setDoesNotCapture(F, 1); 1276 setDoesNotCapture(F, 2); 1277 setOnlyReadsMemory(F, 1); 1278 break; 1279 case LibFunc::fscanf: 1280 case LibFunc::fprintf: 1281 if (FTy->getNumParams() < 2 || 1282 !FTy->getParamType(0)->isPointerTy() || 1283 !FTy->getParamType(1)->isPointerTy()) 1284 return false; 1285 setDoesNotThrow(F); 1286 setDoesNotCapture(F, 1); 1287 setDoesNotCapture(F, 2); 1288 setOnlyReadsMemory(F, 2); 1289 break; 1290 case LibFunc::fgetpos: 1291 if (FTy->getNumParams() < 2 || 1292 !FTy->getParamType(0)->isPointerTy() || 1293 !FTy->getParamType(1)->isPointerTy()) 1294 return false; 1295 setDoesNotThrow(F); 1296 setDoesNotCapture(F, 1); 1297 setDoesNotCapture(F, 2); 1298 break; 1299 case LibFunc::getc: 1300 case LibFunc::getlogin_r: 1301 case LibFunc::getc_unlocked: 1302 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1303 return false; 1304 setDoesNotThrow(F); 1305 setDoesNotCapture(F, 1); 1306 break; 1307 case LibFunc::getenv: 1308 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1309 return false; 1310 setDoesNotThrow(F); 1311 setOnlyReadsMemory(F); 1312 setDoesNotCapture(F, 1); 1313 break; 1314 case LibFunc::gets: 1315 case LibFunc::getchar: 1316 setDoesNotThrow(F); 1317 break; 1318 case LibFunc::getitimer: 1319 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1320 return false; 1321 setDoesNotThrow(F); 1322 setDoesNotCapture(F, 2); 1323 break; 1324 case LibFunc::getpwnam: 1325 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1326 return false; 1327 setDoesNotThrow(F); 1328 setDoesNotCapture(F, 1); 1329 setOnlyReadsMemory(F, 1); 1330 break; 1331 case LibFunc::ungetc: 1332 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1333 return false; 1334 setDoesNotThrow(F); 1335 setDoesNotCapture(F, 2); 1336 break; 1337 case LibFunc::uname: 1338 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1339 return false; 1340 setDoesNotThrow(F); 1341 setDoesNotCapture(F, 1); 1342 break; 1343 case LibFunc::unlink: 1344 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1345 return false; 1346 setDoesNotThrow(F); 1347 setDoesNotCapture(F, 1); 1348 setOnlyReadsMemory(F, 1); 1349 break; 1350 case LibFunc::unsetenv: 1351 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1352 return false; 1353 setDoesNotThrow(F); 1354 setDoesNotCapture(F, 1); 1355 setOnlyReadsMemory(F, 1); 1356 break; 1357 case LibFunc::utime: 1358 case LibFunc::utimes: 1359 if (FTy->getNumParams() != 2 || 1360 !FTy->getParamType(0)->isPointerTy() || 1361 !FTy->getParamType(1)->isPointerTy()) 1362 return false; 1363 setDoesNotThrow(F); 1364 setDoesNotCapture(F, 1); 1365 setDoesNotCapture(F, 2); 1366 setOnlyReadsMemory(F, 1); 1367 setOnlyReadsMemory(F, 2); 1368 break; 1369 case LibFunc::putc: 1370 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1371 return false; 1372 setDoesNotThrow(F); 1373 setDoesNotCapture(F, 2); 1374 break; 1375 case LibFunc::puts: 1376 case LibFunc::printf: 1377 case LibFunc::perror: 1378 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1379 return false; 1380 setDoesNotThrow(F); 1381 setDoesNotCapture(F, 1); 1382 setOnlyReadsMemory(F, 1); 1383 break; 1384 case LibFunc::pread: 1385 if (FTy->getNumParams() != 4 || !FTy->getParamType(1)->isPointerTy()) 1386 return false; 1387 // May throw; "pread" is a valid pthread cancellation point. 1388 setDoesNotCapture(F, 2); 1389 break; 1390 case LibFunc::pwrite: 1391 if (FTy->getNumParams() != 4 || !FTy->getParamType(1)->isPointerTy()) 1392 return false; 1393 // May throw; "pwrite" is a valid pthread cancellation point. 1394 setDoesNotCapture(F, 2); 1395 setOnlyReadsMemory(F, 2); 1396 break; 1397 case LibFunc::putchar: 1398 setDoesNotThrow(F); 1399 break; 1400 case LibFunc::popen: 1401 if (FTy->getNumParams() != 2 || 1402 !FTy->getReturnType()->isPointerTy() || 1403 !FTy->getParamType(0)->isPointerTy() || 1404 !FTy->getParamType(1)->isPointerTy()) 1405 return false; 1406 setDoesNotThrow(F); 1407 setDoesNotAlias(F, 0); 1408 setDoesNotCapture(F, 1); 1409 setDoesNotCapture(F, 2); 1410 setOnlyReadsMemory(F, 1); 1411 setOnlyReadsMemory(F, 2); 1412 break; 1413 case LibFunc::pclose: 1414 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1415 return false; 1416 setDoesNotThrow(F); 1417 setDoesNotCapture(F, 1); 1418 break; 1419 case LibFunc::vscanf: 1420 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1421 return false; 1422 setDoesNotThrow(F); 1423 setDoesNotCapture(F, 1); 1424 setOnlyReadsMemory(F, 1); 1425 break; 1426 case LibFunc::vsscanf: 1427 if (FTy->getNumParams() != 3 || 1428 !FTy->getParamType(1)->isPointerTy() || 1429 !FTy->getParamType(2)->isPointerTy()) 1430 return false; 1431 setDoesNotThrow(F); 1432 setDoesNotCapture(F, 1); 1433 setDoesNotCapture(F, 2); 1434 setOnlyReadsMemory(F, 1); 1435 setOnlyReadsMemory(F, 2); 1436 break; 1437 case LibFunc::vfscanf: 1438 if (FTy->getNumParams() != 3 || 1439 !FTy->getParamType(1)->isPointerTy() || 1440 !FTy->getParamType(2)->isPointerTy()) 1441 return false; 1442 setDoesNotThrow(F); 1443 setDoesNotCapture(F, 1); 1444 setDoesNotCapture(F, 2); 1445 setOnlyReadsMemory(F, 2); 1446 break; 1447 case LibFunc::valloc: 1448 if (!FTy->getReturnType()->isPointerTy()) 1449 return false; 1450 setDoesNotThrow(F); 1451 setDoesNotAlias(F, 0); 1452 break; 1453 case LibFunc::vprintf: 1454 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy()) 1455 return false; 1456 setDoesNotThrow(F); 1457 setDoesNotCapture(F, 1); 1458 setOnlyReadsMemory(F, 1); 1459 break; 1460 case LibFunc::vfprintf: 1461 case LibFunc::vsprintf: 1462 if (FTy->getNumParams() != 3 || 1463 !FTy->getParamType(0)->isPointerTy() || 1464 !FTy->getParamType(1)->isPointerTy()) 1465 return false; 1466 setDoesNotThrow(F); 1467 setDoesNotCapture(F, 1); 1468 setDoesNotCapture(F, 2); 1469 setOnlyReadsMemory(F, 2); 1470 break; 1471 case LibFunc::vsnprintf: 1472 if (FTy->getNumParams() != 4 || 1473 !FTy->getParamType(0)->isPointerTy() || 1474 !FTy->getParamType(2)->isPointerTy()) 1475 return false; 1476 setDoesNotThrow(F); 1477 setDoesNotCapture(F, 1); 1478 setDoesNotCapture(F, 3); 1479 setOnlyReadsMemory(F, 3); 1480 break; 1481 case LibFunc::open: 1482 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy()) 1483 return false; 1484 // May throw; "open" is a valid pthread cancellation point. 1485 setDoesNotCapture(F, 1); 1486 setOnlyReadsMemory(F, 1); 1487 break; 1488 case LibFunc::opendir: 1489 if (FTy->getNumParams() != 1 || 1490 !FTy->getReturnType()->isPointerTy() || 1491 !FTy->getParamType(0)->isPointerTy()) 1492 return false; 1493 setDoesNotThrow(F); 1494 setDoesNotAlias(F, 0); 1495 setDoesNotCapture(F, 1); 1496 setOnlyReadsMemory(F, 1); 1497 break; 1498 case LibFunc::tmpfile: 1499 if (!FTy->getReturnType()->isPointerTy()) 1500 return false; 1501 setDoesNotThrow(F); 1502 setDoesNotAlias(F, 0); 1503 break; 1504 case LibFunc::times: 1505 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1506 return false; 1507 setDoesNotThrow(F); 1508 setDoesNotCapture(F, 1); 1509 break; 1510 case LibFunc::htonl: 1511 case LibFunc::htons: 1512 case LibFunc::ntohl: 1513 case LibFunc::ntohs: 1514 setDoesNotThrow(F); 1515 setDoesNotAccessMemory(F); 1516 break; 1517 case LibFunc::lstat: 1518 if (FTy->getNumParams() != 2 || 1519 !FTy->getParamType(0)->isPointerTy() || 1520 !FTy->getParamType(1)->isPointerTy()) 1521 return false; 1522 setDoesNotThrow(F); 1523 setDoesNotCapture(F, 1); 1524 setDoesNotCapture(F, 2); 1525 setOnlyReadsMemory(F, 1); 1526 break; 1527 case LibFunc::lchown: 1528 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy()) 1529 return false; 1530 setDoesNotThrow(F); 1531 setDoesNotCapture(F, 1); 1532 setOnlyReadsMemory(F, 1); 1533 break; 1534 case LibFunc::qsort: 1535 if (FTy->getNumParams() != 4 || !FTy->getParamType(3)->isPointerTy()) 1536 return false; 1537 // May throw; places call through function pointer. 1538 setDoesNotCapture(F, 4); 1539 break; 1540 case LibFunc::dunder_strdup: 1541 case LibFunc::dunder_strndup: 1542 if (FTy->getNumParams() < 1 || 1543 !FTy->getReturnType()->isPointerTy() || 1544 !FTy->getParamType(0)->isPointerTy()) 1545 return false; 1546 setDoesNotThrow(F); 1547 setDoesNotAlias(F, 0); 1548 setDoesNotCapture(F, 1); 1549 setOnlyReadsMemory(F, 1); 1550 break; 1551 case LibFunc::dunder_strtok_r: 1552 if (FTy->getNumParams() != 3 || 1553 !FTy->getParamType(1)->isPointerTy()) 1554 return false; 1555 setDoesNotThrow(F); 1556 setDoesNotCapture(F, 2); 1557 setOnlyReadsMemory(F, 2); 1558 break; 1559 case LibFunc::under_IO_getc: 1560 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy()) 1561 return false; 1562 setDoesNotThrow(F); 1563 setDoesNotCapture(F, 1); 1564 break; 1565 case LibFunc::under_IO_putc: 1566 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1567 return false; 1568 setDoesNotThrow(F); 1569 setDoesNotCapture(F, 2); 1570 break; 1571 case LibFunc::dunder_isoc99_scanf: 1572 if (FTy->getNumParams() < 1 || 1573 !FTy->getParamType(0)->isPointerTy()) 1574 return false; 1575 setDoesNotThrow(F); 1576 setDoesNotCapture(F, 1); 1577 setOnlyReadsMemory(F, 1); 1578 break; 1579 case LibFunc::stat64: 1580 case LibFunc::lstat64: 1581 case LibFunc::statvfs64: 1582 if (FTy->getNumParams() < 1 || 1583 !FTy->getParamType(0)->isPointerTy() || 1584 !FTy->getParamType(1)->isPointerTy()) 1585 return false; 1586 setDoesNotThrow(F); 1587 setDoesNotCapture(F, 1); 1588 setDoesNotCapture(F, 2); 1589 setOnlyReadsMemory(F, 1); 1590 break; 1591 case LibFunc::dunder_isoc99_sscanf: 1592 if (FTy->getNumParams() < 1 || 1593 !FTy->getParamType(0)->isPointerTy() || 1594 !FTy->getParamType(1)->isPointerTy()) 1595 return false; 1596 setDoesNotThrow(F); 1597 setDoesNotCapture(F, 1); 1598 setDoesNotCapture(F, 2); 1599 setOnlyReadsMemory(F, 1); 1600 setOnlyReadsMemory(F, 2); 1601 break; 1602 case LibFunc::fopen64: 1603 if (FTy->getNumParams() != 2 || 1604 !FTy->getReturnType()->isPointerTy() || 1605 !FTy->getParamType(0)->isPointerTy() || 1606 !FTy->getParamType(1)->isPointerTy()) 1607 return false; 1608 setDoesNotThrow(F); 1609 setDoesNotAlias(F, 0); 1610 setDoesNotCapture(F, 1); 1611 setDoesNotCapture(F, 2); 1612 setOnlyReadsMemory(F, 1); 1613 setOnlyReadsMemory(F, 2); 1614 break; 1615 case LibFunc::fseeko64: 1616 case LibFunc::ftello64: 1617 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy()) 1618 return false; 1619 setDoesNotThrow(F); 1620 setDoesNotCapture(F, 1); 1621 break; 1622 case LibFunc::tmpfile64: 1623 if (!FTy->getReturnType()->isPointerTy()) 1624 return false; 1625 setDoesNotThrow(F); 1626 setDoesNotAlias(F, 0); 1627 break; 1628 case LibFunc::fstat64: 1629 case LibFunc::fstatvfs64: 1630 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy()) 1631 return false; 1632 setDoesNotThrow(F); 1633 setDoesNotCapture(F, 2); 1634 break; 1635 case LibFunc::open64: 1636 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy()) 1637 return false; 1638 // May throw; "open" is a valid pthread cancellation point. 1639 setDoesNotCapture(F, 1); 1640 setOnlyReadsMemory(F, 1); 1641 break; 1642 case LibFunc::gettimeofday: 1643 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() || 1644 !FTy->getParamType(1)->isPointerTy()) 1645 return false; 1646 // Currently some platforms have the restrict keyword on the arguments to 1647 // gettimeofday. To be conservative, do not add noalias to gettimeofday's 1648 // arguments. 1649 setDoesNotThrow(F); 1650 setDoesNotCapture(F, 1); 1651 setDoesNotCapture(F, 2); 1652 break; 1653 default: 1654 // Didn't mark any attributes. 1655 return false; 1656 } 1657 1658 return true; 1659} 1660 1661/// annotateLibraryCalls - Adds attributes to well-known standard library 1662/// call declarations. 1663bool FunctionAttrs::annotateLibraryCalls(const CallGraphSCC &SCC) { 1664 bool MadeChange = false; 1665 1666 // Check each function in turn annotating well-known library function 1667 // declarations with attributes. 1668 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { 1669 Function *F = (*I)->getFunction(); 1670 1671 if (F && F->isDeclaration()) 1672 MadeChange |= inferPrototypeAttributes(*F); 1673 } 1674 1675 return MadeChange; 1676} 1677 1678bool FunctionAttrs::runOnSCC(CallGraphSCC &SCC) { 1679 AA = &getAnalysis<AliasAnalysis>(); 1680 TLI = &getAnalysis<TargetLibraryInfo>(); 1681 1682 bool Changed = annotateLibraryCalls(SCC); 1683 Changed |= AddReadAttrs(SCC); 1684 Changed |= AddArgumentAttrs(SCC); 1685 Changed |= AddNoAliasAttrs(SCC); 1686 return Changed; 1687} 1688