Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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_INSTRUMENTATION_PGOINSTRUMENTATION_H
16
#define LLVM_TRANSFORMS_INSTRUMENTATION_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
      : 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
  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
      : 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_INSTRUMENTATION_PGOINSTRUMENTATION_H