blob: 9e8aed6f805706479c822336a98f815fdc0c10b8 [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//
Chris Lattner6cdc42b2003-12-28 04:03:49 +000014// FIXME: This could be extended for a very simple form of mod/ref information.
15// If a pointer is locally allocated (either malloc or alloca) and never passed
16// into a call or stored to memory, then we know that calls will not mod/ref the
Chris Lattner2d6a6aa2004-03-01 02:44:44 +000017// memory. This can be important for tailcallelim, and can support CSE of loads
18// and dead store elimination across calls. This is particularly important for
19// stack allocated arrays.
Chris Lattner6cdc42b2003-12-28 04:03:49 +000020//
Chris Lattnerd501c132003-02-26 19:41:54 +000021//===----------------------------------------------------------------------===//
22
23#include "llvm/Analysis/AliasAnalysis.h"
Chris Lattner4244bb52004-03-15 03:36:49 +000024#include "llvm/Constants.h"
25#include "llvm/DerivedTypes.h"
26#include "llvm/Function.h"
27#include "llvm/GlobalVariable.h"
Chris Lattnerd501c132003-02-26 19:41:54 +000028#include "llvm/iOther.h"
Chris Lattnere735b2d2004-02-22 06:26:17 +000029#include "llvm/iMemory.h"
Chris Lattner4244bb52004-03-15 03:36:49 +000030#include "llvm/Pass.h"
Chris Lattnerd501c132003-02-26 19:41:54 +000031#include "llvm/Target/TargetData.h"
Chris Lattner1af55e12003-11-25 20:10:07 +000032#include "llvm/Support/GetElementPtrTypeIterator.h"
Chris Lattnerec4e8082003-11-25 18:33:40 +000033using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000034
Chris Lattnerd501c132003-02-26 19:41:54 +000035// Make sure that anything that uses AliasAnalysis pulls in this file...
Chris Lattner86391452003-12-11 05:44:59 +000036void llvm::BasicAAStub() {}
Chris Lattnerd501c132003-02-26 19:41:54 +000037
Chris Lattnerd501c132003-02-26 19:41:54 +000038namespace {
Chris Lattnerb52f4402004-05-23 21:15:12 +000039 /// NoAA - This class implements the -no-aa pass, which always returns "I
40 /// don't know" for alias queries. NoAA is unlike other alias analysis
41 /// implementations, in that it does not chain to a previous analysis. As
42 /// such it doesn't follow many of the rules that other alias analyses must.
43 ///
44 struct NoAA : public ImmutablePass, public AliasAnalysis {
45 virtual AliasResult alias(const Value *V1, unsigned V1Size,
46 const Value *V2, unsigned V2Size) {
47 return MayAlias;
48 }
49
50 virtual void getMustAliases(Value *P, std::vector<Value*> &RetVals) { }
51 virtual bool pointsToConstantMemory(const Value *P) { return false; }
52 virtual bool doesNotAccessMemory(Function *F) { return false; }
53 virtual bool onlyReadsMemory(Function *F) { return false; }
54 virtual ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size) {
55 return ModRef;
56 }
57 virtual ModRefResult getModRefInfo(CallSite CS1, CallSite CS2) {
58 return ModRef;
59 }
60 virtual bool hasNoModRefInfoForCalls() const { return true; }
61
62 virtual void deleteValue(Value *V) {}
63 virtual void copyValue(Value *From, Value *To) {}
64 virtual void getAnalysisUsage(AnalysisUsage &AU) const {}
65 };
66
67 // Register this pass...
68 RegisterOpt<NoAA>
69 U("no-aa", "No Alias Analysis (always returns 'may' alias)");
70
71 // Declare that we implement the AliasAnalysis interface
72 RegisterAnalysisGroup<AliasAnalysis, NoAA> V;
73} // End of anonymous namespace
74
75
76namespace {
77 /// BasicAliasAnalysis - This is the default alias analysis implementation.
78 /// Because it doesn't chain to a previous alias analysis (like -no-aa), it
79 /// derives from the NoAA class.
80 struct BasicAliasAnalysis : public NoAA {
Chris Lattnerd501c132003-02-26 19:41:54 +000081 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattnerb52f4402004-05-23 21:15:12 +000082 AU.addRequired<TargetData>();
Chris Lattnerd501c132003-02-26 19:41:54 +000083 }
84
Chris Lattnerb52f4402004-05-23 21:15:12 +000085 virtual void initializePass() {
86 TD = &getAnalysis<TargetData>();
87 }
Chris Lattnerd501c132003-02-26 19:41:54 +000088
Chris Lattnerd501c132003-02-26 19:41:54 +000089 AliasResult alias(const Value *V1, unsigned V1Size,
90 const Value *V2, unsigned V2Size);
Chris Lattnerbc1daaa2004-01-30 22:17:24 +000091
Chris Lattner04b75932004-03-12 22:39:00 +000092 ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size);
93
Chris Lattner65585aa2004-04-11 16:43:07 +000094 /// hasNoModRefInfoForCalls - We have no way to test one call against
95 /// another, unless they are pure or const.
96 virtual bool hasNoModRefInfoForCalls() const { return true; }
97
Chris Lattnerbc1daaa2004-01-30 22:17:24 +000098 /// pointsToConstantMemory - Chase pointers until we find a (constant
99 /// global) or not.
100 bool pointsToConstantMemory(const Value *P);
101
Chris Lattner4244bb52004-03-15 03:36:49 +0000102 virtual bool doesNotAccessMemory(Function *F);
103 virtual bool onlyReadsMemory(Function *F);
104
Chris Lattnerd501c132003-02-26 19:41:54 +0000105 private:
Chris Lattnerb307c882003-12-11 22:44:13 +0000106 // CheckGEPInstructions - Check two GEP instructions with known
107 // must-aliasing base pointers. This checks to see if the index expressions
Chris Lattnerd501c132003-02-26 19:41:54 +0000108 // preclude the pointers from aliasing...
Chris Lattnerb307c882003-12-11 22:44:13 +0000109 AliasResult
110 CheckGEPInstructions(const Type* BasePtr1Ty, std::vector<Value*> &GEP1Ops,
111 unsigned G1Size,
112 const Type *BasePtr2Ty, std::vector<Value*> &GEP2Ops,
113 unsigned G2Size);
Chris Lattnerd501c132003-02-26 19:41:54 +0000114 };
115
116 // Register this pass...
117 RegisterOpt<BasicAliasAnalysis>
118 X("basicaa", "Basic Alias Analysis (default AA impl)");
119
120 // Declare that we implement the AliasAnalysis interface
121 RegisterAnalysisGroup<AliasAnalysis, BasicAliasAnalysis, true> Y;
122} // End of anonymous namespace
123
Chris Lattnerc1820032003-09-20 03:08:47 +0000124// hasUniqueAddress - Return true if the specified value points to something
125// with a unique, discernable, address.
Chris Lattnerd501c132003-02-26 19:41:54 +0000126static inline bool hasUniqueAddress(const Value *V) {
Chris Lattnerc1820032003-09-20 03:08:47 +0000127 return isa<GlobalValue>(V) || isa<AllocationInst>(V);
Chris Lattnerd501c132003-02-26 19:41:54 +0000128}
129
Chris Lattnerc1820032003-09-20 03:08:47 +0000130// getUnderlyingObject - This traverses the use chain to figure out what object
131// the specified value points to. If the value points to, or is derived from, a
132// unique object or an argument, return it.
Chris Lattnerd501c132003-02-26 19:41:54 +0000133static const Value *getUnderlyingObject(const Value *V) {
134 if (!isa<PointerType>(V->getType())) return 0;
135
136 // If we are at some type of object... return it.
Chris Lattnerc1820032003-09-20 03:08:47 +0000137 if (hasUniqueAddress(V) || isa<Argument>(V)) return V;
Chris Lattnerd501c132003-02-26 19:41:54 +0000138
139 // Traverse through different addressing mechanisms...
140 if (const Instruction *I = dyn_cast<Instruction>(V)) {
141 if (isa<CastInst>(I) || isa<GetElementPtrInst>(I))
142 return getUnderlyingObject(I->getOperand(0));
Chris Lattner388f6692003-06-17 15:25:37 +0000143 } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
144 if (CE->getOpcode() == Instruction::Cast ||
145 CE->getOpcode() == Instruction::GetElementPtr)
146 return getUnderlyingObject(CE->getOperand(0));
147 } else if (const ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(V)) {
148 return CPR->getValue();
Chris Lattnerd501c132003-02-26 19:41:54 +0000149 }
150 return 0;
151}
152
Chris Lattnerb307c882003-12-11 22:44:13 +0000153static const User *isGEP(const Value *V) {
154 if (isa<GetElementPtrInst>(V) ||
155 (isa<ConstantExpr>(V) &&
156 cast<ConstantExpr>(V)->getOpcode() == Instruction::GetElementPtr))
157 return cast<User>(V);
158 return 0;
159}
Chris Lattnerd501c132003-02-26 19:41:54 +0000160
Chris Lattner4a830882003-12-11 23:20:16 +0000161static const Value *GetGEPOperands(const Value *V, std::vector<Value*> &GEPOps){
162 assert(GEPOps.empty() && "Expect empty list to populate!");
163 GEPOps.insert(GEPOps.end(), cast<User>(V)->op_begin()+1,
164 cast<User>(V)->op_end());
165
166 // Accumulate all of the chained indexes into the operand array
167 V = cast<User>(V)->getOperand(0);
168
169 while (const User *G = isGEP(V)) {
170 if (!isa<Constant>(GEPOps[0]) ||
171 !cast<Constant>(GEPOps[0])->isNullValue())
172 break; // Don't handle folding arbitrary pointer offsets yet...
173 GEPOps.erase(GEPOps.begin()); // Drop the zero index
174 GEPOps.insert(GEPOps.begin(), G->op_begin()+1, G->op_end());
175 V = G->getOperand(0);
176 }
177 return V;
178}
179
Chris Lattnerbc1daaa2004-01-30 22:17:24 +0000180/// pointsToConstantMemory - Chase pointers until we find a (constant
181/// global) or not.
182bool BasicAliasAnalysis::pointsToConstantMemory(const Value *P) {
Chris Lattnera4dd6742004-01-30 22:48:02 +0000183 if (const Value *V = getUnderlyingObject(P))
184 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
185 return GV->isConstant();
Chris Lattnerbc1daaa2004-01-30 22:17:24 +0000186 return false;
187}
Chris Lattner4a830882003-12-11 23:20:16 +0000188
Chris Lattner04b75932004-03-12 22:39:00 +0000189static bool AddressMightEscape(const Value *V) {
190 for (Value::use_const_iterator UI = V->use_begin(), E = V->use_end();
191 UI != E; ++UI) {
192 const Instruction *I = cast<Instruction>(*UI);
193 switch (I->getOpcode()) {
194 case Instruction::Load: break;
195 case Instruction::Store:
196 if (I->getOperand(0) == V)
197 return true; // Escapes if the pointer is stored.
198 break;
199 case Instruction::GetElementPtr:
200 if (AddressMightEscape(I)) return true;
201 break;
202 case Instruction::Cast:
203 if (!isa<PointerType>(I->getType()))
204 return true;
205 if (AddressMightEscape(I)) return true;
206 break;
Chris Lattner04b75932004-03-12 22:39:00 +0000207 default:
208 return true;
209 }
210 }
211 return false;
212}
213
214// getModRefInfo - Check to see if the specified callsite can clobber the
215// specified memory object. Since we only look at local properties of this
216// function, we really can't say much about this query. We do, however, use
217// simple "address taken" analysis on local objects.
218//
219AliasAnalysis::ModRefResult
220BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
221 if (!isa<Constant>(P) && !isa<GlobalValue>(P))
222 if (const AllocationInst *AI =
Chris Lattner7a82ba02004-03-12 23:12:55 +0000223 dyn_cast_or_null<AllocationInst>(getUnderlyingObject(P))) {
Chris Lattner04b75932004-03-12 22:39:00 +0000224 // Okay, the pointer is to a stack allocated object. If we can prove that
225 // the pointer never "escapes", then we know the call cannot clobber it,
226 // because it simply can't get its address.
227 if (!AddressMightEscape(AI))
228 return NoModRef;
229 }
230
Chris Lattnerbbcc1472004-03-15 04:18:28 +0000231 // The AliasAnalysis base class has some smarts, lets use them.
232 return AliasAnalysis::getModRefInfo(CS, P, Size);
Chris Lattner04b75932004-03-12 22:39:00 +0000233}
234
Chris Lattnerd501c132003-02-26 19:41:54 +0000235// alias - Provide a bunch of ad-hoc rules to disambiguate in common cases, such
236// as array references. Note that this function is heavily tail recursive.
237// Hopefully we have a smart C++ compiler. :)
238//
239AliasAnalysis::AliasResult
240BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size,
241 const Value *V2, unsigned V2Size) {
Chris Lattnerb307c882003-12-11 22:44:13 +0000242 // Strip off any constant expression casts if they exist
243 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V1))
244 if (CE->getOpcode() == Instruction::Cast)
245 V1 = CE->getOperand(0);
246 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V2))
247 if (CE->getOpcode() == Instruction::Cast)
248 V2 = CE->getOperand(0);
249
Chris Lattnerd501c132003-02-26 19:41:54 +0000250 // Strip off constant pointer refs if they exist
251 if (const ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(V1))
252 V1 = CPR->getValue();
253 if (const ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(V2))
254 V2 = CPR->getValue();
255
256 // Are we checking for alias of the same value?
257 if (V1 == V2) return MustAlias;
258
259 if ((!isa<PointerType>(V1->getType()) || !isa<PointerType>(V2->getType())) &&
260 V1->getType() != Type::LongTy && V2->getType() != Type::LongTy)
261 return NoAlias; // Scalars cannot alias each other
262
263 // Strip off cast instructions...
264 if (const Instruction *I = dyn_cast<CastInst>(V1))
265 return alias(I->getOperand(0), V1Size, V2, V2Size);
266 if (const Instruction *I = dyn_cast<CastInst>(V2))
267 return alias(V1, V1Size, I->getOperand(0), V2Size);
268
269 // Figure out what objects these things are pointing to if we can...
270 const Value *O1 = getUnderlyingObject(V1);
271 const Value *O2 = getUnderlyingObject(V2);
272
Misha Brukman2f2d0652003-09-11 18:14:24 +0000273 // Pointing at a discernible object?
Chris Lattnerd501c132003-02-26 19:41:54 +0000274 if (O1 && O2) {
Chris Lattnerc1820032003-09-20 03:08:47 +0000275 if (isa<Argument>(O1)) {
276 // Incoming argument cannot alias locally allocated object!
277 if (isa<AllocationInst>(O2)) return NoAlias;
278 // Otherwise, nothing is known...
279 } else if (isa<Argument>(O2)) {
280 // Incoming argument cannot alias locally allocated object!
281 if (isa<AllocationInst>(O1)) return NoAlias;
282 // Otherwise, nothing is known...
283 } else {
284 // If they are two different objects, we know that we have no alias...
285 if (O1 != O2) return NoAlias;
286 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000287
288 // If they are the same object, they we can look at the indexes. If they
289 // index off of the object is the same for both pointers, they must alias.
290 // If they are provably different, they must not alias. Otherwise, we can't
291 // tell anything.
Chris Lattnerc1820032003-09-20 03:08:47 +0000292 } else if (O1 && !isa<Argument>(O1) && isa<ConstantPointerNull>(V2)) {
Chris Lattnerd501c132003-02-26 19:41:54 +0000293 return NoAlias; // Unique values don't alias null
Chris Lattnerc1820032003-09-20 03:08:47 +0000294 } else if (O2 && !isa<Argument>(O2) && isa<ConstantPointerNull>(V1)) {
Chris Lattnerd501c132003-02-26 19:41:54 +0000295 return NoAlias; // Unique values don't alias null
296 }
297
Chris Lattnerb307c882003-12-11 22:44:13 +0000298 // If we have two gep instructions with must-alias'ing base pointers, figure
299 // out if the indexes to the GEP tell us anything about the derived pointer.
300 // Note that we also handle chains of getelementptr instructions as well as
301 // constant expression getelementptrs here.
Chris Lattnerd501c132003-02-26 19:41:54 +0000302 //
Chris Lattnerb307c882003-12-11 22:44:13 +0000303 if (isGEP(V1) && isGEP(V2)) {
304 // Drill down into the first non-gep value, to test for must-aliasing of
305 // the base pointers.
306 const Value *BasePtr1 = V1, *BasePtr2 = V2;
307 do {
308 BasePtr1 = cast<User>(BasePtr1)->getOperand(0);
309 } while (isGEP(BasePtr1) &&
310 cast<User>(BasePtr1)->getOperand(1) ==
311 Constant::getNullValue(cast<User>(BasePtr1)->getOperand(1)->getType()));
312 do {
313 BasePtr2 = cast<User>(BasePtr2)->getOperand(0);
314 } while (isGEP(BasePtr2) &&
315 cast<User>(BasePtr2)->getOperand(1) ==
316 Constant::getNullValue(cast<User>(BasePtr2)->getOperand(1)->getType()));
317
318 // Do the base pointers alias?
319 AliasResult BaseAlias = alias(BasePtr1, V1Size, BasePtr2, V2Size);
320 if (BaseAlias == NoAlias) return NoAlias;
321 if (BaseAlias == MustAlias) {
322 // If the base pointers alias each other exactly, check to see if we can
323 // figure out anything about the resultant pointers, to try to prove
324 // non-aliasing.
325
326 // Collect all of the chained GEP operands together into one simple place
Chris Lattner4a830882003-12-11 23:20:16 +0000327 std::vector<Value*> GEP1Ops, GEP2Ops;
328 BasePtr1 = GetGEPOperands(V1, GEP1Ops);
329 BasePtr2 = GetGEPOperands(V2, GEP2Ops);
Chris Lattnerb307c882003-12-11 22:44:13 +0000330
Chris Lattnerb307c882003-12-11 22:44:13 +0000331 AliasResult GAlias =
332 CheckGEPInstructions(BasePtr1->getType(), GEP1Ops, V1Size,
333 BasePtr2->getType(), GEP2Ops, V2Size);
334 if (GAlias != MayAlias)
335 return GAlias;
336 }
337 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000338
339 // Check to see if these two pointers are related by a getelementptr
340 // instruction. If one pointer is a GEP with a non-zero index of the other
341 // pointer, we know they cannot alias.
342 //
Chris Lattner4a830882003-12-11 23:20:16 +0000343 if (isGEP(V2)) {
Chris Lattnerd501c132003-02-26 19:41:54 +0000344 std::swap(V1, V2);
345 std::swap(V1Size, V2Size);
346 }
347
Chris Lattnerc330ee62003-02-26 21:57:23 +0000348 if (V1Size != ~0U && V2Size != ~0U)
Chris Lattner4a830882003-12-11 23:20:16 +0000349 if (const User *GEP = isGEP(V1)) {
350 std::vector<Value*> GEPOperands;
351 const Value *BasePtr = GetGEPOperands(V1, GEPOperands);
352
353 AliasResult R = alias(BasePtr, V1Size, V2, V2Size);
Chris Lattnerc330ee62003-02-26 21:57:23 +0000354 if (R == MustAlias) {
355 // If there is at least one non-zero constant index, we know they cannot
356 // alias.
357 bool ConstantFound = false;
Chris Lattner88d3e032003-12-11 06:02:00 +0000358 bool AllZerosFound = true;
Chris Lattner4a830882003-12-11 23:20:16 +0000359 for (unsigned i = 0, e = GEPOperands.size(); i != e; ++i)
360 if (const Constant *C = dyn_cast<Constant>(GEPOperands[i])) {
Chris Lattnerc330ee62003-02-26 21:57:23 +0000361 if (!C->isNullValue()) {
362 ConstantFound = true;
Chris Lattnerc54735e2003-12-11 06:06:28 +0000363 AllZerosFound = false;
Chris Lattnerc330ee62003-02-26 21:57:23 +0000364 break;
Chris Lattner88d3e032003-12-11 06:02:00 +0000365 }
366 } else {
367 AllZerosFound = false;
Chris Lattnerc330ee62003-02-26 21:57:23 +0000368 }
Chris Lattner88d3e032003-12-11 06:02:00 +0000369
370 // If we have getelementptr <ptr>, 0, 0, 0, 0, ... and V2 must aliases
371 // the ptr, the end result is a must alias also.
372 if (AllZerosFound)
373 return MustAlias;
374
Chris Lattnerc330ee62003-02-26 21:57:23 +0000375 if (ConstantFound) {
376 if (V2Size <= 1 && V1Size <= 1) // Just pointer check?
Chris Lattnerd501c132003-02-26 19:41:54 +0000377 return NoAlias;
Chris Lattnerc330ee62003-02-26 21:57:23 +0000378
379 // Otherwise we have to check to see that the distance is more than
380 // the size of the argument... build an index vector that is equal to
381 // the arguments provided, except substitute 0's for any variable
382 // indexes we find...
Chris Lattner4a830882003-12-11 23:20:16 +0000383 for (unsigned i = 0; i != GEPOperands.size(); ++i)
384 if (!isa<Constant>(GEPOperands[i]) ||
385 isa<ConstantExpr>(GEPOperands[i]))
386 GEPOperands[i] =Constant::getNullValue(GEPOperands[i]->getType());
387 int64_t Offset = getTargetData().getIndexedOffset(BasePtr->getType(),
388 GEPOperands);
389 if (Offset >= (int64_t)V2Size || Offset <= -(int64_t)V1Size)
Chris Lattnerc330ee62003-02-26 21:57:23 +0000390 return NoAlias;
391 }
392 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000393 }
Chris Lattnerc330ee62003-02-26 21:57:23 +0000394
Chris Lattnerd501c132003-02-26 19:41:54 +0000395 return MayAlias;
396}
397
Chris Lattner28977af2004-04-05 01:30:19 +0000398static bool ValuesEqual(Value *V1, Value *V2) {
399 if (V1->getType() == V2->getType())
400 return V1 == V2;
401 if (Constant *C1 = dyn_cast<Constant>(V1))
402 if (Constant *C2 = dyn_cast<Constant>(V2)) {
403 // Sign extend the constants to long types.
404 C1 = ConstantExpr::getSignExtend(C1, Type::LongTy);
405 C2 = ConstantExpr::getSignExtend(C2, Type::LongTy);
406 return C1 == C2;
407 }
408 return false;
409}
410
Chris Lattnerb307c882003-12-11 22:44:13 +0000411/// CheckGEPInstructions - Check two GEP instructions with known must-aliasing
412/// base pointers. This checks to see if the index expressions preclude the
413/// pointers from aliasing...
414AliasAnalysis::AliasResult BasicAliasAnalysis::
415CheckGEPInstructions(const Type* BasePtr1Ty, std::vector<Value*> &GEP1Ops,
416 unsigned G1S,
417 const Type *BasePtr2Ty, std::vector<Value*> &GEP2Ops,
418 unsigned G2S) {
419 // We currently can't handle the case when the base pointers have different
420 // primitive types. Since this is uncommon anyway, we are happy being
421 // extremely conservative.
422 if (BasePtr1Ty != BasePtr2Ty)
423 return MayAlias;
424
425 const Type *GEPPointerTy = BasePtr1Ty;
426
427 // Find the (possibly empty) initial sequence of equal values... which are not
428 // necessarily constants.
429 unsigned NumGEP1Operands = GEP1Ops.size(), NumGEP2Operands = GEP2Ops.size();
430 unsigned MinOperands = std::min(NumGEP1Operands, NumGEP2Operands);
431 unsigned MaxOperands = std::max(NumGEP1Operands, NumGEP2Operands);
432 unsigned UnequalOper = 0;
433 while (UnequalOper != MinOperands &&
Chris Lattner28977af2004-04-05 01:30:19 +0000434 ValuesEqual(GEP1Ops[UnequalOper], GEP2Ops[UnequalOper])) {
Chris Lattnerb307c882003-12-11 22:44:13 +0000435 // Advance through the type as we go...
436 ++UnequalOper;
437 if (const CompositeType *CT = dyn_cast<CompositeType>(BasePtr1Ty))
438 BasePtr1Ty = CT->getTypeAtIndex(GEP1Ops[UnequalOper-1]);
439 else {
440 // If all operands equal each other, then the derived pointers must
441 // alias each other...
442 BasePtr1Ty = 0;
443 assert(UnequalOper == NumGEP1Operands && UnequalOper == NumGEP2Operands &&
444 "Ran out of type nesting, but not out of operands?");
445 return MustAlias;
Chris Lattner920bd792003-06-02 05:42:39 +0000446 }
447 }
Chris Lattner920bd792003-06-02 05:42:39 +0000448
Chris Lattnerb307c882003-12-11 22:44:13 +0000449 // If we have seen all constant operands, and run out of indexes on one of the
450 // getelementptrs, check to see if the tail of the leftover one is all zeros.
451 // If so, return mustalias.
Chris Lattner4a830882003-12-11 23:20:16 +0000452 if (UnequalOper == MinOperands) {
Chris Lattnerb307c882003-12-11 22:44:13 +0000453 if (GEP1Ops.size() < GEP2Ops.size()) std::swap(GEP1Ops, GEP2Ops);
Chris Lattnerd501c132003-02-26 19:41:54 +0000454
Chris Lattnerb307c882003-12-11 22:44:13 +0000455 bool AllAreZeros = true;
456 for (unsigned i = UnequalOper; i != MaxOperands; ++i)
457 if (!isa<Constant>(GEP1Ops[i]) ||
458 !cast<Constant>(GEP1Ops[i])->isNullValue()) {
459 AllAreZeros = false;
460 break;
461 }
462 if (AllAreZeros) return MustAlias;
463 }
464
Chris Lattnerd501c132003-02-26 19:41:54 +0000465
466 // So now we know that the indexes derived from the base pointers,
467 // which are known to alias, are different. We can still determine a
468 // no-alias result if there are differing constant pairs in the index
469 // chain. For example:
470 // A[i][0] != A[j][1] iff (&A[0][1]-&A[0][0] >= std::max(G1S, G2S))
471 //
472 unsigned SizeMax = std::max(G1S, G2S);
473 if (SizeMax == ~0U) return MayAlias; // Avoid frivolous work...
Chris Lattner920bd792003-06-02 05:42:39 +0000474
Chris Lattnerd501c132003-02-26 19:41:54 +0000475 // Scan for the first operand that is constant and unequal in the
Chris Lattner28977af2004-04-05 01:30:19 +0000476 // two getelementptrs...
Chris Lattnerd501c132003-02-26 19:41:54 +0000477 unsigned FirstConstantOper = UnequalOper;
Chris Lattnerb307c882003-12-11 22:44:13 +0000478 for (; FirstConstantOper != MinOperands; ++FirstConstantOper) {
479 const Value *G1Oper = GEP1Ops[FirstConstantOper];
480 const Value *G2Oper = GEP2Ops[FirstConstantOper];
481
Chris Lattner6eb88d42004-01-12 17:57:32 +0000482 if (G1Oper != G2Oper) // Found non-equal constant indexes...
483 if (Constant *G1OC = dyn_cast<Constant>(const_cast<Value*>(G1Oper)))
484 if (Constant *G2OC = dyn_cast<Constant>(const_cast<Value*>(G2Oper))) {
Chris Lattner28977af2004-04-05 01:30:19 +0000485 if (G1OC->getType() != G2OC->getType()) {
486 // Sign extend both operands to long.
487 G1OC = ConstantExpr::getSignExtend(G1OC, Type::LongTy);
488 G2OC = ConstantExpr::getSignExtend(G2OC, Type::LongTy);
489 GEP1Ops[FirstConstantOper] = G1OC;
490 GEP2Ops[FirstConstantOper] = G2OC;
491 }
492
493 if (G1OC != G2OC) {
494 // Make sure they are comparable (ie, not constant expressions)...
495 // and make sure the GEP with the smaller leading constant is GEP1.
496 Constant *Compare = ConstantExpr::getSetGT(G1OC, G2OC);
497 if (ConstantBool *CV = dyn_cast<ConstantBool>(Compare)) {
498 if (CV->getValue()) // If they are comparable and G2 > G1
499 std::swap(GEP1Ops, GEP2Ops); // Make GEP1 < GEP2
500 break;
501 }
Chris Lattner6eb88d42004-01-12 17:57:32 +0000502 }
503 }
Chris Lattnerb307c882003-12-11 22:44:13 +0000504 BasePtr1Ty = cast<CompositeType>(BasePtr1Ty)->getTypeAtIndex(G1Oper);
Chris Lattnerd501c132003-02-26 19:41:54 +0000505 }
506
Chris Lattnerb307c882003-12-11 22:44:13 +0000507 // No shared constant operands, and we ran out of common operands. At this
508 // point, the GEP instructions have run through all of their operands, and we
509 // haven't found evidence that there are any deltas between the GEP's.
510 // However, one GEP may have more operands than the other. If this is the
Chris Lattner28977af2004-04-05 01:30:19 +0000511 // case, there may still be hope. Check this now.
Chris Lattnerb307c882003-12-11 22:44:13 +0000512 if (FirstConstantOper == MinOperands) {
513 // Make GEP1Ops be the longer one if there is a longer one.
514 if (GEP1Ops.size() < GEP2Ops.size())
515 std::swap(GEP1Ops, GEP2Ops);
516
517 // Is there anything to check?
518 if (GEP1Ops.size() > MinOperands) {
519 for (unsigned i = FirstConstantOper; i != MaxOperands; ++i)
520 if (isa<Constant>(GEP1Ops[i]) && !isa<ConstantExpr>(GEP1Ops[i]) &&
521 !cast<Constant>(GEP1Ops[i])->isNullValue()) {
522 // Yup, there's a constant in the tail. Set all variables to
523 // constants in the GEP instruction to make it suiteable for
524 // TargetData::getIndexedOffset.
525 for (i = 0; i != MaxOperands; ++i)
526 if (!isa<Constant>(GEP1Ops[i]) || isa<ConstantExpr>(GEP1Ops[i]))
527 GEP1Ops[i] = Constant::getNullValue(GEP1Ops[i]->getType());
528 // Okay, now get the offset. This is the relative offset for the full
529 // instruction.
530 const TargetData &TD = getTargetData();
531 int64_t Offset1 = TD.getIndexedOffset(GEPPointerTy, GEP1Ops);
532
533 // Now crop off any constants from the end...
534 GEP1Ops.resize(MinOperands);
535 int64_t Offset2 = TD.getIndexedOffset(GEPPointerTy, GEP1Ops);
536
537 // If the tail provided a bit enough offset, return noalias!
538 if ((uint64_t)(Offset2-Offset1) >= SizeMax)
539 return NoAlias;
540 }
541 }
542
543 // Couldn't find anything useful.
544 return MayAlias;
545 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000546
547 // If there are non-equal constants arguments, then we can figure
548 // out a minimum known delta between the two index expressions... at
549 // this point we know that the first constant index of GEP1 is less
550 // than the first constant index of GEP2.
Chris Lattner1af55e12003-11-25 20:10:07 +0000551
Chris Lattnerb307c882003-12-11 22:44:13 +0000552 // Advance BasePtr[12]Ty over this first differing constant operand.
553 BasePtr2Ty = cast<CompositeType>(BasePtr1Ty)->getTypeAtIndex(GEP2Ops[FirstConstantOper]);
554 BasePtr1Ty = cast<CompositeType>(BasePtr1Ty)->getTypeAtIndex(GEP1Ops[FirstConstantOper]);
Chris Lattnerd501c132003-02-26 19:41:54 +0000555
Chris Lattnerb307c882003-12-11 22:44:13 +0000556 // We are going to be using TargetData::getIndexedOffset to determine the
557 // offset that each of the GEP's is reaching. To do this, we have to convert
558 // all variable references to constant references. To do this, we convert the
559 // initial equal sequence of variables into constant zeros to start with.
560 for (unsigned i = 0; i != FirstConstantOper; ++i) {
561 if (!isa<Constant>(GEP1Ops[i]) || isa<ConstantExpr>(GEP1Ops[i]) ||
Chris Lattner28977af2004-04-05 01:30:19 +0000562 !isa<Constant>(GEP2Ops[i]) || isa<ConstantExpr>(GEP2Ops[i]))
563 GEP1Ops[i] = GEP2Ops[i] = Constant::getNullValue(Type::UIntTy);
Chris Lattnerb307c882003-12-11 22:44:13 +0000564 }
565
566 // We know that GEP1Ops[FirstConstantOper] & GEP2Ops[FirstConstantOper] are ok
Chris Lattnerd501c132003-02-26 19:41:54 +0000567
568 // Loop over the rest of the operands...
Chris Lattnerb307c882003-12-11 22:44:13 +0000569 for (unsigned i = FirstConstantOper+1; i != MaxOperands; ++i) {
570 const Value *Op1 = i < GEP1Ops.size() ? GEP1Ops[i] : 0;
571 const Value *Op2 = i < GEP2Ops.size() ? GEP2Ops[i] : 0;
572 // If they are equal, use a zero index...
573 if (Op1 == Op2 && BasePtr1Ty == BasePtr2Ty) {
574 if (!isa<Constant>(Op1) || isa<ConstantExpr>(Op1))
575 GEP1Ops[i] = GEP2Ops[i] = Constant::getNullValue(Op1->getType());
576 // Otherwise, just keep the constants we have.
Chris Lattnerd501c132003-02-26 19:41:54 +0000577 } else {
Chris Lattnerb307c882003-12-11 22:44:13 +0000578 if (Op1) {
579 if (const ConstantInt *Op1C = dyn_cast<ConstantInt>(Op1)) {
580 // If this is an array index, make sure the array element is in range.
581 if (const ArrayType *AT = dyn_cast<ArrayType>(BasePtr1Ty))
582 if (Op1C->getRawValue() >= AT->getNumElements())
583 return MayAlias; // Be conservative with out-of-range accesses
584
585 } else {
586 // GEP1 is known to produce a value less than GEP2. To be
587 // conservatively correct, we must assume the largest possible
588 // constant is used in this position. This cannot be the initial
589 // index to the GEP instructions (because we know we have at least one
590 // element before this one with the different constant arguments), so
591 // we know that the current index must be into either a struct or
592 // array. Because we know it's not constant, this cannot be a
593 // structure index. Because of this, we can calculate the maximum
594 // value possible.
595 //
596 if (const ArrayType *AT = dyn_cast<ArrayType>(BasePtr1Ty))
597 GEP1Ops[i] = ConstantSInt::get(Type::LongTy,AT->getNumElements()-1);
598 }
Chris Lattnerd501c132003-02-26 19:41:54 +0000599 }
600
Chris Lattnerb307c882003-12-11 22:44:13 +0000601 if (Op2) {
602 if (const ConstantInt *Op2C = dyn_cast<ConstantInt>(Op2)) {
603 // If this is an array index, make sure the array element is in range.
604 if (const ArrayType *AT = dyn_cast<ArrayType>(BasePtr1Ty))
605 if (Op2C->getRawValue() >= AT->getNumElements())
606 return MayAlias; // Be conservative with out-of-range accesses
607 } else { // Conservatively assume the minimum value for this index
608 GEP2Ops[i] = Constant::getNullValue(Op2->getType());
609 }
Chris Lattner920bd792003-06-02 05:42:39 +0000610 }
Chris Lattnerb307c882003-12-11 22:44:13 +0000611 }
612
613 if (BasePtr1Ty && Op1) {
614 if (const CompositeType *CT = dyn_cast<CompositeType>(BasePtr1Ty))
615 BasePtr1Ty = CT->getTypeAtIndex(GEP1Ops[i]);
616 else
617 BasePtr1Ty = 0;
618 }
619
620 if (BasePtr2Ty && Op2) {
621 if (const CompositeType *CT = dyn_cast<CompositeType>(BasePtr2Ty))
622 BasePtr2Ty = CT->getTypeAtIndex(GEP2Ops[i]);
623 else
624 BasePtr2Ty = 0;
Chris Lattnerd501c132003-02-26 19:41:54 +0000625 }
626 }
627
Chris Lattnerb307c882003-12-11 22:44:13 +0000628 int64_t Offset1 = getTargetData().getIndexedOffset(GEPPointerTy, GEP1Ops);
629 int64_t Offset2 = getTargetData().getIndexedOffset(GEPPointerTy, GEP2Ops);
Chris Lattnerd501c132003-02-26 19:41:54 +0000630 assert(Offset1 < Offset2 &&"There is at least one different constant here!");
631
Chris Lattner807b7052003-04-25 18:03:06 +0000632 if ((uint64_t)(Offset2-Offset1) >= SizeMax) {
Chris Lattnerd501c132003-02-26 19:41:54 +0000633 //std::cerr << "Determined that these two GEP's don't alias ["
634 // << SizeMax << " bytes]: \n" << *GEP1 << *GEP2;
635 return NoAlias;
636 }
637 return MayAlias;
638}
639
Chris Lattner4244bb52004-03-15 03:36:49 +0000640namespace {
641 struct StringCompare {
642 bool operator()(const char *LHS, const char *RHS) {
643 return strcmp(LHS, RHS) < 0;
644 }
645 };
646}
647
648// Note that this list cannot contain libm functions (such as acos and sqrt)
649// that set errno on a domain or other error.
650static const char *DoesntAccessMemoryTable[] = {
Chris Lattnerb903fc52004-04-10 06:55:27 +0000651 // LLVM intrinsics:
Chris Lattner4ee623d2004-06-15 21:52:58 +0000652 "llvm.frameaddress", "llvm.returnaddress", "llvm.readport", "llvm.isunordered",
Chris Lattnerb903fc52004-04-10 06:55:27 +0000653
Chris Lattner4244bb52004-03-15 03:36:49 +0000654 "abs", "labs", "llabs", "imaxabs", "fabs", "fabsf", "fabsl",
655 "trunc", "truncf", "truncl", "ldexp",
656
657 "atan", "atanf", "atanl", "atan2", "atan2f", "atan2l",
658 "cbrt",
659 "cos", "cosf", "cosl", "cosh", "coshf", "coshl",
660 "exp", "expf", "expl",
661 "hypot",
662 "sin", "sinf", "sinl", "sinh", "sinhf", "sinhl",
663 "tan", "tanf", "tanl", "tanh", "tanhf", "tanhl",
664
Chris Lattnerbbcc1472004-03-15 04:18:28 +0000665 // ctype.h
Chris Lattner4244bb52004-03-15 03:36:49 +0000666 "isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower", "isprint"
667 "ispunct", "isspace", "isupper", "isxdigit", "tolower", "toupper",
668
Chris Lattnerbbcc1472004-03-15 04:18:28 +0000669 // wctype.h"
Chris Lattner4244bb52004-03-15 03:36:49 +0000670 "iswalnum", "iswalpha", "iswcntrl", "iswdigit", "iswgraph", "iswlower",
671 "iswprint", "iswpunct", "iswspace", "iswupper", "iswxdigit",
672
Chris Lattnerbbcc1472004-03-15 04:18:28 +0000673 "iswctype", "towctrans", "towlower", "towupper",
674
Chris Lattner4244bb52004-03-15 03:36:49 +0000675 "btowc", "wctob",
Chris Lattner002be762004-03-16 03:41:35 +0000676
677 "isinf", "isnan", "finite",
678
679 // C99 math functions
680 "copysign", "copysignf", "copysignd",
681 "nexttoward", "nexttowardf", "nexttowardd",
682 "nextafter", "nextafterf", "nextafterd",
683
684 // glibc functions:
685 "__fpclassify", "__fpclassifyf", "__fpclassifyl",
686 "__signbit", "__signbitf", "__signbitl",
Chris Lattner4244bb52004-03-15 03:36:49 +0000687};
688
689static const unsigned DAMTableSize =
690 sizeof(DoesntAccessMemoryTable)/sizeof(DoesntAccessMemoryTable[0]);
691
692/// doesNotAccessMemory - Return true if we know that the function does not
693/// access memory at all. Since basicaa does no analysis, we can only do simple
694/// things here. In particular, if we have an external function with the name
695/// of a standard C library function, we are allowed to assume it will be
696/// resolved by libc, so we can hardcode some entries in here.
697bool BasicAliasAnalysis::doesNotAccessMemory(Function *F) {
698 if (!F->isExternal()) return false;
699
700 static bool Initialized = false;
701 if (!Initialized) {
702 // Sort the table the first time through.
703 std::sort(DoesntAccessMemoryTable, DoesntAccessMemoryTable+DAMTableSize,
704 StringCompare());
705 Initialized = true;
706 }
707
708 const char **Ptr = std::lower_bound(DoesntAccessMemoryTable,
709 DoesntAccessMemoryTable+DAMTableSize,
710 F->getName().c_str(), StringCompare());
711 return Ptr != DoesntAccessMemoryTable+DAMTableSize && *Ptr == F->getName();
712}
713
714
715static const char *OnlyReadsMemoryTable[] = {
Chris Lattner002be762004-03-16 03:41:35 +0000716 "atoi", "atol", "atof", "atoll", "atoq", "a64l",
717 "bcmp", "memcmp", "memchr", "memrchr", "wmemcmp", "wmemchr",
Chris Lattner4244bb52004-03-15 03:36:49 +0000718
719 // Strings
720 "strcmp", "strcasecmp", "strcoll", "strncmp", "strncasecmp",
721 "strchr", "strcspn", "strlen", "strpbrk", "strrchr", "strspn", "strstr",
Chris Lattner002be762004-03-16 03:41:35 +0000722 "index", "rindex",
Chris Lattner4244bb52004-03-15 03:36:49 +0000723
724 // Wide char strings
725 "wcschr", "wcscmp", "wcscoll", "wcscspn", "wcslen", "wcsncmp", "wcspbrk",
726 "wcsrchr", "wcsspn", "wcsstr",
Chris Lattner002be762004-03-16 03:41:35 +0000727
728 // glibc
729 "alphasort", "alphasort64", "versionsort", "versionsort64",
730
731 // C99
732 "nan", "nanf", "nand",
Chris Lattnerb903fc52004-04-10 06:55:27 +0000733
734 // File I/O
735 "feof", "ferror", "fileno",
736 "feof_unlocked", "ferror_unlocked", "fileno_unlocked"
Chris Lattner4244bb52004-03-15 03:36:49 +0000737};
738
739static const unsigned ORMTableSize =
740 sizeof(OnlyReadsMemoryTable)/sizeof(OnlyReadsMemoryTable[0]);
741
742bool BasicAliasAnalysis::onlyReadsMemory(Function *F) {
743 if (doesNotAccessMemory(F)) return true;
744 if (!F->isExternal()) return false;
745
746 static bool Initialized = false;
747 if (!Initialized) {
748 // Sort the table the first time through.
749 std::sort(OnlyReadsMemoryTable, OnlyReadsMemoryTable+ORMTableSize,
750 StringCompare());
751 Initialized = true;
752 }
753
754 const char **Ptr = std::lower_bound(OnlyReadsMemoryTable,
755 OnlyReadsMemoryTable+ORMTableSize,
756 F->getName().c_str(), StringCompare());
757 return Ptr != OnlyReadsMemoryTable+ORMTableSize && *Ptr == F->getName();
758}
759
760