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 23namespace llvm { 24 25class Function; 26class Instruction; 27class 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. 35class PGOInstrumentationGenCreateVar 36 : public PassInfoMixin<PGOInstrumentationGenCreateVar> { 37public: 38 PGOInstrumentationGenCreateVar(std::string CSInstrName = "") 39 : CSInstrName(CSInstrName) {} 40 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 41 42private: 43 std::string CSInstrName; 44}; 45 46/// The instrumentation (profile-instr-gen) pass for IR based PGO. 47class PGOInstrumentationGen : public PassInfoMixin<PGOInstrumentationGen> { 48public: 49 PGOInstrumentationGen(bool IsCS = false) : IsCS(IsCS) {} 50 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 51 52private: 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. 58class PGOInstrumentationUse : public PassInfoMixin<PGOInstrumentationUse> { 59public: 60 PGOInstrumentationUse(std::string Filename = "", 61 std::string RemappingFilename = "", bool IsCS = false); 62 63 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 64 65private: 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. 73class PGOIndirectCallPromotion : public PassInfoMixin<PGOIndirectCallPromotion> { 74public: 75 PGOIndirectCallPromotion(bool IsInLTO = false, bool SamplePGO = false) 76 : InLTO(IsInLTO), SamplePGO(SamplePGO) {} 77 78 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 79 80private: 81 bool InLTO; 82 bool SamplePGO; 83}; 84 85/// The profile size based optimization pass for memory intrinsics. 86class PGOMemOPSizeOpt : public PassInfoMixin<PGOMemOPSizeOpt> { 87public: 88 PGOMemOPSizeOpt() = default; 89 90 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 91}; 92 93void setProfMetadata(Module *M, Instruction *TI, ArrayRef<uint64_t> EdgeCounts, 94 uint64_t MaxCount); 95 96void setIrrLoopHeaderMetadata(Module *M, Instruction *TI, uint64_t Count); 97 98} // end namespace llvm 99 100#endif // LLVM_TRANSFORMS_PGOINSTRUMENTATION_H 101