Home | History | Annotate | Download | only in Analysis
      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:
     31   explicit SCEVAAResult(ScalarEvolution &SE) : AAResultBase(), SE(SE) {}
     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 AnalysisKey Key;
     44 
     45 public:
     46   typedef SCEVAAResult Result;
     47 
     48   SCEVAAResult run(Function &F, FunctionAnalysisManager &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 
     60   SCEVAAResult &getResult() { return *Result; }
     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