blob: f95adb329291e33854f98ea834d617814db63d30 [file] [log] [blame]
Chris Lattnera346e642003-11-25 20:11:47 +00001//===- BasicAliasAnalysis.cpp - Local Alias Analysis Impl -----------------===//
John Criswell482202a2003-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 Lattnerd6a2a992003-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 Lattner5f4c6f52003-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 Lattner6f6e0f22004-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 Lattner5f4c6f52003-12-28 04:03:49 +000020//
Chris Lattnerd6a2a992003-02-26 19:41:54 +000021//===----------------------------------------------------------------------===//
22
23#include "llvm/Analysis/AliasAnalysis.h"
Chris Lattnerd82256a2004-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 Lattnerd6a2a992003-02-26 19:41:54 +000028#include "llvm/iOther.h"
Chris Lattner494d5102004-02-22 06:26:17 +000029#include "llvm/iMemory.h"
Chris Lattnerd82256a2004-03-15 03:36:49 +000030#include "llvm/Pass.h"
Chris Lattnerd6a2a992003-02-26 19:41:54 +000031#include "llvm/Target/TargetData.h"
Chris Lattner388bc982003-11-25 20:10:07 +000032#include "llvm/Support/GetElementPtrTypeIterator.h"
Chris Lattner35997482003-11-25 18:33:40 +000033using namespace llvm;
Brian Gaeke960707c2003-11-11 22:41:34 +000034
Chris Lattnerd6a2a992003-02-26 19:41:54 +000035// Make sure that anything that uses AliasAnalysis pulls in this file...
Chris Lattnerabb3bea2003-12-11 05:44:59 +000036void llvm::BasicAAStub() {}
Chris Lattnerd6a2a992003-02-26 19:41:54 +000037
Chris Lattnerd6a2a992003-02-26 19:41:54 +000038namespace {
Chris Lattner59c8ed82004-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 {
Chris Lattnerfeda9d02004-06-19 08:05:58 +000045 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
46 AU.addRequired<TargetData>();
47 }
48
49 virtual void initializePass() {
50 TD = &getAnalysis<TargetData>();
51 }
52
Chris Lattner59c8ed82004-05-23 21:15:12 +000053 virtual AliasResult alias(const Value *V1, unsigned V1Size,
54 const Value *V2, unsigned V2Size) {
55 return MayAlias;
56 }
57
58 virtual void getMustAliases(Value *P, std::vector<Value*> &RetVals) { }
59 virtual bool pointsToConstantMemory(const Value *P) { return false; }
60 virtual bool doesNotAccessMemory(Function *F) { return false; }
61 virtual bool onlyReadsMemory(Function *F) { return false; }
62 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 Lattner59c8ed82004-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 Lattnerd6a2a992003-02-26 19:41:54 +000088 AliasResult alias(const Value *V1, unsigned V1Size,
89 const Value *V2, unsigned V2Size);
Chris Lattnerf0eac5d2004-01-30 22:17:24 +000090
Chris Lattnera0362532004-03-12 22:39:00 +000091 ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size);
92
Chris Lattnerc5fad352004-04-11 16:43:07 +000093 /// hasNoModRefInfoForCalls - We have no way to test one call against
94 /// another, unless they are pure or const.
95 virtual bool hasNoModRefInfoForCalls() const { return true; }
96
Chris Lattnerf0eac5d2004-01-30 22:17:24 +000097 /// pointsToConstantMemory - Chase pointers until we find a (constant
98 /// global) or not.
99 bool pointsToConstantMemory(const Value *P);
100
Chris Lattnerd82256a2004-03-15 03:36:49 +0000101 virtual bool doesNotAccessMemory(Function *F);
102 virtual bool onlyReadsMemory(Function *F);
103
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000104 private:
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000105 // CheckGEPInstructions - Check two GEP instructions with known
106 // must-aliasing base pointers. This checks to see if the index expressions
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000107 // preclude the pointers from aliasing...
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000108 AliasResult
109 CheckGEPInstructions(const Type* BasePtr1Ty, std::vector<Value*> &GEP1Ops,
110 unsigned G1Size,
111 const Type *BasePtr2Ty, std::vector<Value*> &GEP2Ops,
112 unsigned G2Size);
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000113 };
114
115 // Register this pass...
116 RegisterOpt<BasicAliasAnalysis>
117 X("basicaa", "Basic Alias Analysis (default AA impl)");
118
119 // Declare that we implement the AliasAnalysis interface
120 RegisterAnalysisGroup<AliasAnalysis, BasicAliasAnalysis, true> Y;
121} // End of anonymous namespace
122
Chris Lattner092af3f2003-09-20 03:08:47 +0000123// hasUniqueAddress - Return true if the specified value points to something
124// with a unique, discernable, address.
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000125static inline bool hasUniqueAddress(const Value *V) {
Chris Lattner092af3f2003-09-20 03:08:47 +0000126 return isa<GlobalValue>(V) || isa<AllocationInst>(V);
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000127}
128
Chris Lattner092af3f2003-09-20 03:08:47 +0000129// getUnderlyingObject - This traverses the use chain to figure out what object
130// the specified value points to. If the value points to, or is derived from, a
131// unique object or an argument, return it.
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000132static const Value *getUnderlyingObject(const Value *V) {
133 if (!isa<PointerType>(V->getType())) return 0;
134
135 // If we are at some type of object... return it.
Chris Lattner092af3f2003-09-20 03:08:47 +0000136 if (hasUniqueAddress(V) || isa<Argument>(V)) return V;
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000137
138 // Traverse through different addressing mechanisms...
139 if (const Instruction *I = dyn_cast<Instruction>(V)) {
140 if (isa<CastInst>(I) || isa<GetElementPtrInst>(I))
141 return getUnderlyingObject(I->getOperand(0));
Chris Lattner1bec75e2003-06-17 15:25:37 +0000142 } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
143 if (CE->getOpcode() == Instruction::Cast ||
144 CE->getOpcode() == Instruction::GetElementPtr)
145 return getUnderlyingObject(CE->getOperand(0));
Reid Spencer30d69a52004-07-18 00:18:30 +0000146 } else if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
147 return GV;
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000148 }
149 return 0;
150}
151
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000152static const User *isGEP(const Value *V) {
153 if (isa<GetElementPtrInst>(V) ||
154 (isa<ConstantExpr>(V) &&
155 cast<ConstantExpr>(V)->getOpcode() == Instruction::GetElementPtr))
156 return cast<User>(V);
157 return 0;
158}
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000159
Chris Lattner1eed55d2003-12-11 23:20:16 +0000160static const Value *GetGEPOperands(const Value *V, std::vector<Value*> &GEPOps){
161 assert(GEPOps.empty() && "Expect empty list to populate!");
162 GEPOps.insert(GEPOps.end(), cast<User>(V)->op_begin()+1,
163 cast<User>(V)->op_end());
164
165 // Accumulate all of the chained indexes into the operand array
166 V = cast<User>(V)->getOperand(0);
167
168 while (const User *G = isGEP(V)) {
Reid Spencer30d69a52004-07-18 00:18:30 +0000169 if (!isa<Constant>(GEPOps[0]) || isa<GlobalValue>(GEPOps[0]) ||
Chris Lattner1eed55d2003-12-11 23:20:16 +0000170 !cast<Constant>(GEPOps[0])->isNullValue())
171 break; // Don't handle folding arbitrary pointer offsets yet...
172 GEPOps.erase(GEPOps.begin()); // Drop the zero index
173 GEPOps.insert(GEPOps.begin(), G->op_begin()+1, G->op_end());
174 V = G->getOperand(0);
175 }
176 return V;
177}
178
Chris Lattnerf0eac5d2004-01-30 22:17:24 +0000179/// pointsToConstantMemory - Chase pointers until we find a (constant
180/// global) or not.
181bool BasicAliasAnalysis::pointsToConstantMemory(const Value *P) {
Chris Lattner729ea9e2004-01-30 22:48:02 +0000182 if (const Value *V = getUnderlyingObject(P))
183 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
184 return GV->isConstant();
Chris Lattnerf0eac5d2004-01-30 22:17:24 +0000185 return false;
186}
Chris Lattner1eed55d2003-12-11 23:20:16 +0000187
Chris Lattnera0362532004-03-12 22:39:00 +0000188static bool AddressMightEscape(const Value *V) {
189 for (Value::use_const_iterator UI = V->use_begin(), E = V->use_end();
190 UI != E; ++UI) {
191 const Instruction *I = cast<Instruction>(*UI);
192 switch (I->getOpcode()) {
193 case Instruction::Load: break;
194 case Instruction::Store:
195 if (I->getOperand(0) == V)
196 return true; // Escapes if the pointer is stored.
197 break;
198 case Instruction::GetElementPtr:
199 if (AddressMightEscape(I)) return true;
200 break;
201 case Instruction::Cast:
202 if (!isa<PointerType>(I->getType()))
203 return true;
204 if (AddressMightEscape(I)) return true;
205 break;
Chris Lattnera0362532004-03-12 22:39:00 +0000206 default:
207 return true;
208 }
209 }
210 return false;
211}
212
213// getModRefInfo - Check to see if the specified callsite can clobber the
214// specified memory object. Since we only look at local properties of this
215// function, we really can't say much about this query. We do, however, use
216// simple "address taken" analysis on local objects.
217//
218AliasAnalysis::ModRefResult
219BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
Reid Spencer30d69a52004-07-18 00:18:30 +0000220 if (!isa<Constant>(P))
Chris Lattnera0362532004-03-12 22:39:00 +0000221 if (const AllocationInst *AI =
Chris Lattnerf9e69b42004-03-12 23:12:55 +0000222 dyn_cast_or_null<AllocationInst>(getUnderlyingObject(P))) {
Chris Lattnera0362532004-03-12 22:39:00 +0000223 // Okay, the pointer is to a stack allocated object. If we can prove that
224 // the pointer never "escapes", then we know the call cannot clobber it,
225 // because it simply can't get its address.
226 if (!AddressMightEscape(AI))
227 return NoModRef;
228 }
229
Chris Lattnerea42c852004-03-15 04:18:28 +0000230 // The AliasAnalysis base class has some smarts, lets use them.
231 return AliasAnalysis::getModRefInfo(CS, P, Size);
Chris Lattnera0362532004-03-12 22:39:00 +0000232}
233
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000234// alias - Provide a bunch of ad-hoc rules to disambiguate in common cases, such
235// as array references. Note that this function is heavily tail recursive.
236// Hopefully we have a smart C++ compiler. :)
237//
238AliasAnalysis::AliasResult
239BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size,
240 const Value *V2, unsigned V2Size) {
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000241 // Strip off any constant expression casts if they exist
242 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V1))
243 if (CE->getOpcode() == Instruction::Cast)
244 V1 = CE->getOperand(0);
245 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V2))
246 if (CE->getOpcode() == Instruction::Cast)
247 V2 = CE->getOperand(0);
248
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000249 // Are we checking for alias of the same value?
250 if (V1 == V2) return MustAlias;
251
252 if ((!isa<PointerType>(V1->getType()) || !isa<PointerType>(V2->getType())) &&
253 V1->getType() != Type::LongTy && V2->getType() != Type::LongTy)
254 return NoAlias; // Scalars cannot alias each other
255
256 // Strip off cast instructions...
257 if (const Instruction *I = dyn_cast<CastInst>(V1))
258 return alias(I->getOperand(0), V1Size, V2, V2Size);
259 if (const Instruction *I = dyn_cast<CastInst>(V2))
260 return alias(V1, V1Size, I->getOperand(0), V2Size);
261
262 // Figure out what objects these things are pointing to if we can...
263 const Value *O1 = getUnderlyingObject(V1);
264 const Value *O2 = getUnderlyingObject(V2);
265
Misha Brukman32998322003-09-11 18:14:24 +0000266 // Pointing at a discernible object?
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000267 if (O1 && O2) {
Chris Lattner092af3f2003-09-20 03:08:47 +0000268 if (isa<Argument>(O1)) {
269 // Incoming argument cannot alias locally allocated object!
270 if (isa<AllocationInst>(O2)) return NoAlias;
271 // Otherwise, nothing is known...
272 } else if (isa<Argument>(O2)) {
273 // Incoming argument cannot alias locally allocated object!
274 if (isa<AllocationInst>(O1)) return NoAlias;
275 // Otherwise, nothing is known...
276 } else {
277 // If they are two different objects, we know that we have no alias...
278 if (O1 != O2) return NoAlias;
279 }
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000280
281 // If they are the same object, they we can look at the indexes. If they
282 // index off of the object is the same for both pointers, they must alias.
283 // If they are provably different, they must not alias. Otherwise, we can't
284 // tell anything.
Chris Lattner092af3f2003-09-20 03:08:47 +0000285 } else if (O1 && !isa<Argument>(O1) && isa<ConstantPointerNull>(V2)) {
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000286 return NoAlias; // Unique values don't alias null
Chris Lattner092af3f2003-09-20 03:08:47 +0000287 } else if (O2 && !isa<Argument>(O2) && isa<ConstantPointerNull>(V1)) {
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000288 return NoAlias; // Unique values don't alias null
289 }
290
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000291 // If we have two gep instructions with must-alias'ing base pointers, figure
292 // out if the indexes to the GEP tell us anything about the derived pointer.
293 // Note that we also handle chains of getelementptr instructions as well as
294 // constant expression getelementptrs here.
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000295 //
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000296 if (isGEP(V1) && isGEP(V2)) {
297 // Drill down into the first non-gep value, to test for must-aliasing of
298 // the base pointers.
299 const Value *BasePtr1 = V1, *BasePtr2 = V2;
300 do {
301 BasePtr1 = cast<User>(BasePtr1)->getOperand(0);
302 } while (isGEP(BasePtr1) &&
303 cast<User>(BasePtr1)->getOperand(1) ==
304 Constant::getNullValue(cast<User>(BasePtr1)->getOperand(1)->getType()));
305 do {
306 BasePtr2 = cast<User>(BasePtr2)->getOperand(0);
307 } while (isGEP(BasePtr2) &&
308 cast<User>(BasePtr2)->getOperand(1) ==
309 Constant::getNullValue(cast<User>(BasePtr2)->getOperand(1)->getType()));
310
311 // Do the base pointers alias?
312 AliasResult BaseAlias = alias(BasePtr1, V1Size, BasePtr2, V2Size);
313 if (BaseAlias == NoAlias) return NoAlias;
314 if (BaseAlias == MustAlias) {
315 // If the base pointers alias each other exactly, check to see if we can
316 // figure out anything about the resultant pointers, to try to prove
317 // non-aliasing.
318
319 // Collect all of the chained GEP operands together into one simple place
Chris Lattner1eed55d2003-12-11 23:20:16 +0000320 std::vector<Value*> GEP1Ops, GEP2Ops;
321 BasePtr1 = GetGEPOperands(V1, GEP1Ops);
322 BasePtr2 = GetGEPOperands(V2, GEP2Ops);
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000323
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000324 AliasResult GAlias =
325 CheckGEPInstructions(BasePtr1->getType(), GEP1Ops, V1Size,
326 BasePtr2->getType(), GEP2Ops, V2Size);
327 if (GAlias != MayAlias)
328 return GAlias;
329 }
330 }
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000331
332 // Check to see if these two pointers are related by a getelementptr
333 // instruction. If one pointer is a GEP with a non-zero index of the other
334 // pointer, we know they cannot alias.
335 //
Chris Lattner1eed55d2003-12-11 23:20:16 +0000336 if (isGEP(V2)) {
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000337 std::swap(V1, V2);
338 std::swap(V1Size, V2Size);
339 }
340
Chris Lattner053994f2003-02-26 21:57:23 +0000341 if (V1Size != ~0U && V2Size != ~0U)
Chris Lattner1eed55d2003-12-11 23:20:16 +0000342 if (const User *GEP = isGEP(V1)) {
343 std::vector<Value*> GEPOperands;
344 const Value *BasePtr = GetGEPOperands(V1, GEPOperands);
345
346 AliasResult R = alias(BasePtr, V1Size, V2, V2Size);
Chris Lattner053994f2003-02-26 21:57:23 +0000347 if (R == MustAlias) {
348 // If there is at least one non-zero constant index, we know they cannot
349 // alias.
350 bool ConstantFound = false;
Chris Lattnerbc1197f2003-12-11 06:02:00 +0000351 bool AllZerosFound = true;
Chris Lattner1eed55d2003-12-11 23:20:16 +0000352 for (unsigned i = 0, e = GEPOperands.size(); i != e; ++i)
353 if (const Constant *C = dyn_cast<Constant>(GEPOperands[i])) {
Chris Lattner053994f2003-02-26 21:57:23 +0000354 if (!C->isNullValue()) {
355 ConstantFound = true;
Chris Lattner17790fb2003-12-11 06:06:28 +0000356 AllZerosFound = false;
Chris Lattner053994f2003-02-26 21:57:23 +0000357 break;
Chris Lattnerbc1197f2003-12-11 06:02:00 +0000358 }
359 } else {
360 AllZerosFound = false;
Chris Lattner053994f2003-02-26 21:57:23 +0000361 }
Chris Lattnerbc1197f2003-12-11 06:02:00 +0000362
363 // If we have getelementptr <ptr>, 0, 0, 0, 0, ... and V2 must aliases
364 // the ptr, the end result is a must alias also.
365 if (AllZerosFound)
366 return MustAlias;
367
Chris Lattner053994f2003-02-26 21:57:23 +0000368 if (ConstantFound) {
369 if (V2Size <= 1 && V1Size <= 1) // Just pointer check?
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000370 return NoAlias;
Chris Lattner053994f2003-02-26 21:57:23 +0000371
372 // Otherwise we have to check to see that the distance is more than
373 // the size of the argument... build an index vector that is equal to
374 // the arguments provided, except substitute 0's for any variable
375 // indexes we find...
Chris Lattner1eed55d2003-12-11 23:20:16 +0000376 for (unsigned i = 0; i != GEPOperands.size(); ++i)
Reid Spencer30d69a52004-07-18 00:18:30 +0000377 if (!isa<Constant>(GEPOperands[i]) || isa<GlobalValue>(GEPOperands[i]) ||
Chris Lattner1eed55d2003-12-11 23:20:16 +0000378 isa<ConstantExpr>(GEPOperands[i]))
379 GEPOperands[i] =Constant::getNullValue(GEPOperands[i]->getType());
380 int64_t Offset = getTargetData().getIndexedOffset(BasePtr->getType(),
381 GEPOperands);
382 if (Offset >= (int64_t)V2Size || Offset <= -(int64_t)V1Size)
Chris Lattner053994f2003-02-26 21:57:23 +0000383 return NoAlias;
384 }
385 }
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000386 }
Chris Lattner053994f2003-02-26 21:57:23 +0000387
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000388 return MayAlias;
389}
390
Chris Lattner69193f92004-04-05 01:30:19 +0000391static bool ValuesEqual(Value *V1, Value *V2) {
392 if (V1->getType() == V2->getType())
393 return V1 == V2;
394 if (Constant *C1 = dyn_cast<Constant>(V1))
395 if (Constant *C2 = dyn_cast<Constant>(V2)) {
396 // Sign extend the constants to long types.
397 C1 = ConstantExpr::getSignExtend(C1, Type::LongTy);
398 C2 = ConstantExpr::getSignExtend(C2, Type::LongTy);
399 return C1 == C2;
400 }
401 return false;
402}
403
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000404/// CheckGEPInstructions - Check two GEP instructions with known must-aliasing
405/// base pointers. This checks to see if the index expressions preclude the
406/// pointers from aliasing...
407AliasAnalysis::AliasResult BasicAliasAnalysis::
408CheckGEPInstructions(const Type* BasePtr1Ty, std::vector<Value*> &GEP1Ops,
409 unsigned G1S,
410 const Type *BasePtr2Ty, std::vector<Value*> &GEP2Ops,
411 unsigned G2S) {
412 // We currently can't handle the case when the base pointers have different
413 // primitive types. Since this is uncommon anyway, we are happy being
414 // extremely conservative.
415 if (BasePtr1Ty != BasePtr2Ty)
416 return MayAlias;
417
418 const Type *GEPPointerTy = BasePtr1Ty;
419
420 // Find the (possibly empty) initial sequence of equal values... which are not
421 // necessarily constants.
422 unsigned NumGEP1Operands = GEP1Ops.size(), NumGEP2Operands = GEP2Ops.size();
423 unsigned MinOperands = std::min(NumGEP1Operands, NumGEP2Operands);
424 unsigned MaxOperands = std::max(NumGEP1Operands, NumGEP2Operands);
425 unsigned UnequalOper = 0;
426 while (UnequalOper != MinOperands &&
Chris Lattner69193f92004-04-05 01:30:19 +0000427 ValuesEqual(GEP1Ops[UnequalOper], GEP2Ops[UnequalOper])) {
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000428 // Advance through the type as we go...
429 ++UnequalOper;
430 if (const CompositeType *CT = dyn_cast<CompositeType>(BasePtr1Ty))
431 BasePtr1Ty = CT->getTypeAtIndex(GEP1Ops[UnequalOper-1]);
432 else {
433 // If all operands equal each other, then the derived pointers must
434 // alias each other...
435 BasePtr1Ty = 0;
436 assert(UnequalOper == NumGEP1Operands && UnequalOper == NumGEP2Operands &&
437 "Ran out of type nesting, but not out of operands?");
438 return MustAlias;
Chris Lattner78dd4322003-06-02 05:42:39 +0000439 }
440 }
Chris Lattner78dd4322003-06-02 05:42:39 +0000441
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000442 // If we have seen all constant operands, and run out of indexes on one of the
443 // getelementptrs, check to see if the tail of the leftover one is all zeros.
444 // If so, return mustalias.
Chris Lattner1eed55d2003-12-11 23:20:16 +0000445 if (UnequalOper == MinOperands) {
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000446 if (GEP1Ops.size() < GEP2Ops.size()) std::swap(GEP1Ops, GEP2Ops);
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000447
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000448 bool AllAreZeros = true;
449 for (unsigned i = UnequalOper; i != MaxOperands; ++i)
Reid Spencer30d69a52004-07-18 00:18:30 +0000450 if (!isa<Constant>(GEP1Ops[i]) ||
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000451 !cast<Constant>(GEP1Ops[i])->isNullValue()) {
452 AllAreZeros = false;
453 break;
454 }
455 if (AllAreZeros) return MustAlias;
456 }
457
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000458
459 // So now we know that the indexes derived from the base pointers,
460 // which are known to alias, are different. We can still determine a
461 // no-alias result if there are differing constant pairs in the index
462 // chain. For example:
463 // A[i][0] != A[j][1] iff (&A[0][1]-&A[0][0] >= std::max(G1S, G2S))
464 //
465 unsigned SizeMax = std::max(G1S, G2S);
466 if (SizeMax == ~0U) return MayAlias; // Avoid frivolous work...
Chris Lattner78dd4322003-06-02 05:42:39 +0000467
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000468 // Scan for the first operand that is constant and unequal in the
Chris Lattner69193f92004-04-05 01:30:19 +0000469 // two getelementptrs...
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000470 unsigned FirstConstantOper = UnequalOper;
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000471 for (; FirstConstantOper != MinOperands; ++FirstConstantOper) {
472 const Value *G1Oper = GEP1Ops[FirstConstantOper];
473 const Value *G2Oper = GEP2Ops[FirstConstantOper];
474
Chris Lattnerc99dd892004-01-12 17:57:32 +0000475 if (G1Oper != G2Oper) // Found non-equal constant indexes...
476 if (Constant *G1OC = dyn_cast<Constant>(const_cast<Value*>(G1Oper)))
477 if (Constant *G2OC = dyn_cast<Constant>(const_cast<Value*>(G2Oper))) {
Chris Lattner69193f92004-04-05 01:30:19 +0000478 if (G1OC->getType() != G2OC->getType()) {
479 // Sign extend both operands to long.
480 G1OC = ConstantExpr::getSignExtend(G1OC, Type::LongTy);
481 G2OC = ConstantExpr::getSignExtend(G2OC, Type::LongTy);
482 GEP1Ops[FirstConstantOper] = G1OC;
483 GEP2Ops[FirstConstantOper] = G2OC;
484 }
485
486 if (G1OC != G2OC) {
487 // Make sure they are comparable (ie, not constant expressions)...
488 // and make sure the GEP with the smaller leading constant is GEP1.
489 Constant *Compare = ConstantExpr::getSetGT(G1OC, G2OC);
490 if (ConstantBool *CV = dyn_cast<ConstantBool>(Compare)) {
491 if (CV->getValue()) // If they are comparable and G2 > G1
492 std::swap(GEP1Ops, GEP2Ops); // Make GEP1 < GEP2
493 break;
494 }
Chris Lattnerc99dd892004-01-12 17:57:32 +0000495 }
496 }
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000497 BasePtr1Ty = cast<CompositeType>(BasePtr1Ty)->getTypeAtIndex(G1Oper);
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000498 }
499
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000500 // No shared constant operands, and we ran out of common operands. At this
501 // point, the GEP instructions have run through all of their operands, and we
502 // haven't found evidence that there are any deltas between the GEP's.
503 // However, one GEP may have more operands than the other. If this is the
Chris Lattner69193f92004-04-05 01:30:19 +0000504 // case, there may still be hope. Check this now.
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000505 if (FirstConstantOper == MinOperands) {
506 // Make GEP1Ops be the longer one if there is a longer one.
507 if (GEP1Ops.size() < GEP2Ops.size())
508 std::swap(GEP1Ops, GEP2Ops);
509
510 // Is there anything to check?
511 if (GEP1Ops.size() > MinOperands) {
512 for (unsigned i = FirstConstantOper; i != MaxOperands; ++i)
Chris Lattnercbdf3712004-07-14 20:27:12 +0000513 if (isa<ConstantInt>(GEP1Ops[i]) &&
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000514 !cast<Constant>(GEP1Ops[i])->isNullValue()) {
515 // Yup, there's a constant in the tail. Set all variables to
516 // constants in the GEP instruction to make it suiteable for
517 // TargetData::getIndexedOffset.
518 for (i = 0; i != MaxOperands; ++i)
Chris Lattnercbdf3712004-07-14 20:27:12 +0000519 if (!isa<ConstantInt>(GEP1Ops[i]))
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000520 GEP1Ops[i] = Constant::getNullValue(GEP1Ops[i]->getType());
521 // Okay, now get the offset. This is the relative offset for the full
522 // instruction.
523 const TargetData &TD = getTargetData();
524 int64_t Offset1 = TD.getIndexedOffset(GEPPointerTy, GEP1Ops);
525
526 // Now crop off any constants from the end...
527 GEP1Ops.resize(MinOperands);
528 int64_t Offset2 = TD.getIndexedOffset(GEPPointerTy, GEP1Ops);
529
530 // If the tail provided a bit enough offset, return noalias!
531 if ((uint64_t)(Offset2-Offset1) >= SizeMax)
532 return NoAlias;
533 }
534 }
535
536 // Couldn't find anything useful.
537 return MayAlias;
538 }
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000539
540 // If there are non-equal constants arguments, then we can figure
541 // out a minimum known delta between the two index expressions... at
542 // this point we know that the first constant index of GEP1 is less
543 // than the first constant index of GEP2.
Chris Lattner388bc982003-11-25 20:10:07 +0000544
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000545 // Advance BasePtr[12]Ty over this first differing constant operand.
546 BasePtr2Ty = cast<CompositeType>(BasePtr1Ty)->getTypeAtIndex(GEP2Ops[FirstConstantOper]);
547 BasePtr1Ty = cast<CompositeType>(BasePtr1Ty)->getTypeAtIndex(GEP1Ops[FirstConstantOper]);
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000548
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000549 // We are going to be using TargetData::getIndexedOffset to determine the
550 // offset that each of the GEP's is reaching. To do this, we have to convert
551 // all variable references to constant references. To do this, we convert the
552 // initial equal sequence of variables into constant zeros to start with.
553 for (unsigned i = 0; i != FirstConstantOper; ++i) {
554 if (!isa<Constant>(GEP1Ops[i]) || isa<ConstantExpr>(GEP1Ops[i]) ||
Chris Lattner69193f92004-04-05 01:30:19 +0000555 !isa<Constant>(GEP2Ops[i]) || isa<ConstantExpr>(GEP2Ops[i]))
556 GEP1Ops[i] = GEP2Ops[i] = Constant::getNullValue(Type::UIntTy);
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000557 }
558
559 // We know that GEP1Ops[FirstConstantOper] & GEP2Ops[FirstConstantOper] are ok
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000560
561 // Loop over the rest of the operands...
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000562 for (unsigned i = FirstConstantOper+1; i != MaxOperands; ++i) {
563 const Value *Op1 = i < GEP1Ops.size() ? GEP1Ops[i] : 0;
564 const Value *Op2 = i < GEP2Ops.size() ? GEP2Ops[i] : 0;
565 // If they are equal, use a zero index...
566 if (Op1 == Op2 && BasePtr1Ty == BasePtr2Ty) {
567 if (!isa<Constant>(Op1) || isa<ConstantExpr>(Op1))
568 GEP1Ops[i] = GEP2Ops[i] = Constant::getNullValue(Op1->getType());
569 // Otherwise, just keep the constants we have.
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000570 } else {
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000571 if (Op1) {
572 if (const ConstantInt *Op1C = dyn_cast<ConstantInt>(Op1)) {
573 // If this is an array index, make sure the array element is in range.
574 if (const ArrayType *AT = dyn_cast<ArrayType>(BasePtr1Ty))
575 if (Op1C->getRawValue() >= AT->getNumElements())
576 return MayAlias; // Be conservative with out-of-range accesses
577
578 } else {
579 // GEP1 is known to produce a value less than GEP2. To be
580 // conservatively correct, we must assume the largest possible
581 // constant is used in this position. This cannot be the initial
582 // index to the GEP instructions (because we know we have at least one
583 // element before this one with the different constant arguments), so
584 // we know that the current index must be into either a struct or
585 // array. Because we know it's not constant, this cannot be a
586 // structure index. Because of this, we can calculate the maximum
587 // value possible.
588 //
589 if (const ArrayType *AT = dyn_cast<ArrayType>(BasePtr1Ty))
590 GEP1Ops[i] = ConstantSInt::get(Type::LongTy,AT->getNumElements()-1);
591 }
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000592 }
593
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000594 if (Op2) {
595 if (const ConstantInt *Op2C = dyn_cast<ConstantInt>(Op2)) {
596 // If this is an array index, make sure the array element is in range.
597 if (const ArrayType *AT = dyn_cast<ArrayType>(BasePtr1Ty))
598 if (Op2C->getRawValue() >= AT->getNumElements())
599 return MayAlias; // Be conservative with out-of-range accesses
600 } else { // Conservatively assume the minimum value for this index
601 GEP2Ops[i] = Constant::getNullValue(Op2->getType());
602 }
Chris Lattner78dd4322003-06-02 05:42:39 +0000603 }
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000604 }
605
606 if (BasePtr1Ty && Op1) {
607 if (const CompositeType *CT = dyn_cast<CompositeType>(BasePtr1Ty))
608 BasePtr1Ty = CT->getTypeAtIndex(GEP1Ops[i]);
609 else
610 BasePtr1Ty = 0;
611 }
612
613 if (BasePtr2Ty && Op2) {
614 if (const CompositeType *CT = dyn_cast<CompositeType>(BasePtr2Ty))
615 BasePtr2Ty = CT->getTypeAtIndex(GEP2Ops[i]);
616 else
617 BasePtr2Ty = 0;
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000618 }
619 }
620
Chris Lattner6ea17f77f2003-12-11 22:44:13 +0000621 int64_t Offset1 = getTargetData().getIndexedOffset(GEPPointerTy, GEP1Ops);
622 int64_t Offset2 = getTargetData().getIndexedOffset(GEPPointerTy, GEP2Ops);
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000623 assert(Offset1 < Offset2 &&"There is at least one different constant here!");
624
Chris Lattnerbe2d24e2003-04-25 18:03:06 +0000625 if ((uint64_t)(Offset2-Offset1) >= SizeMax) {
Chris Lattnerd6a2a992003-02-26 19:41:54 +0000626 //std::cerr << "Determined that these two GEP's don't alias ["
627 // << SizeMax << " bytes]: \n" << *GEP1 << *GEP2;
628 return NoAlias;
629 }
630 return MayAlias;
631}
632
Chris Lattnerd82256a2004-03-15 03:36:49 +0000633namespace {
634 struct StringCompare {
635 bool operator()(const char *LHS, const char *RHS) {
636 return strcmp(LHS, RHS) < 0;
637 }
638 };
639}
640
641// Note that this list cannot contain libm functions (such as acos and sqrt)
642// that set errno on a domain or other error.
643static const char *DoesntAccessMemoryTable[] = {
Chris Lattner4a1b03c2004-04-10 06:55:27 +0000644 // LLVM intrinsics:
Chris Lattnerfbf4dc32004-06-15 21:52:58 +0000645 "llvm.frameaddress", "llvm.returnaddress", "llvm.readport", "llvm.isunordered",
Chris Lattner4a1b03c2004-04-10 06:55:27 +0000646
Chris Lattnerd82256a2004-03-15 03:36:49 +0000647 "abs", "labs", "llabs", "imaxabs", "fabs", "fabsf", "fabsl",
648 "trunc", "truncf", "truncl", "ldexp",
649
650 "atan", "atanf", "atanl", "atan2", "atan2f", "atan2l",
651 "cbrt",
652 "cos", "cosf", "cosl", "cosh", "coshf", "coshl",
653 "exp", "expf", "expl",
654 "hypot",
655 "sin", "sinf", "sinl", "sinh", "sinhf", "sinhl",
656 "tan", "tanf", "tanl", "tanh", "tanhf", "tanhl",
657
Chris Lattnerea42c852004-03-15 04:18:28 +0000658 // ctype.h
Chris Lattnerd82256a2004-03-15 03:36:49 +0000659 "isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower", "isprint"
660 "ispunct", "isspace", "isupper", "isxdigit", "tolower", "toupper",
661
Chris Lattnerea42c852004-03-15 04:18:28 +0000662 // wctype.h"
Chris Lattnerd82256a2004-03-15 03:36:49 +0000663 "iswalnum", "iswalpha", "iswcntrl", "iswdigit", "iswgraph", "iswlower",
664 "iswprint", "iswpunct", "iswspace", "iswupper", "iswxdigit",
665
Chris Lattnerea42c852004-03-15 04:18:28 +0000666 "iswctype", "towctrans", "towlower", "towupper",
667
Chris Lattnerd82256a2004-03-15 03:36:49 +0000668 "btowc", "wctob",
Chris Lattner8ad948d2004-03-16 03:41:35 +0000669
670 "isinf", "isnan", "finite",
671
672 // C99 math functions
673 "copysign", "copysignf", "copysignd",
674 "nexttoward", "nexttowardf", "nexttowardd",
675 "nextafter", "nextafterf", "nextafterd",
676
677 // glibc functions:
678 "__fpclassify", "__fpclassifyf", "__fpclassifyl",
679 "__signbit", "__signbitf", "__signbitl",
Chris Lattnerd82256a2004-03-15 03:36:49 +0000680};
681
682static const unsigned DAMTableSize =
683 sizeof(DoesntAccessMemoryTable)/sizeof(DoesntAccessMemoryTable[0]);
684
685/// doesNotAccessMemory - Return true if we know that the function does not
686/// access memory at all. Since basicaa does no analysis, we can only do simple
687/// things here. In particular, if we have an external function with the name
688/// of a standard C library function, we are allowed to assume it will be
689/// resolved by libc, so we can hardcode some entries in here.
690bool BasicAliasAnalysis::doesNotAccessMemory(Function *F) {
691 if (!F->isExternal()) return false;
692
693 static bool Initialized = false;
694 if (!Initialized) {
695 // Sort the table the first time through.
696 std::sort(DoesntAccessMemoryTable, DoesntAccessMemoryTable+DAMTableSize,
697 StringCompare());
698 Initialized = true;
699 }
700
701 const char **Ptr = std::lower_bound(DoesntAccessMemoryTable,
702 DoesntAccessMemoryTable+DAMTableSize,
703 F->getName().c_str(), StringCompare());
704 return Ptr != DoesntAccessMemoryTable+DAMTableSize && *Ptr == F->getName();
705}
706
707
708static const char *OnlyReadsMemoryTable[] = {
Chris Lattner8ad948d2004-03-16 03:41:35 +0000709 "atoi", "atol", "atof", "atoll", "atoq", "a64l",
710 "bcmp", "memcmp", "memchr", "memrchr", "wmemcmp", "wmemchr",
Chris Lattnerd82256a2004-03-15 03:36:49 +0000711
712 // Strings
713 "strcmp", "strcasecmp", "strcoll", "strncmp", "strncasecmp",
714 "strchr", "strcspn", "strlen", "strpbrk", "strrchr", "strspn", "strstr",
Chris Lattner8ad948d2004-03-16 03:41:35 +0000715 "index", "rindex",
Chris Lattnerd82256a2004-03-15 03:36:49 +0000716
717 // Wide char strings
718 "wcschr", "wcscmp", "wcscoll", "wcscspn", "wcslen", "wcsncmp", "wcspbrk",
719 "wcsrchr", "wcsspn", "wcsstr",
Chris Lattner8ad948d2004-03-16 03:41:35 +0000720
721 // glibc
722 "alphasort", "alphasort64", "versionsort", "versionsort64",
723
724 // C99
725 "nan", "nanf", "nand",
Chris Lattner4a1b03c2004-04-10 06:55:27 +0000726
727 // File I/O
728 "feof", "ferror", "fileno",
729 "feof_unlocked", "ferror_unlocked", "fileno_unlocked"
Chris Lattnerd82256a2004-03-15 03:36:49 +0000730};
731
732static const unsigned ORMTableSize =
733 sizeof(OnlyReadsMemoryTable)/sizeof(OnlyReadsMemoryTable[0]);
734
735bool BasicAliasAnalysis::onlyReadsMemory(Function *F) {
736 if (doesNotAccessMemory(F)) return true;
737 if (!F->isExternal()) return false;
738
739 static bool Initialized = false;
740 if (!Initialized) {
741 // Sort the table the first time through.
742 std::sort(OnlyReadsMemoryTable, OnlyReadsMemoryTable+ORMTableSize,
743 StringCompare());
744 Initialized = true;
745 }
746
747 const char **Ptr = std::lower_bound(OnlyReadsMemoryTable,
748 OnlyReadsMemoryTable+ORMTableSize,
749 F->getName().c_str(), StringCompare());
750 return Ptr != OnlyReadsMemoryTable+ORMTableSize && *Ptr == F->getName();
751}
752
753