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