1 //===- ScalarEvolutionAliasAnalysis.cpp - SCEV-based Alias Analysis -------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the ScalarEvolutionAliasAnalysis pass, which implements a 11 // simple alias analysis implemented in terms of ScalarEvolution queries. 12 // 13 // This differs from traditional loop dependence analysis in that it tests 14 // for dependencies within a single iteration of a loop, rather than 15 // dependencies between different iterations. 16 // 17 // ScalarEvolution has a more complete understanding of pointer arithmetic 18 // than BasicAliasAnalysis' collection of ad-hoc analyses. 19 // 20 //===----------------------------------------------------------------------===// 21 22 #include "llvm/Analysis/Passes.h" 23 #include "llvm/Analysis/AliasAnalysis.h" 24 #include "llvm/Analysis/ScalarEvolutionExpressions.h" 25 #include "llvm/IR/Module.h" 26 #include "llvm/Pass.h" 27 using namespace llvm; 28 29 namespace { 30 /// ScalarEvolutionAliasAnalysis - This is a simple alias analysis 31 /// implementation that uses ScalarEvolution to answer queries. 32 class ScalarEvolutionAliasAnalysis : public FunctionPass, 33 public AliasAnalysis { 34 ScalarEvolution *SE; 35 36 public: 37 static char ID; // Class identification, replacement for typeinfo 38 ScalarEvolutionAliasAnalysis() : FunctionPass(ID), SE(nullptr) { 39 initializeScalarEvolutionAliasAnalysisPass( 40 *PassRegistry::getPassRegistry()); 41 } 42 43 /// getAdjustedAnalysisPointer - This method is used when a pass implements 44 /// an analysis interface through multiple inheritance. If needed, it 45 /// should override this to adjust the this pointer as needed for the 46 /// specified pass info. 47 void *getAdjustedAnalysisPointer(AnalysisID PI) override { 48 if (PI == &AliasAnalysis::ID) 49 return (AliasAnalysis*)this; 50 return this; 51 } 52 53 private: 54 void getAnalysisUsage(AnalysisUsage &AU) const override; 55 bool runOnFunction(Function &F) override; 56 AliasResult alias(const Location &LocA, const Location &LocB) override; 57 58 Value *GetBaseValue(const SCEV *S); 59 }; 60 } // End of anonymous namespace 61 62 // Register this pass... 63 char ScalarEvolutionAliasAnalysis::ID = 0; 64 INITIALIZE_AG_PASS_BEGIN(ScalarEvolutionAliasAnalysis, AliasAnalysis, "scev-aa", 65 "ScalarEvolution-based Alias Analysis", false, true, false) 66 INITIALIZE_PASS_DEPENDENCY(ScalarEvolution) 67 INITIALIZE_AG_PASS_END(ScalarEvolutionAliasAnalysis, AliasAnalysis, "scev-aa", 68 "ScalarEvolution-based Alias Analysis", false, true, false) 69 70 FunctionPass *llvm::createScalarEvolutionAliasAnalysisPass() { 71 return new ScalarEvolutionAliasAnalysis(); 72 } 73 74 void 75 ScalarEvolutionAliasAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { 76 AU.addRequiredTransitive<ScalarEvolution>(); 77 AU.setPreservesAll(); 78 AliasAnalysis::getAnalysisUsage(AU); 79 } 80 81 bool 82 ScalarEvolutionAliasAnalysis::runOnFunction(Function &F) { 83 InitializeAliasAnalysis(this, &F.getParent()->getDataLayout()); 84 SE = &getAnalysis<ScalarEvolution>(); 85 return false; 86 } 87 88 /// GetBaseValue - Given an expression, try to find a 89 /// base value. Return null is none was found. 90 Value * 91 ScalarEvolutionAliasAnalysis::GetBaseValue(const SCEV *S) { 92 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) { 93 // In an addrec, assume that the base will be in the start, rather 94 // than the step. 95 return GetBaseValue(AR->getStart()); 96 } else if (const SCEVAddExpr *A = dyn_cast<SCEVAddExpr>(S)) { 97 // If there's a pointer operand, it'll be sorted at the end of the list. 98 const SCEV *Last = A->getOperand(A->getNumOperands()-1); 99 if (Last->getType()->isPointerTy()) 100 return GetBaseValue(Last); 101 } else if (const SCEVUnknown *U = dyn_cast<SCEVUnknown>(S)) { 102 // This is a leaf node. 103 return U->getValue(); 104 } 105 // No Identified object found. 106 return nullptr; 107 } 108 109 AliasAnalysis::AliasResult 110 ScalarEvolutionAliasAnalysis::alias(const Location &LocA, 111 const Location &LocB) { 112 // If either of the memory references is empty, it doesn't matter what the 113 // pointer values are. This allows the code below to ignore this special 114 // case. 115 if (LocA.Size == 0 || LocB.Size == 0) 116 return NoAlias; 117 118 // This is ScalarEvolutionAliasAnalysis. Get the SCEVs! 119 const SCEV *AS = SE->getSCEV(const_cast<Value *>(LocA.Ptr)); 120 const SCEV *BS = SE->getSCEV(const_cast<Value *>(LocB.Ptr)); 121 122 // If they evaluate to the same expression, it's a MustAlias. 123 if (AS == BS) return MustAlias; 124 125 // If something is known about the difference between the two addresses, 126 // see if it's enough to prove a NoAlias. 127 if (SE->getEffectiveSCEVType(AS->getType()) == 128 SE->getEffectiveSCEVType(BS->getType())) { 129 unsigned BitWidth = SE->getTypeSizeInBits(AS->getType()); 130 APInt ASizeInt(BitWidth, LocA.Size); 131 APInt BSizeInt(BitWidth, LocB.Size); 132 133 // Compute the difference between the two pointers. 134 const SCEV *BA = SE->getMinusSCEV(BS, AS); 135 136 // Test whether the difference is known to be great enough that memory of 137 // the given sizes don't overlap. This assumes that ASizeInt and BSizeInt 138 // are non-zero, which is special-cased above. 139 if (ASizeInt.ule(SE->getUnsignedRange(BA).getUnsignedMin()) && 140 (-BSizeInt).uge(SE->getUnsignedRange(BA).getUnsignedMax())) 141 return NoAlias; 142 143 // Folding the subtraction while preserving range information can be tricky 144 // (because of INT_MIN, etc.); if the prior test failed, swap AS and BS 145 // and try again to see if things fold better that way. 146 147 // Compute the difference between the two pointers. 148 const SCEV *AB = SE->getMinusSCEV(AS, BS); 149 150 // Test whether the difference is known to be great enough that memory of 151 // the given sizes don't overlap. This assumes that ASizeInt and BSizeInt 152 // are non-zero, which is special-cased above. 153 if (BSizeInt.ule(SE->getUnsignedRange(AB).getUnsignedMin()) && 154 (-ASizeInt).uge(SE->getUnsignedRange(AB).getUnsignedMax())) 155 return NoAlias; 156 } 157 158 // If ScalarEvolution can find an underlying object, form a new query. 159 // The correctness of this depends on ScalarEvolution not recognizing 160 // inttoptr and ptrtoint operators. 161 Value *AO = GetBaseValue(AS); 162 Value *BO = GetBaseValue(BS); 163 if ((AO && AO != LocA.Ptr) || (BO && BO != LocB.Ptr)) 164 if (alias(Location(AO ? AO : LocA.Ptr, 165 AO ? +UnknownSize : LocA.Size, 166 AO ? AAMDNodes() : LocA.AATags), 167 Location(BO ? BO : LocB.Ptr, 168 BO ? +UnknownSize : LocB.Size, 169 BO ? AAMDNodes() : LocB.AATags)) == NoAlias) 170 return NoAlias; 171 172 // Forward the query to the next analysis. 173 return AliasAnalysis::alias(LocA, LocB); 174 } 175