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