• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 = "")
CSInstrName(CSInstrName)47       : CSInstrName(CSInstrName) {}
48   PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
49 
50 private:
51   std::string CSInstrName;
52 };
53 
54 /// The instrumentation (profile-instr-gen) pass for IR based PGO.
55 class PGOInstrumentationGen : public PassInfoMixin<PGOInstrumentationGen> {
56 public:
IsCS(IsCS)57   PGOInstrumentationGen(bool IsCS = false) : IsCS(IsCS) {}
58   PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
59 
60 private:
61   // If this is a context sensitive instrumentation.
62   bool IsCS;
63 };
64 
65 /// The profile annotation (profile-instr-use) pass for IR based PGO.
66 class PGOInstrumentationUse : public PassInfoMixin<PGOInstrumentationUse> {
67 public:
68   PGOInstrumentationUse(std::string Filename = "",
69                         std::string RemappingFilename = "", bool IsCS = false,
70                         IntrusiveRefCntPtr<vfs::FileSystem> FS = nullptr);
71 
72   PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
73 
74 private:
75   std::string ProfileFileName;
76   std::string ProfileRemappingFileName;
77   // If this is a context sensitive instrumentation.
78   bool IsCS;
79   IntrusiveRefCntPtr<vfs::FileSystem> FS;
80 };
81 
82 /// The indirect function call promotion pass.
83 class PGOIndirectCallPromotion : public PassInfoMixin<PGOIndirectCallPromotion> {
84 public:
85   PGOIndirectCallPromotion(bool IsInLTO = false, bool SamplePGO = false)
InLTO(IsInLTO)86       : InLTO(IsInLTO), SamplePGO(SamplePGO) {}
87 
88   PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
89 
90 private:
91   bool InLTO;
92   bool SamplePGO;
93 };
94 
95 /// The profile size based optimization pass for memory intrinsics.
96 class PGOMemOPSizeOpt : public PassInfoMixin<PGOMemOPSizeOpt> {
97 public:
98   PGOMemOPSizeOpt() = default;
99 
100   PreservedAnalyses run(Function &F, FunctionAnalysisManager &MAM);
101 };
102 
103 void setProfMetadata(Module *M, Instruction *TI, ArrayRef<uint64_t> EdgeCounts,
104                      uint64_t MaxCount);
105 
106 void setIrrLoopHeaderMetadata(Module *M, Instruction *TI, uint64_t Count);
107 
108 } // end namespace llvm
109 
110 #endif // LLVM_TRANSFORMS_INSTRUMENTATION_PGOINSTRUMENTATION_H
111