Coverage Report

Created: 2019-02-21 13:17

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/Analysis/ScopedNoAliasAA.h
Line
Count
Source (jump to first uncovered line)
1
//===- ScopedNoAliasAA.h - Scoped No-Alias Alias Analysis -------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
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/InstrTypes.h"
19
#include "llvm/IR/PassManager.h"
20
#include "llvm/Pass.h"
21
#include <memory>
22
23
namespace llvm {
24
25
class Function;
26
class MDNode;
27
class MemoryLocation;
28
29
/// A simple AA result which uses scoped-noalias metadata to answer queries.
30
class ScopedNoAliasAAResult : public AAResultBase<ScopedNoAliasAAResult> {
31
  friend AAResultBase<ScopedNoAliasAAResult>;
32
33
public:
34
  /// Handle invalidation events from the new pass manager.
35
  ///
36
  /// By definition, this result is stateless and so remains valid.
37
  bool invalidate(Function &, const PreservedAnalyses &,
38
284
                  FunctionAnalysisManager::Invalidator &) {
39
284
    return false;
40
284
  }
41
42
  AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB);
43
  ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc);
44
  ModRefInfo getModRefInfo(const CallBase *Call1, const CallBase *Call2);
45
46
private:
47
  bool mayAliasInScopes(const MDNode *Scopes, const MDNode *NoAlias) const;
48
};
49
50
/// Analysis pass providing a never-invalidated alias analysis result.
51
class ScopedNoAliasAA : public AnalysisInfoMixin<ScopedNoAliasAA> {
52
  friend AnalysisInfoMixin<ScopedNoAliasAA>;
53
54
  static AnalysisKey Key;
55
56
public:
57
  using Result = ScopedNoAliasAAResult;
58
59
  ScopedNoAliasAAResult run(Function &F, FunctionAnalysisManager &AM);
60
};
61
62
/// Legacy wrapper pass to provide the ScopedNoAliasAAResult object.
63
class ScopedNoAliasAAWrapperPass : public ImmutablePass {
64
  std::unique_ptr<ScopedNoAliasAAResult> Result;
65
66
public:
67
  static char ID;
68
69
  ScopedNoAliasAAWrapperPass();
70
71
10.3M
  ScopedNoAliasAAResult &getResult() { return *Result; }
72
0
  const ScopedNoAliasAAResult &getResult() const { return *Result; }
73
74
  bool doInitialization(Module &M) override;
75
  bool doFinalization(Module &M) override;
76
  void getAnalysisUsage(AnalysisUsage &AU) const override;
77
};
78
79
//===--------------------------------------------------------------------===//
80
//
81
// createScopedNoAliasAAWrapperPass - This pass implements metadata-based
82
// scoped noalias analysis.
83
//
84
ImmutablePass *createScopedNoAliasAAWrapperPass();
85
86
} // end namespace llvm
87
88
#endif // LLVM_ANALYSIS_SCOPEDNOALIASAA_H