31 class ScalarEvolutionAliasAnalysis :
public FunctionPass,
46 virtual void *getAdjustedAnalysisPointer(
AnalysisID PI) {
55 virtual AliasResult alias(
const Location &LocA,
const Location &LocB);
64 "ScalarEvolution-based Alias Analysis",
false,
true,
false)
70 return new ScalarEvolutionAliasAnalysis();
74 ScalarEvolutionAliasAnalysis::getAnalysisUsage(
AnalysisUsage &AU)
const {
81 ScalarEvolutionAliasAnalysis::runOnFunction(
Function &
F) {
82 InitializeAliasAnalysis(
this);
83 SE = &getAnalysis<ScalarEvolution>();
90 ScalarEvolutionAliasAnalysis::GetBaseValue(
const SCEV *S) {
94 return GetBaseValue(AR->getStart());
95 }
else if (
const SCEVAddExpr *
A = dyn_cast<SCEVAddExpr>(S)) {
97 const SCEV *Last =
A->getOperand(
A->getNumOperands()-1);
99 return GetBaseValue(Last);
100 }
else if (
const SCEVUnknown *U = dyn_cast<SCEVUnknown>(S)) {
102 return U->getValue();
109 ScalarEvolutionAliasAnalysis::alias(
const Location &LocA,
110 const Location &LocB) {
114 if (LocA.Size == 0 || LocB.Size == 0)
118 const SCEV *AS = SE->getSCEV(const_cast<Value *>(LocA.Ptr));
119 const SCEV *BS = SE->getSCEV(const_cast<Value *>(LocB.Ptr));
122 if (AS == BS)
return MustAlias;
126 if (SE->getEffectiveSCEVType(AS->
getType()) ==
127 SE->getEffectiveSCEVType(BS->
getType())) {
128 unsigned BitWidth = SE->getTypeSizeInBits(AS->
getType());
129 APInt ASizeInt(BitWidth, LocA.Size);
130 APInt BSizeInt(BitWidth, LocB.Size);
133 const SCEV *BA = SE->getMinusSCEV(BS, AS);
138 if (ASizeInt.ule(SE->getUnsignedRange(BA).getUnsignedMin()) &&
139 (-BSizeInt).uge(SE->getUnsignedRange(BA).getUnsignedMax()))
147 const SCEV *AB = SE->getMinusSCEV(AS, BS);
152 if (BSizeInt.ule(SE->getUnsignedRange(AB).getUnsignedMin()) &&
153 (-ASizeInt).uge(SE->getUnsignedRange(AB).getUnsignedMax()))
160 Value *AO = GetBaseValue(AS);
161 Value *BO = GetBaseValue(BS);
162 if ((AO && AO != LocA.Ptr) || (BO && BO != LocB.Ptr))
163 if (alias(Location(AO ? AO : LocA.Ptr,
164 AO ? +UnknownSize : LocA.Size,
165 AO ? 0 : LocA.TBAATag),
166 Location(BO ? BO : LocB.Ptr,
167 BO ? +UnknownSize : LocB.Size,
168 BO ? 0 : LocB.TBAATag)) == NoAlias)
static PassRegistry * getPassRegistry()
FunctionPass * createScalarEvolutionAliasAnalysisPass()
scev ScalarEvolution based Alias Analysis
void initializeScalarEvolutionAliasAnalysisPass(PassRegistry &)
#define INITIALIZE_PASS_DEPENDENCY(depName)
ID
LLVM Calling Convention Representation.
virtual AliasResult alias(const Location &LocA, const Location &LocB)
scev ScalarEvolution based Alias false
INITIALIZE_AG_PASS_BEGIN(ScalarEvolutionAliasAnalysis, AliasAnalysis,"scev-aa","ScalarEvolution-based Alias Analysis", false, true, false) INITIALIZE_AG_PASS_END(ScalarEvolutionAliasAnalysis
Class for arbitrary precision integers.
AnalysisUsage & addRequiredTransitive()
LLVM Value Representation.
scev ScalarEvolution based Alias true
virtual void getAnalysisUsage(AnalysisUsage &AU) const
#define INITIALIZE_AG_PASS_END(passName, agName, arg, n, cfg, analysis, def)