From e4fb375995def5029b94b5af708dd181be36ca01 Mon Sep 17 00:00:00 2001 From: Shuxin Yang Date: Wed, 23 Oct 2013 17:28:19 +0000 Subject: Use address-taken to disambiguate global variable and indirect memops. Major steps include: 1). introduces a not-addr-taken bit-field in GlobalVariable 2). GlobalOpt pass sets "not-address-taken" if it proves a global varirable dosen't have its address taken. 3). AA use this info for disambiguation. llvm-svn: 193251 --- llvm/lib/Analysis/BasicAliasAnalysis.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp') diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index bf929690ae7..4e423a787c9 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1238,6 +1238,17 @@ BasicAliasAnalysis::aliasCheck(const Value *V1, uint64_t V1Size, return NoAlias; if (isEscapeSource(O2) && isNonEscapingLocalObject(O1)) return NoAlias; + + // If one object is a global variable without address taken, the other one + // is a different object, they will not alias because the global variable + // in question cannot be indirectly accessed. + if (const GlobalVariable *GV = dyn_cast(O1)) + if (!GV->AddressMaybeTaken()) + return NoAlias; + + if (const GlobalVariable *GV = dyn_cast(O2)) + if (!GV->AddressMaybeTaken()) + return NoAlias; } // If the size of one access is larger than the entire object on the other -- cgit v1.2.3