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 = "") CSInstrName(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: IsCS(IsCS)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) InLTO(IsInLTO)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_PGOINSTRUMENTATION_H 101