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