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