Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/Transforms/Instrumentation/PGOInstrumentation.h
Line
Count
Source
1
//===- Transforms/Instrumentation/PGOInstrumentation.h ----------*- 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 file provides the interface for IR based instrumentation passes (
11
/// (profile-gen, and profile-use).
12
//
13
//===----------------------------------------------------------------------===//
14
15
#ifndef LLVM_TRANSFORMS_PGOINSTRUMENTATION_H
16
#define LLVM_TRANSFORMS_PGOINSTRUMENTATION_H
17
18
#include "llvm/ADT/ArrayRef.h"
19
#include "llvm/IR/PassManager.h"
20
#include <cstdint>
21
#include <string>
22
23
namespace llvm {
24
25
class Function;
26
class Instruction;
27
class Module;
28
29
/// The instrumentation (profile-instr-gen) pass for IR based PGO.
30
// We use this pass to create COMDAT profile variables for context
31
// sensitive PGO (CSPGO). The reason to have a pass for this is CSPGO
32
// can be run after LTO/ThinLTO linking. Lld linker needs to see
33
// all the COMDAT variables before linking. So we have this pass
34
// always run before linking for CSPGO.
35
class PGOInstrumentationGenCreateVar
36
    : public PassInfoMixin<PGOInstrumentationGenCreateVar> {
37
public:
38
  PGOInstrumentationGenCreateVar(std::string CSInstrName = "")
39
8
      : CSInstrName(CSInstrName) {}
40
  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
41
42
private:
43
  std::string CSInstrName;
44
};
45
46
/// The instrumentation (profile-instr-gen) pass for IR based PGO.
47
class PGOInstrumentationGen : public PassInfoMixin<PGOInstrumentationGen> {
48
public:
49
37
  PGOInstrumentationGen(bool IsCS = false) : IsCS(IsCS) {}
50
  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
51
52
private:
53
  // If this is a context sensitive instrumentation.
54
  bool IsCS;
55
};
56
57
/// The profile annotation (profile-instr-use) pass for IR based PGO.
58
class PGOInstrumentationUse : public PassInfoMixin<PGOInstrumentationUse> {
59
public:
60
  PGOInstrumentationUse(std::string Filename = "",
61
                        std::string RemappingFilename = "", bool IsCS = false);
62
63
  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
64
65
private:
66
  std::string ProfileFileName;
67
  std::string ProfileRemappingFileName;
68
  // If this is a context sensitive instrumentation.
69
  bool IsCS;
70
};
71
72
/// The indirect function call promotion pass.
73
class PGOIndirectCallPromotion : public PassInfoMixin<PGOIndirectCallPromotion> {
74
public:
75
  PGOIndirectCallPromotion(bool IsInLTO = false, bool SamplePGO = false)
76
80
      : InLTO(IsInLTO), SamplePGO(SamplePGO) {}
77
78
  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
79
80
private:
81
  bool InLTO;
82
  bool SamplePGO;
83
};
84
85
/// The profile size based optimization pass for memory intrinsics.
86
class PGOMemOPSizeOpt : public PassInfoMixin<PGOMemOPSizeOpt> {
87
public:
88
  PGOMemOPSizeOpt() = default;
89
90
  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
91
};
92
93
void setProfMetadata(Module *M, Instruction *TI, ArrayRef<uint64_t> EdgeCounts,
94
                     uint64_t MaxCount);
95
96
void setIrrLoopHeaderMetadata(Module *M, Instruction *TI, uint64_t Count);
97
98
} // end namespace llvm
99
100
#endif // LLVM_TRANSFORMS_PGOINSTRUMENTATION_H