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