1//===- ScalarEvolutionAliasAnalysis.h - SCEV-based AA -----------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8/// \file 9/// This is the interface for a SCEV-based alias analysis. 10/// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_ANALYSIS_SCALAREVOLUTIONALIASANALYSIS_H 14#define LLVM_ANALYSIS_SCALAREVOLUTIONALIASANALYSIS_H 15 16#include "llvm/Analysis/AliasAnalysis.h" 17#include "llvm/Analysis/ScalarEvolutionExpressions.h" 18#include "llvm/IR/Function.h" 19#include "llvm/IR/Module.h" 20#include "llvm/Pass.h" 21 22namespace llvm { 23 24/// A simple alias analysis implementation that uses ScalarEvolution to answer 25/// queries. 26class SCEVAAResult : public AAResultBase<SCEVAAResult> { 27 ScalarEvolution &SE; 28 29public: 30 explicit SCEVAAResult(ScalarEvolution &SE) : AAResultBase(), SE(SE) {} 31 SCEVAAResult(SCEVAAResult &&Arg) : AAResultBase(std::move(Arg)), SE(Arg.SE) {} 32 33 AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, 34 AAQueryInfo &AAQI); 35 36 bool invalidate(Function &F, const PreservedAnalyses &PA, 37 FunctionAnalysisManager::Invalidator &Inv); 38 39private: 40 Value *GetBaseValue(const SCEV *S); 41}; 42 43/// Analysis pass providing a never-invalidated alias analysis result. 44class SCEVAA : public AnalysisInfoMixin<SCEVAA> { 45 friend AnalysisInfoMixin<SCEVAA>; 46 static AnalysisKey Key; 47 48public: 49 typedef SCEVAAResult Result; 50 51 SCEVAAResult run(Function &F, FunctionAnalysisManager &AM); 52}; 53 54/// Legacy wrapper pass to provide the SCEVAAResult object. 55class SCEVAAWrapperPass : public FunctionPass { 56 std::unique_ptr<SCEVAAResult> Result; 57 58public: 59 static char ID; 60 61 SCEVAAWrapperPass(); 62 63 SCEVAAResult &getResult() { return *Result; } 64 const SCEVAAResult &getResult() const { return *Result; } 65 66 bool runOnFunction(Function &F) override; 67 void getAnalysisUsage(AnalysisUsage &AU) const override; 68}; 69 70/// Creates an instance of \c SCEVAAWrapperPass. 71FunctionPass *createSCEVAAWrapperPass(); 72 73} 74 75#endif 76