File indexing completed on 2026-05-10 08:44:41
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #ifndef LLVM_TRANSFORMS_IPO_SAMPLEPROFILEPROBE_H
0016 #define LLVM_TRANSFORMS_IPO_SAMPLEPROFILEPROBE_H
0017
0018 #include "llvm/Analysis/LazyCallGraph.h"
0019 #include "llvm/IR/PassManager.h"
0020 #include "llvm/IR/PassInstrumentation.h"
0021 #include "llvm/ProfileData/SampleProf.h"
0022 #include <unordered_map>
0023
0024 namespace llvm {
0025 class BasicBlock;
0026 class Function;
0027 class Instruction;
0028 class Loop;
0029 class PassInstrumentationCallbacks;
0030 class TargetMachine;
0031
0032 class Module;
0033
0034 using namespace sampleprof;
0035 using BlockIdMap = std::unordered_map<BasicBlock *, uint32_t>;
0036 using InstructionIdMap = std::unordered_map<Instruction *, uint32_t>;
0037
0038
0039 using ProbeFactorMap = std::unordered_map<std::pair<uint64_t, uint64_t>, float,
0040 pair_hash<uint64_t, uint64_t>>;
0041 using FuncProbeFactorMap = StringMap<ProbeFactorMap>;
0042
0043
0044
0045
0046
0047
0048 class PseudoProbeVerifier {
0049 public:
0050 void registerCallbacks(PassInstrumentationCallbacks &PIC);
0051
0052
0053 void runAfterPass(StringRef PassID, Any IR);
0054
0055 private:
0056
0057 constexpr static float DistributionFactorVariance = 0.02f;
0058
0059 FuncProbeFactorMap FunctionProbeFactors;
0060
0061 void collectProbeFactors(const BasicBlock *BB, ProbeFactorMap &ProbeFactors);
0062 void runAfterPass(const Module *M);
0063 void runAfterPass(const LazyCallGraph::SCC *C);
0064 void runAfterPass(const Function *F);
0065 void runAfterPass(const Loop *L);
0066 bool shouldVerifyFunction(const Function *F);
0067 void verifyProbeFactors(const Function *F,
0068 const ProbeFactorMap &ProbeFactors);
0069 };
0070
0071
0072
0073
0074 class SampleProfileProber {
0075 public:
0076
0077 SampleProfileProber(Function &F, const std::string &CurModuleUniqueId);
0078 void instrumentOneFunc(Function &F, TargetMachine *TM);
0079
0080 private:
0081 Function *getFunction() const { return F; }
0082 uint64_t getFunctionHash() const { return FunctionHash; }
0083 uint32_t getBlockId(const BasicBlock *BB) const;
0084 uint32_t getCallsiteId(const Instruction *Call) const;
0085 void findUnreachableBlocks(DenseSet<BasicBlock *> &BlocksToIgnore);
0086 void findInvokeNormalDests(DenseSet<BasicBlock *> &InvokeNormalDests);
0087 void computeBlocksToIgnore(DenseSet<BasicBlock *> &BlocksToIgnore,
0088 DenseSet<BasicBlock *> &BlocksAndCallsToIgnore);
0089 const Instruction *
0090 getOriginalTerminator(const BasicBlock *Head,
0091 const DenseSet<BasicBlock *> &BlocksToIgnore);
0092 void computeCFGHash(const DenseSet<BasicBlock *> &BlocksToIgnore);
0093 void computeProbeId(const DenseSet<BasicBlock *> &BlocksToIgnore,
0094 const DenseSet<BasicBlock *> &BlocksAndCallsToIgnore);
0095
0096 Function *F;
0097
0098
0099
0100 std::string CurModuleUniqueId;
0101
0102
0103 uint64_t FunctionHash;
0104
0105
0106 BlockIdMap BlockProbeIds;
0107
0108
0109 InstructionIdMap CallProbeIds;
0110
0111
0112 uint32_t LastProbeId;
0113 };
0114
0115 class SampleProfileProbePass : public PassInfoMixin<SampleProfileProbePass> {
0116 TargetMachine *TM;
0117
0118 public:
0119 SampleProfileProbePass(TargetMachine *TM) : TM(TM) {}
0120 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
0121 };
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135 class PseudoProbeUpdatePass : public PassInfoMixin<PseudoProbeUpdatePass> {
0136 void runOnFunction(Function &F, FunctionAnalysisManager &FAM);
0137
0138 public:
0139 PseudoProbeUpdatePass() = default;
0140 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
0141 };
0142
0143 }
0144 #endif