xref: /freebsd/contrib/llvm-project/llvm/include/llvm/Transforms/Instrumentation/PGOInstrumentation.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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/ADT/IntrusiveRefCntPtr.h"
20 #include "llvm/IR/PassManager.h"
21 #include "llvm/Support/CommandLine.h"
22 #include <cstdint>
23 #include <string>
24 
25 namespace llvm {
26 
27 extern cl::opt<bool> DebugInfoCorrelate;
28 
29 class Function;
30 class Instruction;
31 class Module;
32 
33 namespace vfs {
34 class FileSystem;
35 } // namespace vfs
36 
37 /// The instrumentation (profile-instr-gen) pass for IR based PGO.
38 // We use this pass to create COMDAT profile variables for context
39 // sensitive PGO (CSPGO). The reason to have a pass for this is CSPGO
40 // can be run after LTO/ThinLTO linking. Lld linker needs to see
41 // all the COMDAT variables before linking. So we have this pass
42 // always run before linking for CSPGO.
43 class PGOInstrumentationGenCreateVar
44     : public PassInfoMixin<PGOInstrumentationGenCreateVar> {
45 public:
46   PGOInstrumentationGenCreateVar(std::string CSInstrName = "",
47                                  bool Sampling = false)
CSInstrName(CSInstrName)48       : CSInstrName(CSInstrName), ProfileSampling(Sampling) {}
49   PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
50 
51 private:
52   std::string CSInstrName;
53   bool ProfileSampling;
54 };
55 
56 /// The instrumentation (profile-instr-gen) pass for IR based PGO.
57 class PGOInstrumentationGen : public PassInfoMixin<PGOInstrumentationGen> {
58 public:
IsCS(IsCS)59   PGOInstrumentationGen(bool IsCS = false) : IsCS(IsCS) {}
60   PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
61 
62 private:
63   // If this is a context sensitive instrumentation.
64   bool IsCS;
65 };
66 
67 /// The profile annotation (profile-instr-use) pass for IR based PGO.
68 class PGOInstrumentationUse : public PassInfoMixin<PGOInstrumentationUse> {
69 public:
70   PGOInstrumentationUse(std::string Filename = "",
71                         std::string RemappingFilename = "", bool IsCS = false,
72                         IntrusiveRefCntPtr<vfs::FileSystem> FS = nullptr);
73 
74   PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
75 
76 private:
77   std::string ProfileFileName;
78   std::string ProfileRemappingFileName;
79   // If this is a context sensitive instrumentation.
80   bool IsCS;
81   IntrusiveRefCntPtr<vfs::FileSystem> FS;
82 };
83 
84 /// The indirect function call promotion pass.
85 class PGOIndirectCallPromotion : public PassInfoMixin<PGOIndirectCallPromotion> {
86 public:
87   PGOIndirectCallPromotion(bool IsInLTO = false, bool SamplePGO = false)
InLTO(IsInLTO)88       : InLTO(IsInLTO), SamplePGO(SamplePGO) {}
89 
90   PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
91 
92 private:
93   bool InLTO;
94   bool SamplePGO;
95 };
96 
97 /// The profile size based optimization pass for memory intrinsics.
98 class PGOMemOPSizeOpt : public PassInfoMixin<PGOMemOPSizeOpt> {
99 public:
100   PGOMemOPSizeOpt() = default;
101 
102   PreservedAnalyses run(Function &F, FunctionAnalysisManager &MAM);
103 };
104 
105 void setProfMetadata(Module *M, Instruction *TI, ArrayRef<uint64_t> EdgeCounts,
106                      uint64_t MaxCount);
107 
108 void setIrrLoopHeaderMetadata(Module *M, Instruction *TI, uint64_t Count);
109 
110 } // end namespace llvm
111 
112 #endif // LLVM_TRANSFORMS_INSTRUMENTATION_PGOINSTRUMENTATION_H
113