blob: d11aa7b68008c7f31a1173a5919cf7709962df76 [file] [log] [blame]
Chris Lattner9d7c9ea2003-11-25 20:11:47 +00001//===- BasicAliasAnalysis.cpp - Local Alias Analysis Impl -----------------===//
John Criswellb576c942003-10-20 19:43:21 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Chris Lattnerd501c132003-02-26 19:41:54 +00009//
10// This file defines the default implementation of the Alias Analysis interface
11// that simply implements a few identities (two different globals cannot alias,
12// etc), but otherwise does no analysis.
13//
14//===----------------------------------------------------------------------===//
15
16#include "llvm/Analysis/AliasAnalysis.h"
Chris Lattner4244bb52004-03-15 03:36:49 +000017#include "llvm/Constants.h"
18#include "llvm/DerivedTypes.h"
19#include "llvm/Function.h"
20#include "llvm/GlobalVariable.h"
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000021#include "llvm/Instructions.h"
Chris Lattner4244bb52004-03-15 03:36:49 +000022#include "llvm/Pass.h"
Chris Lattnerd501c132003-02-26 19:41:54 +000023#include "llvm/Target/TargetData.h"
Chris Lattner1af55e12003-11-25 20:10:07 +000024#include "llvm/Support/GetElementPtrTypeIterator.h"
Alkis Evlogimenos20aa4742004-09-03 18:19:51 +000025#include <algorithm>
Chris Lattnerec4e8082003-11-25 18:33:40 +000026using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000027
Chris Lattnerd501c132003-02-26 19:41:54 +000028// Make sure that anything that uses AliasAnalysis pulls in this file...
Chris Lattner86391452003-12-11 05:44:59 +000029void llvm::BasicAAStub() {}
Chris Lattnerd501c132003-02-26 19:41:54 +000030
Chris Lattnerd501c132003-02-26 19:41:54 +000031namespace {
Chris Lattnerb52f4402004-05-23 21:15:12 +000032 /// NoAA - This class implements the -no-aa pass, which always returns "I
33 /// don't know" for alias queries. NoAA is unlike other alias analysis
34 /// implementations, in that it does not chain to a previous analysis. As
35 /// such it doesn't follow many of the rules that other alias analyses must.
36 ///
37 struct NoAA : public ImmutablePass, public AliasAnalysis {
Chris Lattner689835a2004-06-19 08:05:58 +000038 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
39 AU.addRequired<TargetData>();
40 }
41
42 virtual void initializePass() {
43 TD = &getAnalysis<TargetData>();
44 }
45
Chris Lattnerb52f4402004-05-23 21:15:12 +000046 virtual AliasResult alias(const Value *V1, unsigned V1Size,
47 const Value *V2, unsigned V2Size) {
48 return MayAlias;
49 }
50
Chris Lattner0af024c2004-12-15 07:22:13 +000051 virtual ModRefBehavior getModRefBehavior(Function *F, CallSite CS) {
52 return UnknownModRefBehavior;
53 }
54
55 virtual void getArgumentAccesses(Function *F, CallSite CS,
56 std::vector<PointerAccessInfo> &Info) {
57 assert(0 && "This method may not be called on this function!");
58 }
59
Chris Lattnerb52f4402004-05-23 21:15:12 +000060 virtual void getMustAliases(Value *P, std::vector<Value*> &RetVals) { }
61 virtual bool pointsToConstantMemory(const Value *P) { return false; }
Chris Lattnerb52f4402004-05-23 21:15:12 +000062 virtual ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size) {
63 return ModRef;
64 }
65 virtual ModRefResult getModRefInfo(CallSite CS1, CallSite CS2) {
66 return ModRef;
67 }
68 virtual bool hasNoModRefInfoForCalls() const { return true; }
69
70 virtual void deleteValue(Value *V) {}
71 virtual void copyValue(Value *From, Value *To) {}
Chris Lattnerb52f4402004-05-23 21:15:12 +000072 };
73
74 // Register this pass...
75 RegisterOpt<NoAA>
76 U("no-aa", "No Alias Analysis (always returns 'may' alias)");
77
78 // Declare that we implement the AliasAnalysis interface
79 RegisterAnalysisGroup<AliasAnalysis, NoAA> V;
80} // End of anonymous namespace
81
82
83namespace {
84 /// BasicAliasAnalysis - This is the default alias analysis implementation.
85 /// Because it doesn't chain to a previous alias analysis (like -no-aa), it
86 /// derives from the NoAA class.
87 struct BasicAliasAnalysis : public NoAA {
Chris Lattnerd501c132003-02-26 19:41:54 +000088 AliasResult alias(const Value *V1, unsigned V1Size,
89 const Value *V2, unsigned V2Size);
Chris Lattnerbc1daaa2004-01-30 22:17:24 +000090
Chris Lattner04b75932004-03-12 22:39:00 +000091 ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size);
Reid Spencer4a7ebfa2004-12-07 08:11:24 +000092 ModRefResult getModRefInfo(CallSite CS1, CallSite CS2) {
93 return NoAA::getModRefInfo(CS1,CS2);
94 }
Chris Lattner04b75932004-03-12 22:39:00 +000095
Chris Lattnere181b942004-07-27 02:13:55 +000096 /// hasNoModRefInfoForCalls - We can provide mod/ref information against
97 /// non-escaping allocations.
98 virtual bool hasNoModRefInfoForCalls() const { return false; }
Chris Lattner65585aa2004-04-11 16:43:07 +000099
Chris Lattnerbc1daaa2004-01-30 22:17:24 +0000100 /// pointsToConstantMemory - Chase pointers until we find a (constant
101 /// global) or not.
102 bool pointsToConstantMemory(const Value *P);
103
Chris Lattner0af024c2004-12-15 07:22:13 +0000104 virtual ModRefBehavior getModRefBehavior(Function *F, CallSite CS,
105 std::vector<PointerAccessInfo> *Info);
106
Chris Lattnerd501c132003-02-26 19:41:54 +0000107 private:
Chris Lattnerb307c882003-12-11 22:44:13 +0000108 // CheckGEPInstructions - Check two GEP instructions with known
109 // must-aliasing base pointers. This checks to see if the index expressions
Chris Lattnerd501c132003-02-26 19:41:54 +0000110 // preclude the pointers from aliasing...
Chris Lattnerb307c882003-12-11 22:44:13 +0000111 AliasResult
112 CheckGEPInstructions(const Type* BasePtr1Ty, std::vector<Value*> &GEP1Ops,
113 unsigned G1Size,
114 const Type *BasePtr2Ty, std::vector<Value*> &GEP2Ops,
115 unsigned G2Size);
Chris Lattnerd501c132003-02-26 19:41:54 +0000116 };
117
118 // Register this pass...
119 RegisterOpt<BasicAliasAnalysis>
120 X("basicaa", "Basic Alias Analysis (default AA impl)");
121
122 // Declare that we implement the AliasAnalysis interface
123 RegisterAnalysisGroup<AliasAnalysis, BasicAliasAnalysis, true> Y;
124} // End of anonymous namespace
125
Chris Lattnerc1820032003-09-20 03:08:47 +0000126// hasUniqueAddress - Return true if the specified value points to something
127// with a unique, discernable, address.
Chris Lattnerd501c132003-02-26 19:41:54 +0000128static inline bool hasUniqueAddress(const Value *V) {
Chris Lattnerc1820032003-09-20 03:08:47 +0000129 return isa<GlobalValue>(V) || isa<AllocationInst>(V);
Chris Lattnerd501c132003-02-26 19:41:54 +0000130}
131
Chris Lattnerc1820032003-09-20 03:08:47 +0000132// getUnderlyingObject - This traverses the use chain to figure out what object
133// the specified value points to. If the value points to, or is derived from, a
134// unique object or an argument, return it.
Chris Lattnerd501c132003-02-26 19:41:54 +0000135static const Value *getUnderlyingObject(const Value *V) {
136 if (!isa<PointerType>(V->getType())) return 0;
137
138 // If we are at some type of object... return it.
Chris Lattnerc1820032003-09-20 03:08:47 +0000139 if (hasUniqueAddress(V) || isa<Argument>(V)) return V;
Chris Lattnerd501c132003-02-26 19:41:54 +0000140
141 // Traverse through different addressing mechanisms...
142 if (const Instruction *I = dyn_cast<Instruction>(V)) {
143 if (isa<CastInst>(I) || isa<GetElementPtrInst>(I))
144 return getUnderlyingObject(I->getOperand(0));
Chris Lattner388f6692003-06-17 15:25:37 +0000145 } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
146 if (CE->getOpcode() == Instruction::Cast ||
147 CE->getOpcode() == Instruction::GetElementPtr)
148 return getUnderlyingObject(CE->getOperand(0));
Reid Spencere8404342004-07-18 00:18:30 +0000149 } else if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
150 return GV;
Chris Lattnerd501c132003-02-26 19:41:54 +0000151 }
152 return 0;
153}
154
Chris Lattnerb307c882003-12-11 22:44:13 +0000155static const User *isGEP(const Value *V) {
156 if (isa<GetElementPtrInst>(V) ||
157 (isa<ConstantExpr>(V) &&
158 cast<ConstantExpr>(V)->getOpcode() == Instruction::GetElementPtr))
159 return cast<User>(V);
160 return 0;
161}
Chris Lattnerd501c132003-02-26 19:41:54 +0000162
Chris Lattner4a830882003-12-11 23:20:16 +0000163static const Value *GetGEPOperands(const Value *V, std::vector<Value*> &GEPOps){
164 assert(GEPOps.empty() && "Expect empty list to populate!");
165 GEPOps.insert(GEPOps.end(), cast<User>(V)->op_begin()+1,
166 cast<User>(V)->op_end());
167
168 // Accumulate all of the chained indexes into the operand array
169 V = cast<User>(V)->getOperand(0);
170
171 while (const User *G = isGEP(V)) {
Reid Spencere8404342004-07-18 00:18:30 +0000172 if (!isa<Constant>(GEPOps[0]) || isa<GlobalValue>(GEPOps[0]) ||
Chris Lattner4a830882003-12-11 23:20:16 +0000173 !cast<Constant>(GEPOps[0])->isNullValue())
174 break; // Don't handle folding arbitrary pointer offsets yet...
175 GEPOps.erase(GEPOps.begin()); // Drop the zero index
176 GEPOps.insert(GEPOps.begin(), G->op_begin()+1, G->op_end());
177 V = G->getOperand(0);
178 }
179 return V;
180}
181
Chris Lattnerbc1daaa2004-01-30 22:17:24 +0000182/// pointsToConstantMemory - Chase pointers until we find a (constant
183/// global) or not.
184bool BasicAliasAnalysis::pointsToConstantMemory(const Value *P) {
Chris Lattnera4dd6742004-01-30 22:48:02 +0000185 if (const Value *V = getUnderlyingObject(P))
186 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
187 return GV->isConstant();
Chris Lattnerbc1daaa2004-01-30 22:17:24 +0000188 return false;
189}
Chris Lattner4a830882003-12-11 23:20:16 +0000190
Chris Lattner04b75932004-03-12 22:39:00 +0000191static bool AddressMightEscape(const Value *V) {
192 for (Value::use_const_iterator UI = V->use_begin(), E = V->use_end();
193 UI != E; ++UI) {
194 const Instruction *I = cast<Instruction>(*UI);
195 switch (I->getOpcode()) {
196 case Instruction::Load: break;
197 case Instruction::Store:
198 if (I->getOperand(0) == V)
199 return true; // Escapes if the pointer is stored.
200 break;
201 case Instruction::GetElementPtr:
202 if (AddressMightEscape(I)) return true;
203 break;
204 case Instruction::Cast:
205 if (!isa<PointerType>(I->getType()))
206 return true;
207 if (AddressMightEscape(I)) return true;
208 break;
Chris Lattnerdb5b80a2004-07-27 02:18:52 +0000209 case Instruction::Ret:
210 // If returned, the address will escape to calling functions, but no
211 // callees could modify it.
212 break;
Chris Lattner04b75932004-03-12 22:39:00 +0000213 default:
214 return true;
215 }
216 }
217 return false;
218}
219
220// getModRefInfo - Check to see if the specified callsite can clobber the
221// specified memory object. Since we only look at local properties of this
222// function, we really can't say much about this query. We do, however, use
223// simple "address taken" analysis on local objects.
224//
225AliasAnalysis::ModRefResult
226BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
Reid Spencere8404342004-07-18 00:18:30 +0000227 if (!isa<Constant>(P))
Chris Lattner04b75932004-03-12 22:39:00 +0000228 if (const AllocationInst *AI =
Chris Lattner7a82ba02004-03-12 23:12:55 +0000229 dyn_cast_or_null<AllocationInst>(getUnderlyingObject(P))) {
Chris Lattner04b75932004-03-12 22:39:00 +0000230 // Okay, the pointer is to a stack allocated object. If we can prove that
231 // the pointer never "escapes", then we know the call cannot clobber it,
232 // because it simply can't get its address.
233 if (!AddressMightEscape(AI))
234 return NoModRef;
235 }
236
Chris Lattnerbbcc1472004-03-15 04:18:28 +0000237 // The AliasAnalysis base class has some smarts, lets use them.
238 return AliasAnalysis::getModRefInfo(CS, P, Size);
Chris Lattner04b75932004-03-12 22:39:00 +0000239}
240
Chris Lattnerd501c132003-02-26 19:41:54 +0000241// alias - Provide a bunch of ad-hoc rules to disambiguate in common cases, such
242// as array references. Note that this function is heavily tail recursive.
243// Hopefully we have a smart C++ compiler. :)
244//
245AliasAnalysis::AliasResult
246BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size,
247 const Value *V2, unsigned V2Size) {
Chris Lattnerb307c882003-12-11 22:44:13 +0000248 // Strip off any constant expression casts if they exist
249 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V1))
Chris Lattnerbb8f43c2004-07-21 03:56:54 +0000250 if (CE->getOpcode() == Instruction::Cast &&
251 isa<PointerType>(CE->getOperand(0)->getType()))
Chris Lattnerb307c882003-12-11 22:44:13 +0000252 V1 = CE->getOperand(0);
253 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V2))
Chris Lattnerbb8f43c2004-07-21 03:56:54 +0000254 if (CE->getOpcode() == Instruction::Cast &&
255 isa<PointerType>(CE->getOperand(0)->getType()))
Chris Lattnerb307c882003-12-11 22:44:13 +0000256 V2 = CE->getOperand(0);
257
Chris Lattnerd501c132003-02-26 19:41:54 +0000258 // Are we checking for alias of the same value?
259 if (V1 == V2) return MustAlias;
260
261 if ((!isa<PointerType>(V1->getType()) || !isa<PointerType>(V2->getType())) &&
262 V1->getType() != Type::LongTy && V2->getType() != Type::LongTy)
263 return NoAlias; // Scalars cannot alias each other
264
265 // Strip off cast instructions...
266 if (const Instruction *I = dyn_cast<CastInst>(V1))
Chris Lattnerbb8f43c2004-07-21 03:56:54 +0000267 if (isa<PointerType>(I->getOperand(0)->getType()))
268 return alias(I->getOperand(0), V1Size, V2, V2Size);
Chris Lattnerd501c132003-02-26 19:41:54 +0000269 if (const Instruction *I = dyn_cast<CastInst>(V2))
Chris Lattnerbb8f43c2004-07-21 03:56:54 +0000270 if (isa<PointerType>(I->getOperand(0)->getType()))
271 return alias(V1, V1Size, I->getOperand(0), V2Size);
Chris Lattnerd501c132003-02-26 19:41:54 +0000272
273 // Figure out what objects these things are pointing to if we can...
274 const Value *O1 = getUnderlyingObject(V1);
275 const Value *O2 = getUnderlyingObject(V2);
276
Misha Brukman2f2d0652003-09-11 18:14:24 +0000277 // Pointing at a discernible object?
Chris Lattner0a1ac902004-11-26 19:20:01 +0000278 if (O1) {
279 if (O2) {
280 if (isa<Argument>(O1)) {
281 // Incoming argument cannot alias locally allocated object!
282 if (isa<AllocationInst>(O2)) return NoAlias;
283 // Otherwise, nothing is known...
284 } else if (isa<Argument>(O2)) {
285 // Incoming argument cannot alias locally allocated object!
286 if (isa<AllocationInst>(O1)) return NoAlias;
287 // Otherwise, nothing is known...
288 } else if (O1 != O2) {
289 // If they are two different objects, we know that we have no alias...
290 return NoAlias;
291 }
292
293 // If they are the same object, they we can look at the indexes. If they
294 // index off of the object is the same for both pointers, they must alias.
295 // If they are provably different, they must not alias. Otherwise, we
296 // can't tell anything.
Chris Lattnerc1820032003-09-20 03:08:47 +0000297 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000298
Chris Lattner0a1ac902004-11-26 19:20:01 +0000299
300 if (!isa<Argument>(O1) && isa<ConstantPointerNull>(V2))
301 return NoAlias; // Unique values don't alias null
302
Chris Lattner4e616762004-11-26 20:01:48 +0000303 if (isa<GlobalVariable>(O1) || isa<AllocationInst>(O1))
304 if (cast<PointerType>(O1->getType())->getElementType()->isSized()) {
Chris Lattner0a1ac902004-11-26 19:20:01 +0000305 // If the size of the other access is larger than the total size of the
Chris Lattner4e616762004-11-26 20:01:48 +0000306 // global/alloca/malloc, it cannot be accessing the global (it's
307 // undefined to load or store bytes before or after an object).
308 const Type *ElTy = cast<PointerType>(O1->getType())->getElementType();
309 unsigned GlobalSize = getTargetData().getTypeSize(ElTy);
Chris Lattnereaf8f9c2004-11-28 20:30:15 +0000310 if (GlobalSize < V2Size && V2Size != ~0U)
Chris Lattner0a1ac902004-11-26 19:20:01 +0000311 return NoAlias;
312 }
313 }
314
315 if (O2) {
316 if (!isa<Argument>(O2) && isa<ConstantPointerNull>(V1))
317 return NoAlias; // Unique values don't alias null
318
Chris Lattner4e616762004-11-26 20:01:48 +0000319 if (isa<GlobalVariable>(O2) || isa<AllocationInst>(O2))
320 if (cast<PointerType>(O2->getType())->getElementType()->isSized()) {
Chris Lattner0a1ac902004-11-26 19:20:01 +0000321 // If the size of the other access is larger than the total size of the
Chris Lattner4e616762004-11-26 20:01:48 +0000322 // global/alloca/malloc, it cannot be accessing the object (it's
323 // undefined to load or store bytes before or after an object).
324 const Type *ElTy = cast<PointerType>(O2->getType())->getElementType();
325 unsigned GlobalSize = getTargetData().getTypeSize(ElTy);
Chris Lattnereaf8f9c2004-11-28 20:30:15 +0000326 if (GlobalSize < V1Size && V1Size != ~0U)
Chris Lattner0a1ac902004-11-26 19:20:01 +0000327 return NoAlias;
328 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000329 }
330
Chris Lattnerb307c882003-12-11 22:44:13 +0000331 // If we have two gep instructions with must-alias'ing base pointers, figure
332 // out if the indexes to the GEP tell us anything about the derived pointer.
333 // Note that we also handle chains of getelementptr instructions as well as
334 // constant expression getelementptrs here.
Chris Lattnerd501c132003-02-26 19:41:54 +0000335 //
Chris Lattnerb307c882003-12-11 22:44:13 +0000336 if (isGEP(V1) && isGEP(V2)) {
337 // Drill down into the first non-gep value, to test for must-aliasing of
338 // the base pointers.
339 const Value *BasePtr1 = V1, *BasePtr2 = V2;
340 do {
341 BasePtr1 = cast<User>(BasePtr1)->getOperand(0);
342 } while (isGEP(BasePtr1) &&
343 cast<User>(BasePtr1)->getOperand(1) ==
344 Constant::getNullValue(cast<User>(BasePtr1)->getOperand(1)->getType()));
345 do {
346 BasePtr2 = cast<User>(BasePtr2)->getOperand(0);
347 } while (isGEP(BasePtr2) &&
348 cast<User>(BasePtr2)->getOperand(1) ==
349 Constant::getNullValue(cast<User>(BasePtr2)->getOperand(1)->getType()));
350
351 // Do the base pointers alias?
352 AliasResult BaseAlias = alias(BasePtr1, V1Size, BasePtr2, V2Size);
353 if (BaseAlias == NoAlias) return NoAlias;
354 if (BaseAlias == MustAlias) {
355 // If the base pointers alias each other exactly, check to see if we can
356 // figure out anything about the resultant pointers, to try to prove
357 // non-aliasing.
358
359 // Collect all of the chained GEP operands together into one simple place
Chris Lattner4a830882003-12-11 23:20:16 +0000360 std::vector<Value*> GEP1Ops, GEP2Ops;
361 BasePtr1 = GetGEPOperands(V1, GEP1Ops);
362 BasePtr2 = GetGEPOperands(V2, GEP2Ops);
Chris Lattnerb307c882003-12-11 22:44:13 +0000363
Chris Lattner730b1ad2004-07-29 07:56:39 +0000364 // If GetGEPOperands were able to fold to the same must-aliased pointer,
365 // do the comparison.
366 if (BasePtr1 == BasePtr2) {
367 AliasResult GAlias =
368 CheckGEPInstructions(BasePtr1->getType(), GEP1Ops, V1Size,
369 BasePtr2->getType(), GEP2Ops, V2Size);
370 if (GAlias != MayAlias)
371 return GAlias;
372 }
Chris Lattnerb307c882003-12-11 22:44:13 +0000373 }
374 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000375
376 // Check to see if these two pointers are related by a getelementptr
377 // instruction. If one pointer is a GEP with a non-zero index of the other
378 // pointer, we know they cannot alias.
379 //
Chris Lattner4a830882003-12-11 23:20:16 +0000380 if (isGEP(V2)) {
Chris Lattnerd501c132003-02-26 19:41:54 +0000381 std::swap(V1, V2);
382 std::swap(V1Size, V2Size);
383 }
384
Chris Lattnerc330ee62003-02-26 21:57:23 +0000385 if (V1Size != ~0U && V2Size != ~0U)
Chris Lattner4a830882003-12-11 23:20:16 +0000386 if (const User *GEP = isGEP(V1)) {
387 std::vector<Value*> GEPOperands;
388 const Value *BasePtr = GetGEPOperands(V1, GEPOperands);
389
390 AliasResult R = alias(BasePtr, V1Size, V2, V2Size);
Chris Lattnerc330ee62003-02-26 21:57:23 +0000391 if (R == MustAlias) {
392 // If there is at least one non-zero constant index, we know they cannot
393 // alias.
394 bool ConstantFound = false;
Chris Lattner88d3e032003-12-11 06:02:00 +0000395 bool AllZerosFound = true;
Chris Lattner4a830882003-12-11 23:20:16 +0000396 for (unsigned i = 0, e = GEPOperands.size(); i != e; ++i)
397 if (const Constant *C = dyn_cast<Constant>(GEPOperands[i])) {
Chris Lattnerc330ee62003-02-26 21:57:23 +0000398 if (!C->isNullValue()) {
399 ConstantFound = true;
Chris Lattnerc54735e2003-12-11 06:06:28 +0000400 AllZerosFound = false;
Chris Lattnerc330ee62003-02-26 21:57:23 +0000401 break;
Chris Lattner88d3e032003-12-11 06:02:00 +0000402 }
403 } else {
404 AllZerosFound = false;
Chris Lattnerc330ee62003-02-26 21:57:23 +0000405 }
Chris Lattner88d3e032003-12-11 06:02:00 +0000406
407 // If we have getelementptr <ptr>, 0, 0, 0, 0, ... and V2 must aliases
408 // the ptr, the end result is a must alias also.
409 if (AllZerosFound)
410 return MustAlias;
411
Chris Lattnerc330ee62003-02-26 21:57:23 +0000412 if (ConstantFound) {
413 if (V2Size <= 1 && V1Size <= 1) // Just pointer check?
Chris Lattnerd501c132003-02-26 19:41:54 +0000414 return NoAlias;
Chris Lattnerc330ee62003-02-26 21:57:23 +0000415
416 // Otherwise we have to check to see that the distance is more than
417 // the size of the argument... build an index vector that is equal to
418 // the arguments provided, except substitute 0's for any variable
419 // indexes we find...
Alkis Evlogimenosa95cf302004-12-08 23:42:11 +0000420 if (cast<PointerType>(
421 BasePtr->getType())->getElementType()->isSized()) {
422 for (unsigned i = 0; i != GEPOperands.size(); ++i)
423 if (!isa<ConstantInt>(GEPOperands[i]))
424 GEPOperands[i] =
425 Constant::getNullValue(GEPOperands[i]->getType());
426 int64_t Offset =
427 getTargetData().getIndexedOffset(BasePtr->getType(), GEPOperands);
428
429 if (Offset >= (int64_t)V2Size || Offset <= -(int64_t)V1Size)
430 return NoAlias;
431 }
Chris Lattnerc330ee62003-02-26 21:57:23 +0000432 }
433 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000434 }
Chris Lattnerc330ee62003-02-26 21:57:23 +0000435
Chris Lattnerd501c132003-02-26 19:41:54 +0000436 return MayAlias;
437}
438
Chris Lattner28977af2004-04-05 01:30:19 +0000439static bool ValuesEqual(Value *V1, Value *V2) {
440 if (V1->getType() == V2->getType())
441 return V1 == V2;
442 if (Constant *C1 = dyn_cast<Constant>(V1))
443 if (Constant *C2 = dyn_cast<Constant>(V2)) {
444 // Sign extend the constants to long types.
445 C1 = ConstantExpr::getSignExtend(C1, Type::LongTy);
446 C2 = ConstantExpr::getSignExtend(C2, Type::LongTy);
447 return C1 == C2;
448 }
449 return false;
450}
451
Chris Lattnerb307c882003-12-11 22:44:13 +0000452/// CheckGEPInstructions - Check two GEP instructions with known must-aliasing
453/// base pointers. This checks to see if the index expressions preclude the
454/// pointers from aliasing...
455AliasAnalysis::AliasResult BasicAliasAnalysis::
456CheckGEPInstructions(const Type* BasePtr1Ty, std::vector<Value*> &GEP1Ops,
457 unsigned G1S,
458 const Type *BasePtr2Ty, std::vector<Value*> &GEP2Ops,
459 unsigned G2S) {
460 // We currently can't handle the case when the base pointers have different
461 // primitive types. Since this is uncommon anyway, we are happy being
462 // extremely conservative.
463 if (BasePtr1Ty != BasePtr2Ty)
464 return MayAlias;
465
Alkis Evlogimenosc49741d2004-12-08 23:56:15 +0000466 const PointerType *GEPPointerTy = cast<PointerType>(BasePtr1Ty);
Chris Lattnerb307c882003-12-11 22:44:13 +0000467
468 // Find the (possibly empty) initial sequence of equal values... which are not
469 // necessarily constants.
470 unsigned NumGEP1Operands = GEP1Ops.size(), NumGEP2Operands = GEP2Ops.size();
471 unsigned MinOperands = std::min(NumGEP1Operands, NumGEP2Operands);
472 unsigned MaxOperands = std::max(NumGEP1Operands, NumGEP2Operands);
473 unsigned UnequalOper = 0;
474 while (UnequalOper != MinOperands &&
Chris Lattner28977af2004-04-05 01:30:19 +0000475 ValuesEqual(GEP1Ops[UnequalOper], GEP2Ops[UnequalOper])) {
Chris Lattnerb307c882003-12-11 22:44:13 +0000476 // Advance through the type as we go...
477 ++UnequalOper;
478 if (const CompositeType *CT = dyn_cast<CompositeType>(BasePtr1Ty))
479 BasePtr1Ty = CT->getTypeAtIndex(GEP1Ops[UnequalOper-1]);
480 else {
481 // If all operands equal each other, then the derived pointers must
482 // alias each other...
483 BasePtr1Ty = 0;
484 assert(UnequalOper == NumGEP1Operands && UnequalOper == NumGEP2Operands &&
485 "Ran out of type nesting, but not out of operands?");
486 return MustAlias;
Chris Lattner920bd792003-06-02 05:42:39 +0000487 }
488 }
Chris Lattner920bd792003-06-02 05:42:39 +0000489
Chris Lattnerb307c882003-12-11 22:44:13 +0000490 // If we have seen all constant operands, and run out of indexes on one of the
491 // getelementptrs, check to see if the tail of the leftover one is all zeros.
492 // If so, return mustalias.
Chris Lattner4a830882003-12-11 23:20:16 +0000493 if (UnequalOper == MinOperands) {
Chris Lattnerb307c882003-12-11 22:44:13 +0000494 if (GEP1Ops.size() < GEP2Ops.size()) std::swap(GEP1Ops, GEP2Ops);
Chris Lattnerd501c132003-02-26 19:41:54 +0000495
Chris Lattnerb307c882003-12-11 22:44:13 +0000496 bool AllAreZeros = true;
497 for (unsigned i = UnequalOper; i != MaxOperands; ++i)
Chris Lattnera35339d2004-10-16 16:07:10 +0000498 if (!isa<Constant>(GEP1Ops[i]) ||
Chris Lattnerb307c882003-12-11 22:44:13 +0000499 !cast<Constant>(GEP1Ops[i])->isNullValue()) {
500 AllAreZeros = false;
501 break;
502 }
503 if (AllAreZeros) return MustAlias;
504 }
505
Chris Lattnerd501c132003-02-26 19:41:54 +0000506
507 // So now we know that the indexes derived from the base pointers,
508 // which are known to alias, are different. We can still determine a
509 // no-alias result if there are differing constant pairs in the index
510 // chain. For example:
511 // A[i][0] != A[j][1] iff (&A[0][1]-&A[0][0] >= std::max(G1S, G2S))
512 //
513 unsigned SizeMax = std::max(G1S, G2S);
Chris Lattnereaf8f9c2004-11-28 20:30:15 +0000514 if (SizeMax == ~0U) return MayAlias; // Avoid frivolous work.
Chris Lattner920bd792003-06-02 05:42:39 +0000515
Chris Lattnerd501c132003-02-26 19:41:54 +0000516 // Scan for the first operand that is constant and unequal in the
Chris Lattner28977af2004-04-05 01:30:19 +0000517 // two getelementptrs...
Chris Lattnerd501c132003-02-26 19:41:54 +0000518 unsigned FirstConstantOper = UnequalOper;
Chris Lattnerb307c882003-12-11 22:44:13 +0000519 for (; FirstConstantOper != MinOperands; ++FirstConstantOper) {
520 const Value *G1Oper = GEP1Ops[FirstConstantOper];
521 const Value *G2Oper = GEP2Ops[FirstConstantOper];
522
Chris Lattner6eb88d42004-01-12 17:57:32 +0000523 if (G1Oper != G2Oper) // Found non-equal constant indexes...
Chris Lattnera35339d2004-10-16 16:07:10 +0000524 if (Constant *G1OC = dyn_cast<ConstantInt>(const_cast<Value*>(G1Oper)))
525 if (Constant *G2OC = dyn_cast<ConstantInt>(const_cast<Value*>(G2Oper))){
Chris Lattner28977af2004-04-05 01:30:19 +0000526 if (G1OC->getType() != G2OC->getType()) {
527 // Sign extend both operands to long.
528 G1OC = ConstantExpr::getSignExtend(G1OC, Type::LongTy);
529 G2OC = ConstantExpr::getSignExtend(G2OC, Type::LongTy);
530 GEP1Ops[FirstConstantOper] = G1OC;
531 GEP2Ops[FirstConstantOper] = G2OC;
532 }
533
534 if (G1OC != G2OC) {
Chris Lattnera35339d2004-10-16 16:07:10 +0000535 // Make sure they are comparable (ie, not constant expressions), and
536 // make sure the GEP with the smaller leading constant is GEP1.
Chris Lattner28977af2004-04-05 01:30:19 +0000537 Constant *Compare = ConstantExpr::getSetGT(G1OC, G2OC);
538 if (ConstantBool *CV = dyn_cast<ConstantBool>(Compare)) {
539 if (CV->getValue()) // If they are comparable and G2 > G1
540 std::swap(GEP1Ops, GEP2Ops); // Make GEP1 < GEP2
541 break;
542 }
Chris Lattner6eb88d42004-01-12 17:57:32 +0000543 }
544 }
Chris Lattnerb307c882003-12-11 22:44:13 +0000545 BasePtr1Ty = cast<CompositeType>(BasePtr1Ty)->getTypeAtIndex(G1Oper);
Chris Lattnerd501c132003-02-26 19:41:54 +0000546 }
547
Chris Lattnerb307c882003-12-11 22:44:13 +0000548 // No shared constant operands, and we ran out of common operands. At this
549 // point, the GEP instructions have run through all of their operands, and we
550 // haven't found evidence that there are any deltas between the GEP's.
551 // However, one GEP may have more operands than the other. If this is the
Chris Lattner28977af2004-04-05 01:30:19 +0000552 // case, there may still be hope. Check this now.
Chris Lattnerb307c882003-12-11 22:44:13 +0000553 if (FirstConstantOper == MinOperands) {
554 // Make GEP1Ops be the longer one if there is a longer one.
555 if (GEP1Ops.size() < GEP2Ops.size())
556 std::swap(GEP1Ops, GEP2Ops);
557
558 // Is there anything to check?
559 if (GEP1Ops.size() > MinOperands) {
560 for (unsigned i = FirstConstantOper; i != MaxOperands; ++i)
Chris Lattnerf70770a2004-07-14 20:27:12 +0000561 if (isa<ConstantInt>(GEP1Ops[i]) &&
Chris Lattnerb307c882003-12-11 22:44:13 +0000562 !cast<Constant>(GEP1Ops[i])->isNullValue()) {
563 // Yup, there's a constant in the tail. Set all variables to
564 // constants in the GEP instruction to make it suiteable for
565 // TargetData::getIndexedOffset.
566 for (i = 0; i != MaxOperands; ++i)
Chris Lattnerf70770a2004-07-14 20:27:12 +0000567 if (!isa<ConstantInt>(GEP1Ops[i]))
Chris Lattnerb307c882003-12-11 22:44:13 +0000568 GEP1Ops[i] = Constant::getNullValue(GEP1Ops[i]->getType());
569 // Okay, now get the offset. This is the relative offset for the full
570 // instruction.
571 const TargetData &TD = getTargetData();
572 int64_t Offset1 = TD.getIndexedOffset(GEPPointerTy, GEP1Ops);
573
574 // Now crop off any constants from the end...
575 GEP1Ops.resize(MinOperands);
576 int64_t Offset2 = TD.getIndexedOffset(GEPPointerTy, GEP1Ops);
577
578 // If the tail provided a bit enough offset, return noalias!
579 if ((uint64_t)(Offset2-Offset1) >= SizeMax)
580 return NoAlias;
581 }
582 }
583
584 // Couldn't find anything useful.
585 return MayAlias;
586 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000587
588 // If there are non-equal constants arguments, then we can figure
589 // out a minimum known delta between the two index expressions... at
590 // this point we know that the first constant index of GEP1 is less
591 // than the first constant index of GEP2.
Chris Lattner1af55e12003-11-25 20:10:07 +0000592
Chris Lattnerb307c882003-12-11 22:44:13 +0000593 // Advance BasePtr[12]Ty over this first differing constant operand.
594 BasePtr2Ty = cast<CompositeType>(BasePtr1Ty)->getTypeAtIndex(GEP2Ops[FirstConstantOper]);
595 BasePtr1Ty = cast<CompositeType>(BasePtr1Ty)->getTypeAtIndex(GEP1Ops[FirstConstantOper]);
Chris Lattnerd501c132003-02-26 19:41:54 +0000596
Chris Lattnerb307c882003-12-11 22:44:13 +0000597 // We are going to be using TargetData::getIndexedOffset to determine the
598 // offset that each of the GEP's is reaching. To do this, we have to convert
599 // all variable references to constant references. To do this, we convert the
600 // initial equal sequence of variables into constant zeros to start with.
Chris Lattnera35339d2004-10-16 16:07:10 +0000601 for (unsigned i = 0; i != FirstConstantOper; ++i)
602 if (!isa<ConstantInt>(GEP1Ops[i]) || !isa<ConstantInt>(GEP2Ops[i]))
Chris Lattner28977af2004-04-05 01:30:19 +0000603 GEP1Ops[i] = GEP2Ops[i] = Constant::getNullValue(Type::UIntTy);
Chris Lattnerb307c882003-12-11 22:44:13 +0000604
605 // We know that GEP1Ops[FirstConstantOper] & GEP2Ops[FirstConstantOper] are ok
Chris Lattnerd501c132003-02-26 19:41:54 +0000606
607 // Loop over the rest of the operands...
Chris Lattnerb307c882003-12-11 22:44:13 +0000608 for (unsigned i = FirstConstantOper+1; i != MaxOperands; ++i) {
609 const Value *Op1 = i < GEP1Ops.size() ? GEP1Ops[i] : 0;
610 const Value *Op2 = i < GEP2Ops.size() ? GEP2Ops[i] : 0;
611 // If they are equal, use a zero index...
612 if (Op1 == Op2 && BasePtr1Ty == BasePtr2Ty) {
Chris Lattnera35339d2004-10-16 16:07:10 +0000613 if (!isa<ConstantInt>(Op1))
Chris Lattnerb307c882003-12-11 22:44:13 +0000614 GEP1Ops[i] = GEP2Ops[i] = Constant::getNullValue(Op1->getType());
615 // Otherwise, just keep the constants we have.
Chris Lattnerd501c132003-02-26 19:41:54 +0000616 } else {
Chris Lattnerb307c882003-12-11 22:44:13 +0000617 if (Op1) {
618 if (const ConstantInt *Op1C = dyn_cast<ConstantInt>(Op1)) {
619 // If this is an array index, make sure the array element is in range.
620 if (const ArrayType *AT = dyn_cast<ArrayType>(BasePtr1Ty))
621 if (Op1C->getRawValue() >= AT->getNumElements())
622 return MayAlias; // Be conservative with out-of-range accesses
623
624 } else {
625 // GEP1 is known to produce a value less than GEP2. To be
626 // conservatively correct, we must assume the largest possible
627 // constant is used in this position. This cannot be the initial
628 // index to the GEP instructions (because we know we have at least one
629 // element before this one with the different constant arguments), so
630 // we know that the current index must be into either a struct or
631 // array. Because we know it's not constant, this cannot be a
632 // structure index. Because of this, we can calculate the maximum
633 // value possible.
634 //
635 if (const ArrayType *AT = dyn_cast<ArrayType>(BasePtr1Ty))
636 GEP1Ops[i] = ConstantSInt::get(Type::LongTy,AT->getNumElements()-1);
637 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000638 }
639
Chris Lattnerb307c882003-12-11 22:44:13 +0000640 if (Op2) {
641 if (const ConstantInt *Op2C = dyn_cast<ConstantInt>(Op2)) {
642 // If this is an array index, make sure the array element is in range.
643 if (const ArrayType *AT = dyn_cast<ArrayType>(BasePtr1Ty))
644 if (Op2C->getRawValue() >= AT->getNumElements())
645 return MayAlias; // Be conservative with out-of-range accesses
646 } else { // Conservatively assume the minimum value for this index
647 GEP2Ops[i] = Constant::getNullValue(Op2->getType());
648 }
Chris Lattner920bd792003-06-02 05:42:39 +0000649 }
Chris Lattnerb307c882003-12-11 22:44:13 +0000650 }
651
652 if (BasePtr1Ty && Op1) {
653 if (const CompositeType *CT = dyn_cast<CompositeType>(BasePtr1Ty))
654 BasePtr1Ty = CT->getTypeAtIndex(GEP1Ops[i]);
655 else
656 BasePtr1Ty = 0;
657 }
658
659 if (BasePtr2Ty && Op2) {
660 if (const CompositeType *CT = dyn_cast<CompositeType>(BasePtr2Ty))
661 BasePtr2Ty = CT->getTypeAtIndex(GEP2Ops[i]);
662 else
663 BasePtr2Ty = 0;
Chris Lattnerd501c132003-02-26 19:41:54 +0000664 }
665 }
666
Alkis Evlogimenosc49741d2004-12-08 23:56:15 +0000667 if (GEPPointerTy->getElementType()->isSized()) {
668 int64_t Offset1 = getTargetData().getIndexedOffset(GEPPointerTy, GEP1Ops);
669 int64_t Offset2 = getTargetData().getIndexedOffset(GEPPointerTy, GEP2Ops);
670 assert(Offset1<Offset2 && "There is at least one different constant here!");
Chris Lattnerd501c132003-02-26 19:41:54 +0000671
Alkis Evlogimenosc49741d2004-12-08 23:56:15 +0000672 if ((uint64_t)(Offset2-Offset1) >= SizeMax) {
673 //std::cerr << "Determined that these two GEP's don't alias ["
674 // << SizeMax << " bytes]: \n" << *GEP1 << *GEP2;
675 return NoAlias;
676 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000677 }
678 return MayAlias;
679}
680
Chris Lattner4244bb52004-03-15 03:36:49 +0000681namespace {
682 struct StringCompare {
683 bool operator()(const char *LHS, const char *RHS) {
684 return strcmp(LHS, RHS) < 0;
685 }
686 };
687}
688
689// Note that this list cannot contain libm functions (such as acos and sqrt)
690// that set errno on a domain or other error.
691static const char *DoesntAccessMemoryTable[] = {
Chris Lattnerb903fc52004-04-10 06:55:27 +0000692 // LLVM intrinsics:
Chris Lattner0af024c2004-12-15 07:22:13 +0000693 "llvm.frameaddress", "llvm.returnaddress", "llvm.readport",
694 "llvm.isunordered",
Chris Lattnerb903fc52004-04-10 06:55:27 +0000695
Chris Lattner4244bb52004-03-15 03:36:49 +0000696 "abs", "labs", "llabs", "imaxabs", "fabs", "fabsf", "fabsl",
697 "trunc", "truncf", "truncl", "ldexp",
698
699 "atan", "atanf", "atanl", "atan2", "atan2f", "atan2l",
700 "cbrt",
701 "cos", "cosf", "cosl", "cosh", "coshf", "coshl",
702 "exp", "expf", "expl",
703 "hypot",
704 "sin", "sinf", "sinl", "sinh", "sinhf", "sinhl",
705 "tan", "tanf", "tanl", "tanh", "tanhf", "tanhl",
706
Chris Lattnerbbcc1472004-03-15 04:18:28 +0000707 // ctype.h
Chris Lattner4244bb52004-03-15 03:36:49 +0000708 "isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower", "isprint"
709 "ispunct", "isspace", "isupper", "isxdigit", "tolower", "toupper",
710
Chris Lattnerbbcc1472004-03-15 04:18:28 +0000711 // wctype.h"
Chris Lattner4244bb52004-03-15 03:36:49 +0000712 "iswalnum", "iswalpha", "iswcntrl", "iswdigit", "iswgraph", "iswlower",
713 "iswprint", "iswpunct", "iswspace", "iswupper", "iswxdigit",
714
Chris Lattnerbbcc1472004-03-15 04:18:28 +0000715 "iswctype", "towctrans", "towlower", "towupper",
716
Chris Lattner4244bb52004-03-15 03:36:49 +0000717 "btowc", "wctob",
Chris Lattner002be762004-03-16 03:41:35 +0000718
719 "isinf", "isnan", "finite",
720
721 // C99 math functions
722 "copysign", "copysignf", "copysignd",
723 "nexttoward", "nexttowardf", "nexttowardd",
724 "nextafter", "nextafterf", "nextafterd",
725
726 // glibc functions:
727 "__fpclassify", "__fpclassifyf", "__fpclassifyl",
728 "__signbit", "__signbitf", "__signbitl",
Chris Lattner4244bb52004-03-15 03:36:49 +0000729};
730
731static const unsigned DAMTableSize =
732 sizeof(DoesntAccessMemoryTable)/sizeof(DoesntAccessMemoryTable[0]);
733
Chris Lattner4244bb52004-03-15 03:36:49 +0000734static const char *OnlyReadsMemoryTable[] = {
Chris Lattner002be762004-03-16 03:41:35 +0000735 "atoi", "atol", "atof", "atoll", "atoq", "a64l",
736 "bcmp", "memcmp", "memchr", "memrchr", "wmemcmp", "wmemchr",
Chris Lattner4244bb52004-03-15 03:36:49 +0000737
738 // Strings
739 "strcmp", "strcasecmp", "strcoll", "strncmp", "strncasecmp",
740 "strchr", "strcspn", "strlen", "strpbrk", "strrchr", "strspn", "strstr",
Chris Lattner002be762004-03-16 03:41:35 +0000741 "index", "rindex",
Chris Lattner4244bb52004-03-15 03:36:49 +0000742
743 // Wide char strings
744 "wcschr", "wcscmp", "wcscoll", "wcscspn", "wcslen", "wcsncmp", "wcspbrk",
745 "wcsrchr", "wcsspn", "wcsstr",
Chris Lattner002be762004-03-16 03:41:35 +0000746
747 // glibc
748 "alphasort", "alphasort64", "versionsort", "versionsort64",
749
750 // C99
751 "nan", "nanf", "nand",
Chris Lattnerb903fc52004-04-10 06:55:27 +0000752
753 // File I/O
754 "feof", "ferror", "fileno",
755 "feof_unlocked", "ferror_unlocked", "fileno_unlocked"
Chris Lattner4244bb52004-03-15 03:36:49 +0000756};
757
758static const unsigned ORMTableSize =
759 sizeof(OnlyReadsMemoryTable)/sizeof(OnlyReadsMemoryTable[0]);
Chris Lattner0af024c2004-12-15 07:22:13 +0000760
761AliasAnalysis::ModRefBehavior
762BasicAliasAnalysis::getModRefBehavior(Function *F, CallSite CS,
763 std::vector<PointerAccessInfo> *Info) {
764 if (!F->isExternal()) return UnknownModRefBehavior;
Chris Lattner4244bb52004-03-15 03:36:49 +0000765
766 static bool Initialized = false;
767 if (!Initialized) {
768 // Sort the table the first time through.
Chris Lattner0af024c2004-12-15 07:22:13 +0000769 std::sort(DoesntAccessMemoryTable, DoesntAccessMemoryTable+DAMTableSize,
770 StringCompare());
Chris Lattner4244bb52004-03-15 03:36:49 +0000771 std::sort(OnlyReadsMemoryTable, OnlyReadsMemoryTable+ORMTableSize,
772 StringCompare());
773 Initialized = true;
774 }
775
Chris Lattner0af024c2004-12-15 07:22:13 +0000776 const char **Ptr = std::lower_bound(DoesntAccessMemoryTable,
777 DoesntAccessMemoryTable+DAMTableSize,
Chris Lattner4244bb52004-03-15 03:36:49 +0000778 F->getName().c_str(), StringCompare());
Chris Lattner0af024c2004-12-15 07:22:13 +0000779 if (Ptr != DoesntAccessMemoryTable+DAMTableSize && *Ptr == F->getName())
780 return DoesNotAccessMemory;
781
782 Ptr = std::lower_bound(OnlyReadsMemoryTable,
783 OnlyReadsMemoryTable+ORMTableSize,
784 F->getName().c_str(), StringCompare());
785 if (Ptr != OnlyReadsMemoryTable+ORMTableSize && *Ptr == F->getName())
786 return OnlyReadsMemory;
787
788 return UnknownModRefBehavior;
Chris Lattner4244bb52004-03-15 03:36:49 +0000789}