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