1f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===- TypeBasedAliasAnalysis.h - Type-Based Alias Analysis -----*- 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 metadata-based TBAA. See the source file for
11f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// details on the algorithm.
12f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///
13f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
15f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#ifndef LLVM_ANALYSIS_TYPEBASEDALIASANALYSIS_H
16f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#define LLVM_ANALYSIS_TYPEBASEDALIASANALYSIS_H
17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
18f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/AliasAnalysis.h"
19f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/IR/Function.h"
20f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/IR/Metadata.h"
21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Pass.h"
22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarnamespace llvm {
24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
25f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// A simple AA result that uses TBAA metadata to answer queries.
26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass TypeBasedAAResult : public AAResultBase<TypeBasedAAResult> {
27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  friend AAResultBase<TypeBasedAAResult>;
28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic:
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  explicit TypeBasedAAResult() {}
31f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  TypeBasedAAResult(TypeBasedAAResult &&Arg) : AAResultBase(std::move(Arg)) {}
32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Handle invalidation events from the new pass manager.
34f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ///
35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// By definition, this result is stateless and so remains valid.
36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool invalidate(Function &, const PreservedAnalyses &) { return false; }
37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB);
39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal);
40f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  FunctionModRefBehavior getModRefBehavior(ImmutableCallSite CS);
41f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  FunctionModRefBehavior getModRefBehavior(const Function *F);
42f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ModRefInfo getModRefInfo(ImmutableCallSite CS, const MemoryLocation &Loc);
43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ModRefInfo getModRefInfo(ImmutableCallSite CS1, ImmutableCallSite CS2);
44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarprivate:
46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool Aliases(const MDNode *A, const MDNode *B) const;
47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool PathAliases(const MDNode *A, const MDNode *B) const;
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// Analysis pass providing a never-invalidated alias analysis result.
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass TypeBasedAA : public AnalysisInfoMixin<TypeBasedAA> {
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  friend AnalysisInfoMixin<TypeBasedAA>;
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static char PassID;
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic:
56f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef TypeBasedAAResult Result;
57f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  TypeBasedAAResult run(Function &F, AnalysisManager<Function> &AM);
59f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
60f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// Legacy wrapper pass to provide the TypeBasedAAResult object.
62f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass TypeBasedAAWrapperPass : public ImmutablePass {
63f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::unique_ptr<TypeBasedAAResult> Result;
64f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
65f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic:
66f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static char ID;
67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
68f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  TypeBasedAAWrapperPass();
69f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
70f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  TypeBasedAAResult &getResult() { return *Result; }
71f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const TypeBasedAAResult &getResult() const { return *Result; }
72f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
73f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool doInitialization(Module &M) override;
74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool doFinalization(Module &M) override;
75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void getAnalysisUsage(AnalysisUsage &AU) const override;
76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
77f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
78f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===--------------------------------------------------------------------===//
79f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
80f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// createTypeBasedAAWrapperPass - This pass implements metadata-based
81f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// type-based alias analysis.
82f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
83f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarImmutablePass *createTypeBasedAAWrapperPass();
84f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
85f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
86f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#endif
87