blob: 7d2b351ae5c569b04dc24bef0d60dd65121cd8df [file] [log] [blame]
Meador Inge6b6a1612013-03-21 00:55:59 +00001//===- FunctionAttrs.cpp - Pass which marks functions attributes ----------===//
Duncan Sands44c8cd92008-12-31 16:14:43 +00002//
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
Nick Lewyckyc2ec0722013-07-06 00:29:58 +000012// 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.
Duncan Sands44c8cd92008-12-31 16:14:43 +000018//
19//===----------------------------------------------------------------------===//
20
Duncan Sands44c8cd92008-12-31 16:14:43 +000021#include "llvm/Transforms/IPO.h"
Nick Lewycky4c378a42011-12-28 23:24:21 +000022#include "llvm/ADT/SCCIterator.h"
Benjamin Kramer15591272012-10-31 13:45:49 +000023#include "llvm/ADT/SetVector.h"
Duncan Sandsb193a372009-01-02 11:54:37 +000024#include "llvm/ADT/SmallSet.h"
Duncan Sands44c8cd92008-12-31 16:14:43 +000025#include "llvm/ADT/Statistic.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000026#include "llvm/Analysis/AliasAnalysis.h"
Chandler Carruth7b560d42015-09-09 17:55:00 +000027#include "llvm/Analysis/AssumptionCache.h"
28#include "llvm/Analysis/BasicAliasAnalysis.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000029#include "llvm/Analysis/CallGraph.h"
Chandler Carruth839a98e2013-01-07 15:26:48 +000030#include "llvm/Analysis/CallGraphSCCPass.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000031#include "llvm/Analysis/CaptureTracking.h"
Chandler Carruth7b560d42015-09-09 17:55:00 +000032#include "llvm/Analysis/TargetLibraryInfo.h"
Philip Reamesa88caea2015-08-31 19:44:38 +000033#include "llvm/Analysis/ValueTracking.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000034#include "llvm/IR/GlobalVariable.h"
Chandler Carruth83948572014-03-04 10:30:26 +000035#include "llvm/IR/InstIterator.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000036#include "llvm/IR/IntrinsicInst.h"
37#include "llvm/IR/LLVMContext.h"
Philip Reamesa88caea2015-08-31 19:44:38 +000038#include "llvm/Support/Debug.h"
Hans Wennborg043bf5b2015-08-31 21:19:18 +000039#include "llvm/Support/raw_ostream.h"
Chandler Carruth62d42152015-01-15 02:16:27 +000040#include "llvm/Analysis/TargetLibraryInfo.h"
Duncan Sands44c8cd92008-12-31 16:14:43 +000041using namespace llvm;
42
Chandler Carruth964daaa2014-04-22 02:55:47 +000043#define DEBUG_TYPE "functionattrs"
44
Duncan Sands44c8cd92008-12-31 16:14:43 +000045STATISTIC(NumReadNone, "Number of functions marked readnone");
46STATISTIC(NumReadOnly, "Number of functions marked readonly");
47STATISTIC(NumNoCapture, "Number of arguments marked nocapture");
Nick Lewyckyc2ec0722013-07-06 00:29:58 +000048STATISTIC(NumReadNoneArg, "Number of arguments marked readnone");
49STATISTIC(NumReadOnlyArg, "Number of arguments marked readonly");
Nick Lewyckyfbed86a2009-03-08 06:20:47 +000050STATISTIC(NumNoAlias, "Number of function returns marked noalias");
Philip Reamesa88caea2015-08-31 19:44:38 +000051STATISTIC(NumNonNullReturn, "Number of function returns marked nonnull");
Meador Inge6b6a1612013-03-21 00:55:59 +000052STATISTIC(NumAnnotated, "Number of attributes added to library functions");
Duncan Sands44c8cd92008-12-31 16:14:43 +000053
54namespace {
Chandler Carruth63559d72015-09-13 06:47:20 +000055struct FunctionAttrs : public CallGraphSCCPass {
56 static char ID; // Pass identification, replacement for typeid
57 FunctionAttrs() : CallGraphSCCPass(ID) {
58 initializeFunctionAttrsPass(*PassRegistry::getPassRegistry());
59 }
60
Chandler Carruth63559d72015-09-13 06:47:20 +000061 bool runOnSCC(CallGraphSCC &SCC) override;
62
Chandler Carruth63559d72015-09-13 06:47:20 +000063 void getAnalysisUsage(AnalysisUsage &AU) const override {
64 AU.setPreservesCFG();
65 AU.addRequired<AssumptionCacheTracker>();
66 AU.addRequired<TargetLibraryInfoWrapperPass>();
67 CallGraphSCCPass::getAnalysisUsage(AU);
68 }
Meador Inge6b6a1612013-03-21 00:55:59 +000069
Chandler Carruth63559d72015-09-13 06:47:20 +000070private:
71 TargetLibraryInfo *TLI;
Chandler Carruthd0245202015-09-13 07:50:43 +000072
73 bool AddReadAttrs(const CallGraphSCC &SCC);
74 bool AddArgumentAttrs(const CallGraphSCC &SCC);
Chandler Carruthd0245202015-09-13 07:50:43 +000075 bool AddNoAliasAttrs(const CallGraphSCC &SCC);
Chandler Carruthd0245202015-09-13 07:50:43 +000076 bool AddNonNullAttrs(const CallGraphSCC &SCC);
Chandler Carruthd0245202015-09-13 07:50:43 +000077 bool annotateLibraryCalls(const CallGraphSCC &SCC);
Chandler Carruth63559d72015-09-13 06:47:20 +000078};
Alexander Kornienkof00654e2015-06-23 09:49:53 +000079}
Duncan Sands44c8cd92008-12-31 16:14:43 +000080
81char FunctionAttrs::ID = 0;
Owen Anderson071cee02010-10-13 22:00:45 +000082INITIALIZE_PASS_BEGIN(FunctionAttrs, "functionattrs",
Chandler Carruth63559d72015-09-13 06:47:20 +000083 "Deduce function attributes", false, false)
Chandler Carruth7b560d42015-09-09 17:55:00 +000084INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
Chandler Carruth6378cf52013-11-26 04:19:30 +000085INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass)
Chandler Carruthb98f63d2015-01-15 10:41:28 +000086INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
Owen Anderson071cee02010-10-13 22:00:45 +000087INITIALIZE_PASS_END(FunctionAttrs, "functionattrs",
Chandler Carruth63559d72015-09-13 06:47:20 +000088 "Deduce function attributes", false, false)
Duncan Sands44c8cd92008-12-31 16:14:43 +000089
90Pass *llvm::createFunctionAttrsPass() { return new FunctionAttrs(); }
91
Chandler Carruth7542d372015-09-21 17:39:41 +000092namespace {
93/// The three kinds of memory access relevant to 'readonly' and
94/// 'readnone' attributes.
95enum MemoryAccessKind {
96 MAK_ReadNone = 0,
97 MAK_ReadOnly = 1,
98 MAK_MayWrite = 2
99};
100}
101
102static MemoryAccessKind
103checkFunctionMemoryAccess(Function &F, AAResults &AAR,
104 const SmallPtrSetImpl<Function *> &SCCNodes) {
105 FunctionModRefBehavior MRB = AAR.getModRefBehavior(&F);
106 if (MRB == FMRB_DoesNotAccessMemory)
107 // Already perfect!
108 return MAK_ReadNone;
109
110 // Definitions with weak linkage may be overridden at linktime with
111 // something that writes memory, so treat them like declarations.
112 if (F.isDeclaration() || F.mayBeOverridden()) {
113 if (AliasAnalysis::onlyReadsMemory(MRB))
114 return MAK_ReadOnly;
115
116 // Conservatively assume it writes to memory.
117 return MAK_MayWrite;
118 }
119
120 // Scan the function body for instructions that may read or write memory.
121 bool ReadsMemory = false;
122 for (inst_iterator II = inst_begin(F), E = inst_end(F); II != E; ++II) {
123 Instruction *I = &*II;
124
125 // Some instructions can be ignored even if they read or write memory.
126 // Detect these now, skipping to the next instruction if one is found.
127 CallSite CS(cast<Value>(I));
128 if (CS) {
129 // Ignore calls to functions in the same SCC.
130 if (CS.getCalledFunction() && SCCNodes.count(CS.getCalledFunction()))
131 continue;
132 FunctionModRefBehavior MRB = AAR.getModRefBehavior(CS);
133 // If the call doesn't access arbitrary memory, we may be able to
134 // figure out something.
135 if (AliasAnalysis::onlyAccessesArgPointees(MRB)) {
136 // If the call does access argument pointees, check each argument.
137 if (AliasAnalysis::doesAccessArgPointees(MRB))
138 // Check whether all pointer arguments point to local memory, and
139 // ignore calls that only access local memory.
140 for (CallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end();
141 CI != CE; ++CI) {
142 Value *Arg = *CI;
143 if (Arg->getType()->isPointerTy()) {
144 AAMDNodes AAInfo;
145 I->getAAMetadata(AAInfo);
146
147 MemoryLocation Loc(Arg, MemoryLocation::UnknownSize, AAInfo);
148 if (!AAR.pointsToConstantMemory(Loc, /*OrLocal=*/true)) {
149 if (MRB & MRI_Mod)
150 // Writes non-local memory. Give up.
151 return MAK_MayWrite;
152 if (MRB & MRI_Ref)
153 // Ok, it reads non-local memory.
154 ReadsMemory = true;
155 }
156 }
157 }
158 continue;
159 }
160 // The call could access any memory. If that includes writes, give up.
161 if (MRB & MRI_Mod)
162 return MAK_MayWrite;
163 // If it reads, note it.
164 if (MRB & MRI_Ref)
165 ReadsMemory = true;
166 continue;
167 } else if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
168 // Ignore non-volatile loads from local memory. (Atomic is okay here.)
169 if (!LI->isVolatile()) {
170 MemoryLocation Loc = MemoryLocation::get(LI);
171 if (AAR.pointsToConstantMemory(Loc, /*OrLocal=*/true))
172 continue;
173 }
174 } else if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
175 // Ignore non-volatile stores to local memory. (Atomic is okay here.)
176 if (!SI->isVolatile()) {
177 MemoryLocation Loc = MemoryLocation::get(SI);
178 if (AAR.pointsToConstantMemory(Loc, /*OrLocal=*/true))
179 continue;
180 }
181 } else if (VAArgInst *VI = dyn_cast<VAArgInst>(I)) {
182 // Ignore vaargs on local memory.
183 MemoryLocation Loc = MemoryLocation::get(VI);
184 if (AAR.pointsToConstantMemory(Loc, /*OrLocal=*/true))
185 continue;
186 }
187
188 // Any remaining instructions need to be taken seriously! Check if they
189 // read or write memory.
190 if (I->mayWriteToMemory())
191 // Writes memory. Just give up.
192 return MAK_MayWrite;
193
194 // If this instruction may read memory, remember that.
195 ReadsMemory |= I->mayReadFromMemory();
196 }
197
198 return ReadsMemory ? MAK_ReadOnly : MAK_ReadNone;
199}
200
Chandler Carrutha632fb92015-09-13 06:57:25 +0000201/// Deduce readonly/readnone attributes for the SCC.
Chris Lattner4422d312010-04-16 22:42:17 +0000202bool FunctionAttrs::AddReadAttrs(const CallGraphSCC &SCC) {
Chandler Carruth63559d72015-09-13 06:47:20 +0000203 SmallPtrSet<Function *, 8> SCCNodes;
Duncan Sands44c8cd92008-12-31 16:14:43 +0000204
205 // Fill SCCNodes with the elements of the SCC. Used for quickly
206 // looking up whether a given CallGraphNode is in this SCC.
Chris Lattner4422d312010-04-16 22:42:17 +0000207 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I)
208 SCCNodes.insert((*I)->getFunction());
Duncan Sands44c8cd92008-12-31 16:14:43 +0000209
210 // Check if any of the functions in the SCC read or write memory. If they
211 // write memory then they can't be marked readnone or readonly.
212 bool ReadsMemory = false;
Chris Lattner4422d312010-04-16 22:42:17 +0000213 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
214 Function *F = (*I)->getFunction();
Duncan Sands44c8cd92008-12-31 16:14:43 +0000215
Chandler Carruth0fb99812014-08-13 10:49:33 +0000216 if (!F || F->hasFnAttribute(Attribute::OptimizeNone))
217 // External node or node we don't want to optimize - assume it may write
218 // memory and give up.
Duncan Sands44c8cd92008-12-31 16:14:43 +0000219 return false;
220
Chandler Carruth7b560d42015-09-09 17:55:00 +0000221 // We need to manually construct BasicAA directly in order to disable its
222 // use of other function analyses.
223 BasicAAResult BAR(createLegacyPMBasicAAResult(*this, *F));
224
225 // Construct our own AA results for this function. We do this manually to
226 // work around the limitations of the legacy pass manager.
227 AAResults AAR(createLegacyPMAAResults(*this, *F, BAR));
228
Chandler Carruth7542d372015-09-21 17:39:41 +0000229 switch (checkFunctionMemoryAccess(*F, AAR, SCCNodes)) {
230 case MAK_MayWrite:
231 return false;
232 case MAK_ReadOnly:
Duncan Sands44c8cd92008-12-31 16:14:43 +0000233 ReadsMemory = true;
Chandler Carruth7542d372015-09-21 17:39:41 +0000234 break;
235 case MAK_ReadNone:
236 // Nothing to do!
237 break;
Duncan Sands44c8cd92008-12-31 16:14:43 +0000238 }
239 }
240
241 // Success! Functions in this SCC do not access memory, or only read memory.
242 // Give them the appropriate attribute.
243 bool MadeChange = false;
Chris Lattner4422d312010-04-16 22:42:17 +0000244 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
245 Function *F = (*I)->getFunction();
Duncan Sands44c8cd92008-12-31 16:14:43 +0000246
247 if (F->doesNotAccessMemory())
248 // Already perfect!
249 continue;
250
251 if (F->onlyReadsMemory() && ReadsMemory)
252 // No change.
253 continue;
254
255 MadeChange = true;
256
257 // Clear out any existing attributes.
Bill Wendling50d27842012-10-15 20:35:56 +0000258 AttrBuilder B;
Chandler Carruth63559d72015-09-13 06:47:20 +0000259 B.addAttribute(Attribute::ReadOnly).addAttribute(Attribute::ReadNone);
260 F->removeAttributes(
261 AttributeSet::FunctionIndex,
262 AttributeSet::get(F->getContext(), AttributeSet::FunctionIndex, B));
Duncan Sands44c8cd92008-12-31 16:14:43 +0000263
264 // Add in the new attribute.
Bill Wendlinge94d8432012-12-07 23:16:57 +0000265 F->addAttribute(AttributeSet::FunctionIndex,
Bill Wendlingc0e2a1f2013-01-23 00:20:53 +0000266 ReadsMemory ? Attribute::ReadOnly : Attribute::ReadNone);
Duncan Sands44c8cd92008-12-31 16:14:43 +0000267
268 if (ReadsMemory)
Duncan Sandscefc8602009-01-02 11:46:24 +0000269 ++NumReadOnly;
Duncan Sands44c8cd92008-12-31 16:14:43 +0000270 else
Duncan Sandscefc8602009-01-02 11:46:24 +0000271 ++NumReadNone;
Duncan Sands44c8cd92008-12-31 16:14:43 +0000272 }
273
274 return MadeChange;
275}
276
Nick Lewycky4c378a42011-12-28 23:24:21 +0000277namespace {
Chandler Carrutha632fb92015-09-13 06:57:25 +0000278/// For a given pointer Argument, this retains a list of Arguments of functions
279/// in the same SCC that the pointer data flows into. We use this to build an
280/// SCC of the arguments.
Chandler Carruth63559d72015-09-13 06:47:20 +0000281struct ArgumentGraphNode {
282 Argument *Definition;
283 SmallVector<ArgumentGraphNode *, 4> Uses;
284};
Nick Lewycky4c378a42011-12-28 23:24:21 +0000285
Chandler Carruth63559d72015-09-13 06:47:20 +0000286class ArgumentGraph {
287 // We store pointers to ArgumentGraphNode objects, so it's important that
288 // that they not move around upon insert.
289 typedef std::map<Argument *, ArgumentGraphNode> ArgumentMapTy;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000290
Chandler Carruth63559d72015-09-13 06:47:20 +0000291 ArgumentMapTy ArgumentMap;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000292
Chandler Carruth63559d72015-09-13 06:47:20 +0000293 // There is no root node for the argument graph, in fact:
294 // void f(int *x, int *y) { if (...) f(x, y); }
295 // is an example where the graph is disconnected. The SCCIterator requires a
296 // single entry point, so we maintain a fake ("synthetic") root node that
297 // uses every node. Because the graph is directed and nothing points into
298 // the root, it will not participate in any SCCs (except for its own).
299 ArgumentGraphNode SyntheticRoot;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000300
Chandler Carruth63559d72015-09-13 06:47:20 +0000301public:
302 ArgumentGraph() { SyntheticRoot.Definition = nullptr; }
Nick Lewycky4c378a42011-12-28 23:24:21 +0000303
Chandler Carruth63559d72015-09-13 06:47:20 +0000304 typedef SmallVectorImpl<ArgumentGraphNode *>::iterator iterator;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000305
Chandler Carruth63559d72015-09-13 06:47:20 +0000306 iterator begin() { return SyntheticRoot.Uses.begin(); }
307 iterator end() { return SyntheticRoot.Uses.end(); }
308 ArgumentGraphNode *getEntryNode() { return &SyntheticRoot; }
Nick Lewycky4c378a42011-12-28 23:24:21 +0000309
Chandler Carruth63559d72015-09-13 06:47:20 +0000310 ArgumentGraphNode *operator[](Argument *A) {
311 ArgumentGraphNode &Node = ArgumentMap[A];
312 Node.Definition = A;
313 SyntheticRoot.Uses.push_back(&Node);
314 return &Node;
315 }
316};
Nick Lewycky4c378a42011-12-28 23:24:21 +0000317
Chandler Carrutha632fb92015-09-13 06:57:25 +0000318/// This tracker checks whether callees are in the SCC, and if so it does not
319/// consider that a capture, instead adding it to the "Uses" list and
320/// continuing with the analysis.
Chandler Carruth63559d72015-09-13 06:47:20 +0000321struct ArgumentUsesTracker : public CaptureTracker {
322 ArgumentUsesTracker(const SmallPtrSet<Function *, 8> &SCCNodes)
Nick Lewycky4c378a42011-12-28 23:24:21 +0000323 : Captured(false), SCCNodes(SCCNodes) {}
324
Chandler Carruth63559d72015-09-13 06:47:20 +0000325 void tooManyUses() override { Captured = true; }
Nick Lewycky4c378a42011-12-28 23:24:21 +0000326
Chandler Carruth63559d72015-09-13 06:47:20 +0000327 bool captured(const Use *U) override {
328 CallSite CS(U->getUser());
329 if (!CS.getInstruction()) {
330 Captured = true;
331 return true;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000332 }
333
Chandler Carruth63559d72015-09-13 06:47:20 +0000334 Function *F = CS.getCalledFunction();
335 if (!F || !SCCNodes.count(F)) {
336 Captured = true;
337 return true;
338 }
Nick Lewycky4c378a42011-12-28 23:24:21 +0000339
Chandler Carruth63559d72015-09-13 06:47:20 +0000340 bool Found = false;
341 Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end();
342 for (CallSite::arg_iterator PI = CS.arg_begin(), PE = CS.arg_end();
343 PI != PE; ++PI, ++AI) {
344 if (AI == AE) {
345 assert(F->isVarArg() && "More params than args in non-varargs call");
346 Captured = true;
347 return true;
348 }
349 if (PI == U) {
350 Uses.push_back(AI);
351 Found = true;
352 break;
353 }
354 }
355 assert(Found && "Capturing call-site captured nothing?");
356 (void)Found;
357 return false;
358 }
359
360 bool Captured; // True only if certainly captured (used outside our SCC).
361 SmallVector<Argument *, 4> Uses; // Uses within our SCC.
362
363 const SmallPtrSet<Function *, 8> &SCCNodes;
364};
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000365}
Nick Lewycky4c378a42011-12-28 23:24:21 +0000366
367namespace llvm {
Chandler Carruth63559d72015-09-13 06:47:20 +0000368template <> struct GraphTraits<ArgumentGraphNode *> {
369 typedef ArgumentGraphNode NodeType;
370 typedef SmallVectorImpl<ArgumentGraphNode *>::iterator ChildIteratorType;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000371
Chandler Carruth63559d72015-09-13 06:47:20 +0000372 static inline NodeType *getEntryNode(NodeType *A) { return A; }
373 static inline ChildIteratorType child_begin(NodeType *N) {
374 return N->Uses.begin();
375 }
376 static inline ChildIteratorType child_end(NodeType *N) {
377 return N->Uses.end();
378 }
379};
380template <>
381struct GraphTraits<ArgumentGraph *> : public GraphTraits<ArgumentGraphNode *> {
382 static NodeType *getEntryNode(ArgumentGraph *AG) {
383 return AG->getEntryNode();
384 }
385 static ChildIteratorType nodes_begin(ArgumentGraph *AG) {
386 return AG->begin();
387 }
388 static ChildIteratorType nodes_end(ArgumentGraph *AG) { return AG->end(); }
389};
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000390}
Nick Lewycky4c378a42011-12-28 23:24:21 +0000391
Chandler Carrutha632fb92015-09-13 06:57:25 +0000392/// Returns Attribute::None, Attribute::ReadOnly or Attribute::ReadNone.
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000393static Attribute::AttrKind
394determinePointerReadAttrs(Argument *A,
Chandler Carruth63559d72015-09-13 06:47:20 +0000395 const SmallPtrSet<Argument *, 8> &SCCNodes) {
396
397 SmallVector<Use *, 32> Worklist;
398 SmallSet<Use *, 32> Visited;
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000399
Reid Kleckner26af2ca2014-01-28 02:38:36 +0000400 // inalloca arguments are always clobbered by the call.
401 if (A->hasInAllocaAttr())
402 return Attribute::None;
403
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000404 bool IsRead = false;
405 // We don't need to track IsWritten. If A is written to, return immediately.
406
Chandler Carruthcdf47882014-03-09 03:16:01 +0000407 for (Use &U : A->uses()) {
Chandler Carruthcdf47882014-03-09 03:16:01 +0000408 Visited.insert(&U);
409 Worklist.push_back(&U);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000410 }
411
412 while (!Worklist.empty()) {
413 Use *U = Worklist.pop_back_val();
414 Instruction *I = cast<Instruction>(U->getUser());
415 Value *V = U->get();
416
417 switch (I->getOpcode()) {
418 case Instruction::BitCast:
419 case Instruction::GetElementPtr:
420 case Instruction::PHI:
421 case Instruction::Select:
Matt Arsenaulte55a2c22014-01-14 19:11:52 +0000422 case Instruction::AddrSpaceCast:
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000423 // The original value is not read/written via this if the new value isn't.
Chandler Carruthcdf47882014-03-09 03:16:01 +0000424 for (Use &UU : I->uses())
David Blaikie70573dc2014-11-19 07:49:26 +0000425 if (Visited.insert(&UU).second)
Chandler Carruthcdf47882014-03-09 03:16:01 +0000426 Worklist.push_back(&UU);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000427 break;
428
429 case Instruction::Call:
430 case Instruction::Invoke: {
Nick Lewycky59633cb2014-05-30 02:31:27 +0000431 bool Captures = true;
432
433 if (I->getType()->isVoidTy())
434 Captures = false;
435
436 auto AddUsersToWorklistIfCapturing = [&] {
437 if (Captures)
438 for (Use &UU : I->uses())
David Blaikie70573dc2014-11-19 07:49:26 +0000439 if (Visited.insert(&UU).second)
Nick Lewycky59633cb2014-05-30 02:31:27 +0000440 Worklist.push_back(&UU);
441 };
442
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000443 CallSite CS(I);
Nick Lewycky59633cb2014-05-30 02:31:27 +0000444 if (CS.doesNotAccessMemory()) {
445 AddUsersToWorklistIfCapturing();
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000446 continue;
Nick Lewycky59633cb2014-05-30 02:31:27 +0000447 }
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000448
449 Function *F = CS.getCalledFunction();
450 if (!F) {
451 if (CS.onlyReadsMemory()) {
452 IsRead = true;
Nick Lewycky59633cb2014-05-30 02:31:27 +0000453 AddUsersToWorklistIfCapturing();
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000454 continue;
455 }
456 return Attribute::None;
457 }
458
459 Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end();
460 CallSite::arg_iterator B = CS.arg_begin(), E = CS.arg_end();
461 for (CallSite::arg_iterator A = B; A != E; ++A, ++AI) {
462 if (A->get() == V) {
463 if (AI == AE) {
464 assert(F->isVarArg() &&
465 "More params than args in non-varargs call.");
466 return Attribute::None;
467 }
Nick Lewycky59633cb2014-05-30 02:31:27 +0000468 Captures &= !CS.doesNotCapture(A - B);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000469 if (SCCNodes.count(AI))
470 continue;
471 if (!CS.onlyReadsMemory() && !CS.onlyReadsMemory(A - B))
472 return Attribute::None;
473 if (!CS.doesNotAccessMemory(A - B))
474 IsRead = true;
475 }
476 }
Nick Lewycky59633cb2014-05-30 02:31:27 +0000477 AddUsersToWorklistIfCapturing();
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000478 break;
479 }
480
481 case Instruction::Load:
482 IsRead = true;
483 break;
484
485 case Instruction::ICmp:
486 case Instruction::Ret:
487 break;
488
489 default:
490 return Attribute::None;
491 }
492 }
493
494 return IsRead ? Attribute::ReadOnly : Attribute::ReadNone;
495}
496
Chandler Carrutha632fb92015-09-13 06:57:25 +0000497/// Deduce nocapture attributes for the SCC.
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000498bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
Duncan Sands44c8cd92008-12-31 16:14:43 +0000499 bool Changed = false;
500
Chandler Carruth63559d72015-09-13 06:47:20 +0000501 SmallPtrSet<Function *, 8> SCCNodes;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000502
503 // Fill SCCNodes with the elements of the SCC. Used for quickly
504 // looking up whether a given CallGraphNode is in this SCC.
505 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
506 Function *F = (*I)->getFunction();
Chandler Carruth0fb99812014-08-13 10:49:33 +0000507 if (F && !F->isDeclaration() && !F->mayBeOverridden() &&
508 !F->hasFnAttribute(Attribute::OptimizeNone))
Nick Lewycky4c378a42011-12-28 23:24:21 +0000509 SCCNodes.insert(F);
510 }
511
512 ArgumentGraph AG;
513
Benjamin Kramer40d7f352013-06-22 16:56:32 +0000514 AttrBuilder B;
515 B.addAttribute(Attribute::NoCapture);
516
Duncan Sands44c8cd92008-12-31 16:14:43 +0000517 // Check each function in turn, determining which pointer arguments are not
518 // captured.
Chris Lattner4422d312010-04-16 22:42:17 +0000519 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
520 Function *F = (*I)->getFunction();
Duncan Sands44c8cd92008-12-31 16:14:43 +0000521
Chandler Carruth0fb99812014-08-13 10:49:33 +0000522 if (!F || F->hasFnAttribute(Attribute::OptimizeNone))
523 // External node or function we're trying not to optimize - only a problem
524 // for arguments that we pass to it.
Duncan Sands44c8cd92008-12-31 16:14:43 +0000525 continue;
526
527 // Definitions with weak linkage may be overridden at linktime with
Nick Lewycky4c378a42011-12-28 23:24:21 +0000528 // something that captures pointers, so treat them like declarations.
Duncan Sands44c8cd92008-12-31 16:14:43 +0000529 if (F->isDeclaration() || F->mayBeOverridden())
530 continue;
531
Nick Lewycky4c378a42011-12-28 23:24:21 +0000532 // Functions that are readonly (or readnone) and nounwind and don't return
533 // a value can't capture arguments. Don't analyze them.
534 if (F->onlyReadsMemory() && F->doesNotThrow() &&
535 F->getReturnType()->isVoidTy()) {
Chandler Carruth63559d72015-09-13 06:47:20 +0000536 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E;
537 ++A) {
Benjamin Kramer40d7f352013-06-22 16:56:32 +0000538 if (A->getType()->isPointerTy() && !A->hasNoCaptureAttr()) {
539 A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo() + 1, B));
540 ++NumNoCapture;
541 Changed = true;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000542 }
Nick Lewycky4c378a42011-12-28 23:24:21 +0000543 }
Benjamin Kramer40d7f352013-06-22 16:56:32 +0000544 continue;
Benjamin Kramer76b7bd02013-06-22 15:51:19 +0000545 }
546
Chandler Carruth63559d72015-09-13 06:47:20 +0000547 for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E;
548 ++A) {
549 if (!A->getType()->isPointerTy())
550 continue;
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000551 bool HasNonLocalUses = false;
552 if (!A->hasNoCaptureAttr()) {
Benjamin Kramer40d7f352013-06-22 16:56:32 +0000553 ArgumentUsesTracker Tracker(SCCNodes);
554 PointerMayBeCaptured(A, &Tracker);
555 if (!Tracker.Captured) {
556 if (Tracker.Uses.empty()) {
557 // If it's trivially not captured, mark it nocapture now.
Chandler Carruth63559d72015-09-13 06:47:20 +0000558 A->addAttr(
559 AttributeSet::get(F->getContext(), A->getArgNo() + 1, B));
Benjamin Kramer40d7f352013-06-22 16:56:32 +0000560 ++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];
Chandler Carruth63559d72015-09-13 06:47:20 +0000567 for (SmallVectorImpl<Argument *>::iterator
568 UI = Tracker.Uses.begin(),
569 UE = Tracker.Uses.end();
570 UI != UE; ++UI) {
Benjamin Kramer40d7f352013-06-22 16:56:32 +0000571 Node->Uses.push_back(AG[*UI]);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000572 if (*UI != A)
573 HasNonLocalUses = true;
574 }
Benjamin Kramer40d7f352013-06-22 16:56:32 +0000575 }
576 }
577 // Otherwise, it's captured. Don't bother doing SCC analysis on it.
578 }
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000579 if (!HasNonLocalUses && !A->onlyReadsMemory()) {
580 // Can we determine that it's readonly/readnone without doing an SCC?
581 // Note that we don't allow any calls at all here, or else our result
582 // will be dependent on the iteration order through the functions in the
583 // SCC.
Chandler Carruth63559d72015-09-13 06:47:20 +0000584 SmallPtrSet<Argument *, 8> Self;
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000585 Self.insert(A);
586 Attribute::AttrKind R = determinePointerReadAttrs(A, Self);
587 if (R != Attribute::None) {
588 AttrBuilder B;
589 B.addAttribute(R);
590 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
591 Changed = true;
592 R == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg;
593 }
594 }
595 }
Nick Lewycky4c378a42011-12-28 23:24:21 +0000596 }
597
598 // The graph we've collected is partial because we stopped scanning for
599 // argument uses once we solved the argument trivially. These partial nodes
600 // show up as ArgumentGraphNode objects with an empty Uses list, and for
601 // these nodes the final decision about whether they capture has already been
602 // made. If the definition doesn't have a 'nocapture' attribute by now, it
603 // captures.
604
Chandler Carruth63559d72015-09-13 06:47:20 +0000605 for (scc_iterator<ArgumentGraph *> I = scc_begin(&AG); !I.isAtEnd(); ++I) {
Duncan P. N. Exon Smithd2b2fac2014-04-25 18:24:50 +0000606 const std::vector<ArgumentGraphNode *> &ArgumentSCC = *I;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000607 if (ArgumentSCC.size() == 1) {
Chandler Carruth63559d72015-09-13 06:47:20 +0000608 if (!ArgumentSCC[0]->Definition)
609 continue; // synthetic root node
Nick Lewycky4c378a42011-12-28 23:24:21 +0000610
611 // eg. "void f(int* x) { if (...) f(x); }"
612 if (ArgumentSCC[0]->Uses.size() == 1 &&
613 ArgumentSCC[0]->Uses[0] == ArgumentSCC[0]) {
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000614 Argument *A = ArgumentSCC[0]->Definition;
615 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
Nick Lewycky7e820552009-01-02 03:46:56 +0000616 ++NumNoCapture;
Duncan Sands44c8cd92008-12-31 16:14:43 +0000617 Changed = true;
618 }
Nick Lewycky4c378a42011-12-28 23:24:21 +0000619 continue;
620 }
621
622 bool SCCCaptured = false;
Duncan P. N. Exon Smithd2b2fac2014-04-25 18:24:50 +0000623 for (auto I = ArgumentSCC.begin(), E = ArgumentSCC.end();
624 I != E && !SCCCaptured; ++I) {
Nick Lewycky4c378a42011-12-28 23:24:21 +0000625 ArgumentGraphNode *Node = *I;
626 if (Node->Uses.empty()) {
627 if (!Node->Definition->hasNoCaptureAttr())
628 SCCCaptured = true;
629 }
630 }
Chandler Carruth63559d72015-09-13 06:47:20 +0000631 if (SCCCaptured)
632 continue;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000633
Chandler Carruth63559d72015-09-13 06:47:20 +0000634 SmallPtrSet<Argument *, 8> ArgumentSCCNodes;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000635 // Fill ArgumentSCCNodes with the elements of the ArgumentSCC. Used for
636 // quickly looking up whether a given Argument is in this ArgumentSCC.
Duncan P. N. Exon Smithd2b2fac2014-04-25 18:24:50 +0000637 for (auto I = ArgumentSCC.begin(), E = ArgumentSCC.end(); I != E; ++I) {
Nick Lewycky4c378a42011-12-28 23:24:21 +0000638 ArgumentSCCNodes.insert((*I)->Definition);
639 }
640
Duncan P. N. Exon Smithd2b2fac2014-04-25 18:24:50 +0000641 for (auto I = ArgumentSCC.begin(), E = ArgumentSCC.end();
642 I != E && !SCCCaptured; ++I) {
Nick Lewycky4c378a42011-12-28 23:24:21 +0000643 ArgumentGraphNode *N = *I;
Chandler Carruth63559d72015-09-13 06:47:20 +0000644 for (SmallVectorImpl<ArgumentGraphNode *>::iterator UI = N->Uses.begin(),
645 UE = N->Uses.end();
646 UI != UE; ++UI) {
Nick Lewycky4c378a42011-12-28 23:24:21 +0000647 Argument *A = (*UI)->Definition;
648 if (A->hasNoCaptureAttr() || ArgumentSCCNodes.count(A))
649 continue;
650 SCCCaptured = true;
651 break;
652 }
653 }
Chandler Carruth63559d72015-09-13 06:47:20 +0000654 if (SCCCaptured)
655 continue;
Nick Lewycky4c378a42011-12-28 23:24:21 +0000656
Nick Lewyckyf740db32012-01-05 22:21:45 +0000657 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) {
Nick Lewycky4c378a42011-12-28 23:24:21 +0000658 Argument *A = ArgumentSCC[i]->Definition;
Benjamin Kramer40d7f352013-06-22 16:56:32 +0000659 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
Nick Lewycky4c378a42011-12-28 23:24:21 +0000660 ++NumNoCapture;
661 Changed = true;
662 }
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000663
664 // We also want to compute readonly/readnone. With a small number of false
665 // negatives, we can assume that any pointer which is captured isn't going
666 // to be provably readonly or readnone, since by definition we can't
667 // analyze all uses of a captured pointer.
668 //
669 // The false negatives happen when the pointer is captured by a function
670 // that promises readonly/readnone behaviour on the pointer, then the
671 // pointer's lifetime ends before anything that writes to arbitrary memory.
672 // Also, a readonly/readnone pointer may be returned, but returning a
673 // pointer is capturing it.
674
675 Attribute::AttrKind ReadAttr = Attribute::ReadNone;
676 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) {
677 Argument *A = ArgumentSCC[i]->Definition;
678 Attribute::AttrKind K = determinePointerReadAttrs(A, ArgumentSCCNodes);
679 if (K == Attribute::ReadNone)
680 continue;
681 if (K == Attribute::ReadOnly) {
682 ReadAttr = Attribute::ReadOnly;
683 continue;
684 }
685 ReadAttr = K;
686 break;
687 }
688
689 if (ReadAttr != Attribute::None) {
Bjorn Steinbrink236446c2015-05-25 19:46:38 +0000690 AttrBuilder B, R;
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000691 B.addAttribute(ReadAttr);
Chandler Carruth63559d72015-09-13 06:47:20 +0000692 R.addAttribute(Attribute::ReadOnly).addAttribute(Attribute::ReadNone);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000693 for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) {
694 Argument *A = ArgumentSCC[i]->Definition;
Bjorn Steinbrink236446c2015-05-25 19:46:38 +0000695 // Clear out existing readonly/readnone attributes
696 A->removeAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, R));
Nick Lewyckyc2ec0722013-07-06 00:29:58 +0000697 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
698 ReadAttr == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg;
699 Changed = true;
700 }
701 }
Duncan Sands44c8cd92008-12-31 16:14:43 +0000702 }
703
704 return Changed;
705}
706
Chandler Carrutha632fb92015-09-13 06:57:25 +0000707/// Tests whether a function is "malloc-like".
708///
709/// A function is "malloc-like" if it returns either null or a pointer that
710/// doesn't alias any other pointer visible to the caller.
Chandler Carruth3824f852015-09-13 08:23:27 +0000711static bool isFunctionMallocLike(Function *F,
712 SmallPtrSet<Function *, 8> &SCCNodes) {
Benjamin Kramer15591272012-10-31 13:45:49 +0000713 SmallSetVector<Value *, 8> FlowsToReturn;
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000714 for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I)
715 if (ReturnInst *Ret = dyn_cast<ReturnInst>(I->getTerminator()))
716 FlowsToReturn.insert(Ret->getReturnValue());
717
718 for (unsigned i = 0; i != FlowsToReturn.size(); ++i) {
Benjamin Kramer15591272012-10-31 13:45:49 +0000719 Value *RetVal = FlowsToReturn[i];
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000720
721 if (Constant *C = dyn_cast<Constant>(RetVal)) {
722 if (!C->isNullValue() && !isa<UndefValue>(C))
723 return false;
724
725 continue;
726 }
727
728 if (isa<Argument>(RetVal))
729 return false;
730
731 if (Instruction *RVI = dyn_cast<Instruction>(RetVal))
732 switch (RVI->getOpcode()) {
Chandler Carruth63559d72015-09-13 06:47:20 +0000733 // Extend the analysis by looking upwards.
734 case Instruction::BitCast:
735 case Instruction::GetElementPtr:
736 case Instruction::AddrSpaceCast:
737 FlowsToReturn.insert(RVI->getOperand(0));
738 continue;
739 case Instruction::Select: {
740 SelectInst *SI = cast<SelectInst>(RVI);
741 FlowsToReturn.insert(SI->getTrueValue());
742 FlowsToReturn.insert(SI->getFalseValue());
743 continue;
744 }
745 case Instruction::PHI: {
746 PHINode *PN = cast<PHINode>(RVI);
747 for (Value *IncValue : PN->incoming_values())
748 FlowsToReturn.insert(IncValue);
749 continue;
750 }
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000751
Chandler Carruth63559d72015-09-13 06:47:20 +0000752 // Check whether the pointer came from an allocation.
753 case Instruction::Alloca:
754 break;
755 case Instruction::Call:
756 case Instruction::Invoke: {
757 CallSite CS(RVI);
758 if (CS.paramHasAttr(0, Attribute::NoAlias))
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000759 break;
Chandler Carruth63559d72015-09-13 06:47:20 +0000760 if (CS.getCalledFunction() && SCCNodes.count(CS.getCalledFunction()))
761 break;
762 } // fall-through
763 default:
764 return false; // Did not come from an allocation.
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000765 }
766
Dan Gohman94e61762009-11-19 21:57:48 +0000767 if (PointerMayBeCaptured(RetVal, false, /*StoreCaptures=*/false))
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000768 return false;
769 }
770
771 return true;
772}
773
Chandler Carrutha632fb92015-09-13 06:57:25 +0000774/// Deduce noalias attributes for the SCC.
Chris Lattner4422d312010-04-16 22:42:17 +0000775bool FunctionAttrs::AddNoAliasAttrs(const CallGraphSCC &SCC) {
Chandler Carruth63559d72015-09-13 06:47:20 +0000776 SmallPtrSet<Function *, 8> SCCNodes;
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000777
778 // Fill SCCNodes with the elements of the SCC. Used for quickly
779 // looking up whether a given CallGraphNode is in this SCC.
Chris Lattner4422d312010-04-16 22:42:17 +0000780 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I)
781 SCCNodes.insert((*I)->getFunction());
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000782
Nick Lewycky9ec96d12009-03-08 17:08:09 +0000783 // Check each function in turn, determining which functions return noalias
784 // pointers.
Chris Lattner4422d312010-04-16 22:42:17 +0000785 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
786 Function *F = (*I)->getFunction();
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000787
Chandler Carruth0fb99812014-08-13 10:49:33 +0000788 if (!F || F->hasFnAttribute(Attribute::OptimizeNone))
789 // External node or node we don't want to optimize - skip it;
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000790 return false;
791
792 // Already noalias.
793 if (F->doesNotAlias(0))
794 continue;
795
796 // Definitions with weak linkage may be overridden at linktime, so
797 // treat them like declarations.
798 if (F->isDeclaration() || F->mayBeOverridden())
799 return false;
800
Chandler Carruth63559d72015-09-13 06:47:20 +0000801 // We annotate noalias return values, which are only applicable to
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000802 // pointer types.
Duncan Sands19d0b472010-02-16 11:11:14 +0000803 if (!F->getReturnType()->isPointerTy())
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000804 continue;
805
Chandler Carruth3824f852015-09-13 08:23:27 +0000806 if (!isFunctionMallocLike(F, SCCNodes))
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000807 return false;
808 }
809
810 bool MadeChange = false;
Chris Lattner4422d312010-04-16 22:42:17 +0000811 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
812 Function *F = (*I)->getFunction();
Duncan Sands19d0b472010-02-16 11:11:14 +0000813 if (F->doesNotAlias(0) || !F->getReturnType()->isPointerTy())
Nick Lewyckyfbed86a2009-03-08 06:20:47 +0000814 continue;
815
816 F->setDoesNotAlias(0);
817 ++NumNoAlias;
818 MadeChange = true;
819 }
820
821 return MadeChange;
822}
823
Chandler Carrutha632fb92015-09-13 06:57:25 +0000824/// Tests whether this function is known to not return null.
Chandler Carruth8874b782015-09-13 08:17:14 +0000825///
826/// Requires that the function returns a pointer.
827///
828/// Returns true if it believes the function will not return a null, and sets
829/// \p Speculative based on whether the returned conclusion is a speculative
830/// conclusion due to SCC calls.
831static bool isReturnNonNull(Function *F, SmallPtrSet<Function *, 8> &SCCNodes,
832 const TargetLibraryInfo &TLI, bool &Speculative) {
Philip Reamesa88caea2015-08-31 19:44:38 +0000833 assert(F->getReturnType()->isPointerTy() &&
834 "nonnull only meaningful on pointer types");
835 Speculative = false;
Chandler Carruth63559d72015-09-13 06:47:20 +0000836
Philip Reamesa88caea2015-08-31 19:44:38 +0000837 SmallSetVector<Value *, 8> FlowsToReturn;
838 for (BasicBlock &BB : *F)
839 if (auto *Ret = dyn_cast<ReturnInst>(BB.getTerminator()))
840 FlowsToReturn.insert(Ret->getReturnValue());
841
842 for (unsigned i = 0; i != FlowsToReturn.size(); ++i) {
843 Value *RetVal = FlowsToReturn[i];
844
845 // If this value is locally known to be non-null, we're good
Chandler Carruth8874b782015-09-13 08:17:14 +0000846 if (isKnownNonNull(RetVal, &TLI))
Philip Reamesa88caea2015-08-31 19:44:38 +0000847 continue;
848
849 // Otherwise, we need to look upwards since we can't make any local
Chandler Carruth63559d72015-09-13 06:47:20 +0000850 // conclusions.
Philip Reamesa88caea2015-08-31 19:44:38 +0000851 Instruction *RVI = dyn_cast<Instruction>(RetVal);
852 if (!RVI)
853 return false;
854 switch (RVI->getOpcode()) {
Chandler Carruth63559d72015-09-13 06:47:20 +0000855 // Extend the analysis by looking upwards.
Philip Reamesa88caea2015-08-31 19:44:38 +0000856 case Instruction::BitCast:
857 case Instruction::GetElementPtr:
858 case Instruction::AddrSpaceCast:
859 FlowsToReturn.insert(RVI->getOperand(0));
860 continue;
861 case Instruction::Select: {
862 SelectInst *SI = cast<SelectInst>(RVI);
863 FlowsToReturn.insert(SI->getTrueValue());
864 FlowsToReturn.insert(SI->getFalseValue());
865 continue;
866 }
867 case Instruction::PHI: {
868 PHINode *PN = cast<PHINode>(RVI);
869 for (int i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
870 FlowsToReturn.insert(PN->getIncomingValue(i));
871 continue;
872 }
873 case Instruction::Call:
874 case Instruction::Invoke: {
875 CallSite CS(RVI);
876 Function *Callee = CS.getCalledFunction();
877 // A call to a node within the SCC is assumed to return null until
878 // proven otherwise
879 if (Callee && SCCNodes.count(Callee)) {
880 Speculative = true;
881 continue;
882 }
883 return false;
884 }
885 default:
Chandler Carruth63559d72015-09-13 06:47:20 +0000886 return false; // Unknown source, may be null
Philip Reamesa88caea2015-08-31 19:44:38 +0000887 };
888 llvm_unreachable("should have either continued or returned");
889 }
890
891 return true;
892}
893
Chandler Carrutha632fb92015-09-13 06:57:25 +0000894/// Deduce nonnull attributes for the SCC.
Philip Reamesa88caea2015-08-31 19:44:38 +0000895bool FunctionAttrs::AddNonNullAttrs(const CallGraphSCC &SCC) {
Chandler Carruth63559d72015-09-13 06:47:20 +0000896 SmallPtrSet<Function *, 8> SCCNodes;
Philip Reamesa88caea2015-08-31 19:44:38 +0000897
898 // Fill SCCNodes with the elements of the SCC. Used for quickly
899 // looking up whether a given CallGraphNode is in this SCC.
900 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I)
901 SCCNodes.insert((*I)->getFunction());
902
903 // Speculative that all functions in the SCC return only nonnull
904 // pointers. We may refute this as we analyze functions.
905 bool SCCReturnsNonNull = true;
906
907 bool MadeChange = false;
908
909 // Check each function in turn, determining which functions return nonnull
910 // pointers.
911 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
912 Function *F = (*I)->getFunction();
913
914 if (!F || F->hasFnAttribute(Attribute::OptimizeNone))
915 // External node or node we don't want to optimize - skip it;
916 return false;
917
918 // Already nonnull.
919 if (F->getAttributes().hasAttribute(AttributeSet::ReturnIndex,
920 Attribute::NonNull))
921 continue;
922
923 // Definitions with weak linkage may be overridden at linktime, so
924 // treat them like declarations.
925 if (F->isDeclaration() || F->mayBeOverridden())
926 return false;
927
Chandler Carruth63559d72015-09-13 06:47:20 +0000928 // We annotate nonnull return values, which are only applicable to
Philip Reamesa88caea2015-08-31 19:44:38 +0000929 // pointer types.
930 if (!F->getReturnType()->isPointerTy())
931 continue;
932
933 bool Speculative = false;
Chandler Carruth8874b782015-09-13 08:17:14 +0000934 if (isReturnNonNull(F, SCCNodes, *TLI, Speculative)) {
Philip Reamesa88caea2015-08-31 19:44:38 +0000935 if (!Speculative) {
936 // Mark the function eagerly since we may discover a function
937 // which prevents us from speculating about the entire SCC
938 DEBUG(dbgs() << "Eagerly marking " << F->getName() << " as nonnull\n");
939 F->addAttribute(AttributeSet::ReturnIndex, Attribute::NonNull);
940 ++NumNonNullReturn;
941 MadeChange = true;
942 }
943 continue;
944 }
945 // At least one function returns something which could be null, can't
946 // speculate any more.
947 SCCReturnsNonNull = false;
948 }
949
950 if (SCCReturnsNonNull) {
951 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
952 Function *F = (*I)->getFunction();
953 if (F->getAttributes().hasAttribute(AttributeSet::ReturnIndex,
954 Attribute::NonNull) ||
955 !F->getReturnType()->isPointerTy())
956 continue;
957
958 DEBUG(dbgs() << "SCC marking " << F->getName() << " as nonnull\n");
959 F->addAttribute(AttributeSet::ReturnIndex, Attribute::NonNull);
960 ++NumNonNullReturn;
961 MadeChange = true;
962 }
963 }
964
965 return MadeChange;
966}
967
Chandler Carruthd0245202015-09-13 07:50:43 +0000968static void setDoesNotAccessMemory(Function &F) {
969 if (!F.doesNotAccessMemory()) {
970 F.setDoesNotAccessMemory();
971 ++NumAnnotated;
972 }
973}
974
975static void setOnlyReadsMemory(Function &F) {
976 if (!F.onlyReadsMemory()) {
977 F.setOnlyReadsMemory();
978 ++NumAnnotated;
979 }
980}
981
982static void setDoesNotThrow(Function &F) {
983 if (!F.doesNotThrow()) {
984 F.setDoesNotThrow();
985 ++NumAnnotated;
986 }
987}
988
989static void setDoesNotCapture(Function &F, unsigned n) {
990 if (!F.doesNotCapture(n)) {
991 F.setDoesNotCapture(n);
992 ++NumAnnotated;
993 }
994}
995
996static void setOnlyReadsMemory(Function &F, unsigned n) {
997 if (!F.onlyReadsMemory(n)) {
998 F.setOnlyReadsMemory(n);
999 ++NumAnnotated;
1000 }
1001}
1002
1003static void setDoesNotAlias(Function &F, unsigned n) {
1004 if (!F.doesNotAlias(n)) {
1005 F.setDoesNotAlias(n);
1006 ++NumAnnotated;
1007 }
1008}
1009
Chandler Carrutha632fb92015-09-13 06:57:25 +00001010/// Analyze the name and prototype of the given function and set any applicable
1011/// attributes.
1012///
1013/// Returns true if any attributes were set and false otherwise.
Chandler Carruth444d0052015-09-13 08:03:23 +00001014static bool inferPrototypeAttributes(Function &F, const TargetLibraryInfo &TLI) {
Chandler Carruth0fb99812014-08-13 10:49:33 +00001015 if (F.hasFnAttribute(Attribute::OptimizeNone))
1016 return false;
1017
Meador Inge6b6a1612013-03-21 00:55:59 +00001018 FunctionType *FTy = F.getFunctionType();
1019 LibFunc::Func TheLibFunc;
Chandler Carruth444d0052015-09-13 08:03:23 +00001020 if (!(TLI.getLibFunc(F.getName(), TheLibFunc) && TLI.has(TheLibFunc)))
Meador Inge6b6a1612013-03-21 00:55:59 +00001021 return false;
1022
1023 switch (TheLibFunc) {
1024 case LibFunc::strlen:
1025 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1026 return false;
1027 setOnlyReadsMemory(F);
1028 setDoesNotThrow(F);
1029 setDoesNotCapture(F, 1);
1030 break;
1031 case LibFunc::strchr:
1032 case LibFunc::strrchr:
Chandler Carruth63559d72015-09-13 06:47:20 +00001033 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001034 !FTy->getParamType(1)->isIntegerTy())
1035 return false;
1036 setOnlyReadsMemory(F);
1037 setDoesNotThrow(F);
1038 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001039 case LibFunc::strtol:
1040 case LibFunc::strtod:
1041 case LibFunc::strtof:
1042 case LibFunc::strtoul:
1043 case LibFunc::strtoll:
1044 case LibFunc::strtold:
Meador Inge6b6a1612013-03-21 00:55:59 +00001045 case LibFunc::strtoull:
Chandler Carruth63559d72015-09-13 06:47:20 +00001046 if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy())
Meador Inge6b6a1612013-03-21 00:55:59 +00001047 return false;
1048 setDoesNotThrow(F);
1049 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001050 setOnlyReadsMemory(F, 1);
1051 break;
1052 case LibFunc::strcpy:
1053 case LibFunc::stpcpy:
1054 case LibFunc::strcat:
1055 case LibFunc::strncat:
1056 case LibFunc::strncpy:
1057 case LibFunc::stpncpy:
Chandler Carruth63559d72015-09-13 06:47:20 +00001058 if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy())
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001059 return false;
1060 setDoesNotThrow(F);
1061 setDoesNotCapture(F, 2);
1062 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001063 break;
1064 case LibFunc::strxfrm:
Chandler Carruth63559d72015-09-13 06:47:20 +00001065 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001066 !FTy->getParamType(1)->isPointerTy())
1067 return false;
1068 setDoesNotThrow(F);
1069 setDoesNotCapture(F, 1);
1070 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001071 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001072 break;
Chandler Carruth63559d72015-09-13 06:47:20 +00001073 case LibFunc::strcmp: // 0,1
1074 case LibFunc::strspn: // 0,1
1075 case LibFunc::strncmp: // 0,1
1076 case LibFunc::strcspn: // 0,1
1077 case LibFunc::strcoll: // 0,1
1078 case LibFunc::strcasecmp: // 0,1
1079 case LibFunc::strncasecmp: //
1080 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001081 !FTy->getParamType(1)->isPointerTy())
1082 return false;
1083 setOnlyReadsMemory(F);
1084 setDoesNotThrow(F);
1085 setDoesNotCapture(F, 1);
1086 setDoesNotCapture(F, 2);
1087 break;
1088 case LibFunc::strstr:
1089 case LibFunc::strpbrk:
1090 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1091 return false;
1092 setOnlyReadsMemory(F);
1093 setDoesNotThrow(F);
1094 setDoesNotCapture(F, 2);
1095 break;
1096 case LibFunc::strtok:
1097 case LibFunc::strtok_r:
1098 if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy())
1099 return false;
1100 setDoesNotThrow(F);
1101 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001102 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001103 break;
1104 case LibFunc::scanf:
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001105 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy())
1106 return false;
1107 setDoesNotThrow(F);
1108 setDoesNotCapture(F, 1);
1109 setOnlyReadsMemory(F, 1);
1110 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001111 case LibFunc::setbuf:
1112 case LibFunc::setvbuf:
1113 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy())
1114 return false;
1115 setDoesNotThrow(F);
1116 setDoesNotCapture(F, 1);
1117 break;
1118 case LibFunc::strdup:
1119 case LibFunc::strndup:
1120 if (FTy->getNumParams() < 1 || !FTy->getReturnType()->isPointerTy() ||
1121 !FTy->getParamType(0)->isPointerTy())
1122 return false;
1123 setDoesNotThrow(F);
1124 setDoesNotAlias(F, 0);
1125 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001126 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001127 break;
1128 case LibFunc::stat:
Meador Inge6b6a1612013-03-21 00:55:59 +00001129 case LibFunc::statvfs:
Chandler Carruth63559d72015-09-13 06:47:20 +00001130 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001131 !FTy->getParamType(1)->isPointerTy())
1132 return false;
1133 setDoesNotThrow(F);
1134 setDoesNotCapture(F, 1);
1135 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001136 setOnlyReadsMemory(F, 1);
1137 break;
1138 case LibFunc::sscanf:
Chandler Carruth63559d72015-09-13 06:47:20 +00001139 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001140 !FTy->getParamType(1)->isPointerTy())
1141 return false;
1142 setDoesNotThrow(F);
1143 setDoesNotCapture(F, 1);
1144 setDoesNotCapture(F, 2);
1145 setOnlyReadsMemory(F, 1);
1146 setOnlyReadsMemory(F, 2);
1147 break;
1148 case LibFunc::sprintf:
Chandler Carruth63559d72015-09-13 06:47:20 +00001149 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001150 !FTy->getParamType(1)->isPointerTy())
1151 return false;
1152 setDoesNotThrow(F);
1153 setDoesNotCapture(F, 1);
1154 setDoesNotCapture(F, 2);
1155 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001156 break;
1157 case LibFunc::snprintf:
Chandler Carruth63559d72015-09-13 06:47:20 +00001158 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001159 !FTy->getParamType(2)->isPointerTy())
1160 return false;
1161 setDoesNotThrow(F);
1162 setDoesNotCapture(F, 1);
1163 setDoesNotCapture(F, 3);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001164 setOnlyReadsMemory(F, 3);
Meador Inge6b6a1612013-03-21 00:55:59 +00001165 break;
1166 case LibFunc::setitimer:
Chandler Carruth63559d72015-09-13 06:47:20 +00001167 if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001168 !FTy->getParamType(2)->isPointerTy())
1169 return false;
1170 setDoesNotThrow(F);
1171 setDoesNotCapture(F, 2);
1172 setDoesNotCapture(F, 3);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001173 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001174 break;
1175 case LibFunc::system:
Chandler Carruth63559d72015-09-13 06:47:20 +00001176 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
Meador Inge6b6a1612013-03-21 00:55:59 +00001177 return false;
1178 // May throw; "system" is a valid pthread cancellation point.
1179 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001180 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001181 break;
1182 case LibFunc::malloc:
Chandler Carruth63559d72015-09-13 06:47:20 +00001183 if (FTy->getNumParams() != 1 || !FTy->getReturnType()->isPointerTy())
Meador Inge6b6a1612013-03-21 00:55:59 +00001184 return false;
1185 setDoesNotThrow(F);
1186 setDoesNotAlias(F, 0);
1187 break;
1188 case LibFunc::memcmp:
Chandler Carruth63559d72015-09-13 06:47:20 +00001189 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001190 !FTy->getParamType(1)->isPointerTy())
1191 return false;
1192 setOnlyReadsMemory(F);
1193 setDoesNotThrow(F);
1194 setDoesNotCapture(F, 1);
1195 setDoesNotCapture(F, 2);
1196 break;
1197 case LibFunc::memchr:
1198 case LibFunc::memrchr:
1199 if (FTy->getNumParams() != 3)
1200 return false;
1201 setOnlyReadsMemory(F);
1202 setDoesNotThrow(F);
1203 break;
1204 case LibFunc::modf:
1205 case LibFunc::modff:
1206 case LibFunc::modfl:
Chandler Carruth63559d72015-09-13 06:47:20 +00001207 if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy())
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001208 return false;
1209 setDoesNotThrow(F);
1210 setDoesNotCapture(F, 2);
1211 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001212 case LibFunc::memcpy:
1213 case LibFunc::memccpy:
1214 case LibFunc::memmove:
Chandler Carruth63559d72015-09-13 06:47:20 +00001215 if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy())
Meador Inge6b6a1612013-03-21 00:55:59 +00001216 return false;
1217 setDoesNotThrow(F);
1218 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001219 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001220 break;
1221 case LibFunc::memalign:
1222 if (!FTy->getReturnType()->isPointerTy())
1223 return false;
1224 setDoesNotAlias(F, 0);
1225 break;
1226 case LibFunc::mkdir:
Chandler Carruth63559d72015-09-13 06:47:20 +00001227 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001228 return false;
1229 setDoesNotThrow(F);
1230 setDoesNotCapture(F, 1);
1231 setOnlyReadsMemory(F, 1);
1232 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001233 case LibFunc::mktime:
Chandler Carruth63559d72015-09-13 06:47:20 +00001234 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
Meador Inge6b6a1612013-03-21 00:55:59 +00001235 return false;
1236 setDoesNotThrow(F);
1237 setDoesNotCapture(F, 1);
1238 break;
1239 case LibFunc::realloc:
Chandler Carruth63559d72015-09-13 06:47:20 +00001240 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001241 !FTy->getReturnType()->isPointerTy())
1242 return false;
1243 setDoesNotThrow(F);
1244 setDoesNotAlias(F, 0);
1245 setDoesNotCapture(F, 1);
1246 break;
1247 case LibFunc::read:
Chandler Carruth63559d72015-09-13 06:47:20 +00001248 if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy())
Meador Inge6b6a1612013-03-21 00:55:59 +00001249 return false;
1250 // May throw; "read" is a valid pthread cancellation point.
1251 setDoesNotCapture(F, 2);
1252 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001253 case LibFunc::rewind:
Chandler Carruth63559d72015-09-13 06:47:20 +00001254 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy())
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001255 return false;
1256 setDoesNotThrow(F);
1257 setDoesNotCapture(F, 1);
1258 break;
1259 case LibFunc::rmdir:
Meador Inge6b6a1612013-03-21 00:55:59 +00001260 case LibFunc::remove:
1261 case LibFunc::realpath:
Chandler Carruth63559d72015-09-13 06:47:20 +00001262 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy())
Meador Inge6b6a1612013-03-21 00:55:59 +00001263 return false;
1264 setDoesNotThrow(F);
1265 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001266 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001267 break;
1268 case LibFunc::rename:
Chandler Carruth63559d72015-09-13 06:47:20 +00001269 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001270 !FTy->getParamType(1)->isPointerTy())
1271 return false;
1272 setDoesNotThrow(F);
1273 setDoesNotCapture(F, 1);
1274 setDoesNotCapture(F, 2);
1275 setOnlyReadsMemory(F, 1);
1276 setOnlyReadsMemory(F, 2);
1277 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001278 case LibFunc::readlink:
Chandler Carruth63559d72015-09-13 06:47:20 +00001279 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001280 !FTy->getParamType(1)->isPointerTy())
1281 return false;
1282 setDoesNotThrow(F);
1283 setDoesNotCapture(F, 1);
1284 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001285 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001286 break;
1287 case LibFunc::write:
1288 if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy())
1289 return false;
1290 // May throw; "write" is a valid pthread cancellation point.
1291 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001292 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001293 break;
1294 case LibFunc::bcopy:
Chandler Carruth63559d72015-09-13 06:47:20 +00001295 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001296 !FTy->getParamType(1)->isPointerTy())
1297 return false;
1298 setDoesNotThrow(F);
1299 setDoesNotCapture(F, 1);
1300 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001301 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001302 break;
1303 case LibFunc::bcmp:
Chandler Carruth63559d72015-09-13 06:47:20 +00001304 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001305 !FTy->getParamType(1)->isPointerTy())
1306 return false;
1307 setDoesNotThrow(F);
1308 setOnlyReadsMemory(F);
1309 setDoesNotCapture(F, 1);
1310 setDoesNotCapture(F, 2);
1311 break;
1312 case LibFunc::bzero:
1313 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy())
1314 return false;
1315 setDoesNotThrow(F);
1316 setDoesNotCapture(F, 1);
1317 break;
1318 case LibFunc::calloc:
Chandler Carruth63559d72015-09-13 06:47:20 +00001319 if (FTy->getNumParams() != 2 || !FTy->getReturnType()->isPointerTy())
Meador Inge6b6a1612013-03-21 00:55:59 +00001320 return false;
1321 setDoesNotThrow(F);
1322 setDoesNotAlias(F, 0);
1323 break;
1324 case LibFunc::chmod:
1325 case LibFunc::chown:
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001326 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
1327 return false;
1328 setDoesNotThrow(F);
1329 setDoesNotCapture(F, 1);
1330 setOnlyReadsMemory(F, 1);
1331 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001332 case LibFunc::ctermid:
1333 case LibFunc::clearerr:
1334 case LibFunc::closedir:
1335 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
1336 return false;
1337 setDoesNotThrow(F);
1338 setDoesNotCapture(F, 1);
1339 break;
1340 case LibFunc::atoi:
1341 case LibFunc::atol:
1342 case LibFunc::atof:
1343 case LibFunc::atoll:
1344 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1345 return false;
1346 setDoesNotThrow(F);
1347 setOnlyReadsMemory(F);
1348 setDoesNotCapture(F, 1);
1349 break;
1350 case LibFunc::access:
1351 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy())
1352 return false;
1353 setDoesNotThrow(F);
1354 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001355 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001356 break;
1357 case LibFunc::fopen:
Chandler Carruth63559d72015-09-13 06:47:20 +00001358 if (FTy->getNumParams() != 2 || !FTy->getReturnType()->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001359 !FTy->getParamType(0)->isPointerTy() ||
1360 !FTy->getParamType(1)->isPointerTy())
1361 return false;
1362 setDoesNotThrow(F);
1363 setDoesNotAlias(F, 0);
1364 setDoesNotCapture(F, 1);
1365 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001366 setOnlyReadsMemory(F, 1);
1367 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001368 break;
1369 case LibFunc::fdopen:
Chandler Carruth63559d72015-09-13 06:47:20 +00001370 if (FTy->getNumParams() != 2 || !FTy->getReturnType()->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001371 !FTy->getParamType(1)->isPointerTy())
1372 return false;
1373 setDoesNotThrow(F);
1374 setDoesNotAlias(F, 0);
1375 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001376 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001377 break;
1378 case LibFunc::feof:
1379 case LibFunc::free:
1380 case LibFunc::fseek:
1381 case LibFunc::ftell:
1382 case LibFunc::fgetc:
1383 case LibFunc::fseeko:
1384 case LibFunc::ftello:
1385 case LibFunc::fileno:
1386 case LibFunc::fflush:
1387 case LibFunc::fclose:
1388 case LibFunc::fsetpos:
1389 case LibFunc::flockfile:
1390 case LibFunc::funlockfile:
1391 case LibFunc::ftrylockfile:
1392 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
1393 return false;
1394 setDoesNotThrow(F);
1395 setDoesNotCapture(F, 1);
1396 break;
1397 case LibFunc::ferror:
1398 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1399 return false;
1400 setDoesNotThrow(F);
1401 setDoesNotCapture(F, 1);
1402 setOnlyReadsMemory(F);
1403 break;
1404 case LibFunc::fputc:
1405 case LibFunc::fstat:
1406 case LibFunc::frexp:
1407 case LibFunc::frexpf:
1408 case LibFunc::frexpl:
1409 case LibFunc::fstatvfs:
1410 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1411 return false;
1412 setDoesNotThrow(F);
1413 setDoesNotCapture(F, 2);
1414 break;
1415 case LibFunc::fgets:
Chandler Carruth63559d72015-09-13 06:47:20 +00001416 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001417 !FTy->getParamType(2)->isPointerTy())
1418 return false;
1419 setDoesNotThrow(F);
1420 setDoesNotCapture(F, 3);
Nick Lewycky26fcc512013-07-02 05:02:56 +00001421 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001422 case LibFunc::fread:
Chandler Carruth63559d72015-09-13 06:47:20 +00001423 if (FTy->getNumParams() != 4 || !FTy->getParamType(0)->isPointerTy() ||
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001424 !FTy->getParamType(3)->isPointerTy())
1425 return false;
1426 setDoesNotThrow(F);
1427 setDoesNotCapture(F, 1);
1428 setDoesNotCapture(F, 4);
1429 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001430 case LibFunc::fwrite:
Chandler Carruth63559d72015-09-13 06:47:20 +00001431 if (FTy->getNumParams() != 4 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001432 !FTy->getParamType(3)->isPointerTy())
1433 return false;
1434 setDoesNotThrow(F);
1435 setDoesNotCapture(F, 1);
1436 setDoesNotCapture(F, 4);
Nick Lewycky26fcc512013-07-02 05:02:56 +00001437 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001438 case LibFunc::fputs:
Chandler Carruth63559d72015-09-13 06:47:20 +00001439 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001440 !FTy->getParamType(1)->isPointerTy())
1441 return false;
1442 setDoesNotThrow(F);
1443 setDoesNotCapture(F, 1);
1444 setDoesNotCapture(F, 2);
1445 setOnlyReadsMemory(F, 1);
1446 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001447 case LibFunc::fscanf:
1448 case LibFunc::fprintf:
Chandler Carruth63559d72015-09-13 06:47:20 +00001449 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001450 !FTy->getParamType(1)->isPointerTy())
1451 return false;
1452 setDoesNotThrow(F);
1453 setDoesNotCapture(F, 1);
1454 setDoesNotCapture(F, 2);
1455 setOnlyReadsMemory(F, 2);
1456 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001457 case LibFunc::fgetpos:
Chandler Carruth63559d72015-09-13 06:47:20 +00001458 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001459 !FTy->getParamType(1)->isPointerTy())
1460 return false;
1461 setDoesNotThrow(F);
1462 setDoesNotCapture(F, 1);
1463 setDoesNotCapture(F, 2);
1464 break;
1465 case LibFunc::getc:
1466 case LibFunc::getlogin_r:
1467 case LibFunc::getc_unlocked:
1468 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
1469 return false;
1470 setDoesNotThrow(F);
1471 setDoesNotCapture(F, 1);
1472 break;
1473 case LibFunc::getenv:
1474 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1475 return false;
1476 setDoesNotThrow(F);
1477 setOnlyReadsMemory(F);
1478 setDoesNotCapture(F, 1);
1479 break;
1480 case LibFunc::gets:
1481 case LibFunc::getchar:
1482 setDoesNotThrow(F);
1483 break;
1484 case LibFunc::getitimer:
1485 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1486 return false;
1487 setDoesNotThrow(F);
1488 setDoesNotCapture(F, 2);
1489 break;
1490 case LibFunc::getpwnam:
1491 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1492 return false;
1493 setDoesNotThrow(F);
1494 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001495 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001496 break;
1497 case LibFunc::ungetc:
1498 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1499 return false;
1500 setDoesNotThrow(F);
1501 setDoesNotCapture(F, 2);
1502 break;
1503 case LibFunc::uname:
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001504 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1505 return false;
1506 setDoesNotThrow(F);
1507 setDoesNotCapture(F, 1);
1508 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001509 case LibFunc::unlink:
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001510 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1511 return false;
1512 setDoesNotThrow(F);
1513 setDoesNotCapture(F, 1);
Nick Lewyckycff2cf82013-07-06 00:59:28 +00001514 setOnlyReadsMemory(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001515 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001516 case LibFunc::unsetenv:
1517 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1518 return false;
1519 setDoesNotThrow(F);
1520 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001521 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001522 break;
1523 case LibFunc::utime:
1524 case LibFunc::utimes:
Chandler Carruth63559d72015-09-13 06:47:20 +00001525 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001526 !FTy->getParamType(1)->isPointerTy())
1527 return false;
1528 setDoesNotThrow(F);
1529 setDoesNotCapture(F, 1);
1530 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001531 setOnlyReadsMemory(F, 1);
1532 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001533 break;
1534 case LibFunc::putc:
1535 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1536 return false;
1537 setDoesNotThrow(F);
1538 setDoesNotCapture(F, 2);
1539 break;
1540 case LibFunc::puts:
1541 case LibFunc::printf:
1542 case LibFunc::perror:
1543 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1544 return false;
1545 setDoesNotThrow(F);
1546 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001547 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001548 break;
1549 case LibFunc::pread:
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001550 if (FTy->getNumParams() != 4 || !FTy->getParamType(1)->isPointerTy())
1551 return false;
1552 // May throw; "pread" is a valid pthread cancellation point.
1553 setDoesNotCapture(F, 2);
1554 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001555 case LibFunc::pwrite:
1556 if (FTy->getNumParams() != 4 || !FTy->getParamType(1)->isPointerTy())
1557 return false;
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001558 // May throw; "pwrite" is a valid pthread cancellation point.
Meador Inge6b6a1612013-03-21 00:55:59 +00001559 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001560 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001561 break;
1562 case LibFunc::putchar:
1563 setDoesNotThrow(F);
1564 break;
1565 case LibFunc::popen:
Chandler Carruth63559d72015-09-13 06:47:20 +00001566 if (FTy->getNumParams() != 2 || !FTy->getReturnType()->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001567 !FTy->getParamType(0)->isPointerTy() ||
1568 !FTy->getParamType(1)->isPointerTy())
1569 return false;
1570 setDoesNotThrow(F);
1571 setDoesNotAlias(F, 0);
1572 setDoesNotCapture(F, 1);
1573 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001574 setOnlyReadsMemory(F, 1);
1575 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001576 break;
1577 case LibFunc::pclose:
1578 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1579 return false;
1580 setDoesNotThrow(F);
1581 setDoesNotCapture(F, 1);
1582 break;
1583 case LibFunc::vscanf:
1584 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1585 return false;
1586 setDoesNotThrow(F);
1587 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001588 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001589 break;
1590 case LibFunc::vsscanf:
Chandler Carruth63559d72015-09-13 06:47:20 +00001591 if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy() ||
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001592 !FTy->getParamType(2)->isPointerTy())
1593 return false;
1594 setDoesNotThrow(F);
1595 setDoesNotCapture(F, 1);
1596 setDoesNotCapture(F, 2);
1597 setOnlyReadsMemory(F, 1);
1598 setOnlyReadsMemory(F, 2);
1599 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001600 case LibFunc::vfscanf:
Chandler Carruth63559d72015-09-13 06:47:20 +00001601 if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001602 !FTy->getParamType(2)->isPointerTy())
1603 return false;
1604 setDoesNotThrow(F);
1605 setDoesNotCapture(F, 1);
1606 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001607 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001608 break;
1609 case LibFunc::valloc:
1610 if (!FTy->getReturnType()->isPointerTy())
1611 return false;
1612 setDoesNotThrow(F);
1613 setDoesNotAlias(F, 0);
1614 break;
1615 case LibFunc::vprintf:
1616 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy())
1617 return false;
1618 setDoesNotThrow(F);
1619 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001620 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001621 break;
1622 case LibFunc::vfprintf:
1623 case LibFunc::vsprintf:
Chandler Carruth63559d72015-09-13 06:47:20 +00001624 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001625 !FTy->getParamType(1)->isPointerTy())
1626 return false;
1627 setDoesNotThrow(F);
1628 setDoesNotCapture(F, 1);
1629 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001630 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001631 break;
1632 case LibFunc::vsnprintf:
Chandler Carruth63559d72015-09-13 06:47:20 +00001633 if (FTy->getNumParams() != 4 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001634 !FTy->getParamType(2)->isPointerTy())
1635 return false;
1636 setDoesNotThrow(F);
1637 setDoesNotCapture(F, 1);
1638 setDoesNotCapture(F, 3);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001639 setOnlyReadsMemory(F, 3);
Meador Inge6b6a1612013-03-21 00:55:59 +00001640 break;
1641 case LibFunc::open:
1642 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy())
1643 return false;
1644 // May throw; "open" is a valid pthread cancellation point.
1645 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001646 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001647 break;
1648 case LibFunc::opendir:
Chandler Carruth63559d72015-09-13 06:47:20 +00001649 if (FTy->getNumParams() != 1 || !FTy->getReturnType()->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001650 !FTy->getParamType(0)->isPointerTy())
1651 return false;
1652 setDoesNotThrow(F);
1653 setDoesNotAlias(F, 0);
1654 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001655 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001656 break;
1657 case LibFunc::tmpfile:
1658 if (!FTy->getReturnType()->isPointerTy())
1659 return false;
1660 setDoesNotThrow(F);
1661 setDoesNotAlias(F, 0);
1662 break;
1663 case LibFunc::times:
1664 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1665 return false;
1666 setDoesNotThrow(F);
1667 setDoesNotCapture(F, 1);
1668 break;
1669 case LibFunc::htonl:
1670 case LibFunc::htons:
1671 case LibFunc::ntohl:
1672 case LibFunc::ntohs:
1673 setDoesNotThrow(F);
1674 setDoesNotAccessMemory(F);
1675 break;
1676 case LibFunc::lstat:
Chandler Carruth63559d72015-09-13 06:47:20 +00001677 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001678 !FTy->getParamType(1)->isPointerTy())
1679 return false;
1680 setDoesNotThrow(F);
1681 setDoesNotCapture(F, 1);
1682 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001683 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001684 break;
1685 case LibFunc::lchown:
1686 if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy())
1687 return false;
1688 setDoesNotThrow(F);
1689 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001690 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001691 break;
1692 case LibFunc::qsort:
1693 if (FTy->getNumParams() != 4 || !FTy->getParamType(3)->isPointerTy())
1694 return false;
1695 // May throw; places call through function pointer.
1696 setDoesNotCapture(F, 4);
1697 break;
1698 case LibFunc::dunder_strdup:
1699 case LibFunc::dunder_strndup:
Chandler Carruth63559d72015-09-13 06:47:20 +00001700 if (FTy->getNumParams() < 1 || !FTy->getReturnType()->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001701 !FTy->getParamType(0)->isPointerTy())
1702 return false;
1703 setDoesNotThrow(F);
1704 setDoesNotAlias(F, 0);
1705 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001706 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001707 break;
1708 case LibFunc::dunder_strtok_r:
Chandler Carruth63559d72015-09-13 06:47:20 +00001709 if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy())
Meador Inge6b6a1612013-03-21 00:55:59 +00001710 return false;
1711 setDoesNotThrow(F);
1712 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001713 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001714 break;
1715 case LibFunc::under_IO_getc:
1716 if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1717 return false;
1718 setDoesNotThrow(F);
1719 setDoesNotCapture(F, 1);
1720 break;
1721 case LibFunc::under_IO_putc:
1722 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1723 return false;
1724 setDoesNotThrow(F);
1725 setDoesNotCapture(F, 2);
1726 break;
1727 case LibFunc::dunder_isoc99_scanf:
Chandler Carruth63559d72015-09-13 06:47:20 +00001728 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy())
Meador Inge6b6a1612013-03-21 00:55:59 +00001729 return false;
1730 setDoesNotThrow(F);
1731 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001732 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001733 break;
1734 case LibFunc::stat64:
1735 case LibFunc::lstat64:
1736 case LibFunc::statvfs64:
Chandler Carruth63559d72015-09-13 06:47:20 +00001737 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy() ||
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001738 !FTy->getParamType(1)->isPointerTy())
1739 return false;
1740 setDoesNotThrow(F);
1741 setDoesNotCapture(F, 1);
1742 setDoesNotCapture(F, 2);
1743 setOnlyReadsMemory(F, 1);
1744 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001745 case LibFunc::dunder_isoc99_sscanf:
Chandler Carruth63559d72015-09-13 06:47:20 +00001746 if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001747 !FTy->getParamType(1)->isPointerTy())
1748 return false;
1749 setDoesNotThrow(F);
1750 setDoesNotCapture(F, 1);
1751 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001752 setOnlyReadsMemory(F, 1);
1753 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001754 break;
1755 case LibFunc::fopen64:
Chandler Carruth63559d72015-09-13 06:47:20 +00001756 if (FTy->getNumParams() != 2 || !FTy->getReturnType()->isPointerTy() ||
Meador Inge6b6a1612013-03-21 00:55:59 +00001757 !FTy->getParamType(0)->isPointerTy() ||
1758 !FTy->getParamType(1)->isPointerTy())
1759 return false;
1760 setDoesNotThrow(F);
1761 setDoesNotAlias(F, 0);
1762 setDoesNotCapture(F, 1);
1763 setDoesNotCapture(F, 2);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001764 setOnlyReadsMemory(F, 1);
1765 setOnlyReadsMemory(F, 2);
Meador Inge6b6a1612013-03-21 00:55:59 +00001766 break;
1767 case LibFunc::fseeko64:
1768 case LibFunc::ftello64:
1769 if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
1770 return false;
1771 setDoesNotThrow(F);
1772 setDoesNotCapture(F, 1);
1773 break;
1774 case LibFunc::tmpfile64:
1775 if (!FTy->getReturnType()->isPointerTy())
1776 return false;
1777 setDoesNotThrow(F);
1778 setDoesNotAlias(F, 0);
1779 break;
1780 case LibFunc::fstat64:
1781 case LibFunc::fstatvfs64:
1782 if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1783 return false;
1784 setDoesNotThrow(F);
1785 setDoesNotCapture(F, 2);
1786 break;
1787 case LibFunc::open64:
1788 if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy())
1789 return false;
1790 // May throw; "open" is a valid pthread cancellation point.
1791 setDoesNotCapture(F, 1);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001792 setOnlyReadsMemory(F, 1);
Meador Inge6b6a1612013-03-21 00:55:59 +00001793 break;
Michael Gottesman2db11162013-07-03 04:00:54 +00001794 case LibFunc::gettimeofday:
1795 if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() ||
1796 !FTy->getParamType(1)->isPointerTy())
1797 return false;
1798 // Currently some platforms have the restrict keyword on the arguments to
1799 // gettimeofday. To be conservative, do not add noalias to gettimeofday's
1800 // arguments.
1801 setDoesNotThrow(F);
1802 setDoesNotCapture(F, 1);
1803 setDoesNotCapture(F, 2);
Rafael Espindola5e66a7e2014-03-30 03:26:17 +00001804 break;
Meador Inge6b6a1612013-03-21 00:55:59 +00001805 default:
1806 // Didn't mark any attributes.
1807 return false;
1808 }
1809
1810 return true;
1811}
1812
Chandler Carrutha632fb92015-09-13 06:57:25 +00001813/// Adds attributes to well-known standard library call declarations.
Meador Inge6b6a1612013-03-21 00:55:59 +00001814bool FunctionAttrs::annotateLibraryCalls(const CallGraphSCC &SCC) {
1815 bool MadeChange = false;
1816
1817 // Check each function in turn annotating well-known library function
1818 // declarations with attributes.
1819 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
1820 Function *F = (*I)->getFunction();
1821
Craig Topperf40110f2014-04-25 05:29:35 +00001822 if (F && F->isDeclaration())
Chandler Carruth444d0052015-09-13 08:03:23 +00001823 MadeChange |= inferPrototypeAttributes(*F, *TLI);
Meador Inge6b6a1612013-03-21 00:55:59 +00001824 }
1825
1826 return MadeChange;
1827}
1828
Chris Lattner4422d312010-04-16 22:42:17 +00001829bool FunctionAttrs::runOnSCC(CallGraphSCC &SCC) {
Chandler Carruthb98f63d2015-01-15 10:41:28 +00001830 TLI = &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
Dan Gohman86449d72010-11-08 16:10:15 +00001831
Meador Inge6b6a1612013-03-21 00:55:59 +00001832 bool Changed = annotateLibraryCalls(SCC);
1833 Changed |= AddReadAttrs(SCC);
Nick Lewyckyc2ec0722013-07-06 00:29:58 +00001834 Changed |= AddArgumentAttrs(SCC);
Nick Lewyckyfbed86a2009-03-08 06:20:47 +00001835 Changed |= AddNoAliasAttrs(SCC);
Philip Reamesa88caea2015-08-31 19:44:38 +00001836 Changed |= AddNonNullAttrs(SCC);
Duncan Sands44c8cd92008-12-31 16:14:43 +00001837 return Changed;
1838}