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