1 //===- ScalarEvolutionAliasAnalysis.h - SCEV-based AA -----------*- C++ -*-===// 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 /// \file 10 /// This is the interface for a SCEV-based alias analysis. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_ANALYSIS_SCALAREVOLUTIONALIASANALYSIS_H 15 #define LLVM_ANALYSIS_SCALAREVOLUTIONALIASANALYSIS_H 16 17 #include "llvm/Analysis/AliasAnalysis.h" 18 #include "llvm/Analysis/ScalarEvolutionExpressions.h" 19 #include "llvm/IR/Function.h" 20 #include "llvm/IR/Module.h" 21 #include "llvm/Pass.h" 22 23 namespace llvm { 24 25 /// A simple alias analysis implementation that uses ScalarEvolution to answer 26 /// queries. 27 class SCEVAAResult : public AAResultBase<SCEVAAResult> { 28 ScalarEvolution &SE; 29 30 public: SCEVAAResult(ScalarEvolution & SE)31 explicit SCEVAAResult(ScalarEvolution &SE) : AAResultBase(), SE(SE) {} SCEVAAResult(SCEVAAResult && Arg)32 SCEVAAResult(SCEVAAResult &&Arg) : AAResultBase(std::move(Arg)), SE(Arg.SE) {} 33 34 AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB); 35 36 private: 37 Value *GetBaseValue(const SCEV *S); 38 }; 39 40 /// Analysis pass providing a never-invalidated alias analysis result. 41 class SCEVAA : public AnalysisInfoMixin<SCEVAA> { 42 friend AnalysisInfoMixin<SCEVAA>; 43 static char PassID; 44 45 public: 46 typedef SCEVAAResult Result; 47 48 SCEVAAResult run(Function &F, AnalysisManager<Function> &AM); 49 }; 50 51 /// Legacy wrapper pass to provide the SCEVAAResult object. 52 class SCEVAAWrapperPass : public FunctionPass { 53 std::unique_ptr<SCEVAAResult> Result; 54 55 public: 56 static char ID; 57 58 SCEVAAWrapperPass(); 59 getResult()60 SCEVAAResult &getResult() { return *Result; } getResult()61 const SCEVAAResult &getResult() const { return *Result; } 62 63 bool runOnFunction(Function &F) override; 64 void getAnalysisUsage(AnalysisUsage &AU) const override; 65 }; 66 67 /// Creates an instance of \c SCEVAAWrapperPass. 68 FunctionPass *createSCEVAAWrapperPass(); 69 70 } 71 72 #endif 73