27#include <unordered_map>
33 cl::desc(
"Threshold for infer stale profile"),
40 void init(
const std::vector<MachineBasicBlock *> &Blocks,
41 const std::vector<BlendedBlockHash> &Hashes) {
42 assert(Blocks.size() == Hashes.size() &&
43 "incorrect matcher initialization");
44 for (
size_t I = 0;
I < Blocks.size();
I++) {
46 uint16_t OpHash = Hashes[
I].getOpcodeHash();
47 OpHashToBlocks[OpHash].push_back(std::make_pair(Hashes[
I],
Block));
53 auto BlockIt = OpHashToBlocks.find(BlendedHash.
getOpcodeHash());
54 if (BlockIt == OpHashToBlocks.end()) {
58 uint64_t BestDist = std::numeric_limits<uint64_t>::max();
59 for (
auto It : BlockIt->second) {
63 if (BestBlock ==
nullptr || Dist < BestDist) {
72 using HashBlockPairType = std::pair<BlendedBlockHash, MachineBasicBlock *>;
73 std::unordered_map<uint16_t, std::vector<HashBlockPairType>> OpHashToBlocks;
77 "machine-block-match-infer",
78 "Machine Block Matching and Inference Analysis",
true,
83 "Machine Block Matching and Inference Analysis",
true,
true)
100std::optional<BasicBlockMatchingAndInference::WeightInfo>
102 auto It = ProgramWeightInfo.find(FuncName);
103 if (It == ProgramWeightInfo.end()) {
109BasicBlockMatchingAndInference::WeightInfo
110BasicBlockMatchingAndInference::initWeightInfoByMatching(
MachineFunction &MF) {
111 std::vector<MachineBasicBlock *> Blocks;
112 std::vector<BlendedBlockHash> Hashes;
115 for (
auto &
Block : MF) {
116 Blocks.push_back(&
Block);
120 Matcher.
init(Blocks, Hashes);
121 BasicBlockMatchingAndInference::WeightInfo MatchWeight;
122 const CFGProfile *
CFG = BSPR->getFunctionCFGProfile(MF.getName());
125 for (
auto &BlockCount :
CFG->NodeCounts) {
126 if (
CFG->BBHashes.count(BlockCount.first.BaseID)) {
127 auto Hash =
CFG->BBHashes.lookup(BlockCount.first.BaseID);
130 if (
Block !=
nullptr)
131 MatchWeight.BlockWeights[
Block] += BlockCount.second;
134 for (
auto &PredItem :
CFG->EdgeCounts) {
135 auto PredID = PredItem.first.BaseID;
136 if (!
CFG->BBHashes.count(PredID))
138 auto PredHash =
CFG->BBHashes.lookup(PredID);
139 MachineBasicBlock *PredBlock =
140 Matcher.
matchBlock(BlendedBlockHash(PredHash));
141 if (PredBlock ==
nullptr)
143 for (
auto &SuccItem : PredItem.second) {
144 auto SuccID = SuccItem.first.BaseID;
145 auto EdgeWeight = SuccItem.second;
146 if (
CFG->BBHashes.count(SuccID)) {
147 auto SuccHash =
CFG->BBHashes.lookup(SuccID);
148 MachineBasicBlock *SuccBlock =
149 Matcher.
matchBlock(BlendedBlockHash(SuccHash));
151 if (SuccBlock !=
nullptr)
152 MatchWeight.EdgeWeights[std::make_pair(PredBlock, SuccBlock)] +=
160void BasicBlockMatchingAndInference::generateWeightInfoByInference(
162 BasicBlockMatchingAndInference::WeightInfo &MatchWeight) {
163 BlockEdgeMap Successors;
164 for (
auto &
Block : MF) {
165 for (
auto *Succ :
Block.successors())
166 Successors[&
Block].push_back(Succ);
168 SampleProfileInference<MachineFunction> SPI(
169 MF, Successors, MatchWeight.BlockWeights, MatchWeight.EdgeWeights);
170 BlockWeightMap BlockWeights;
171 EdgeWeightMap EdgeWeights;
172 SPI.apply(BlockWeights, EdgeWeights);
173 ProgramWeightInfo.try_emplace(
174 MF.getName(), BasicBlockMatchingAndInference::WeightInfo{
175 std::move(BlockWeights), std::move(EdgeWeights)});
181 auto MatchWeight = initWeightInfoByMatching(MF);
185 if (
static_cast<float>(MatchWeight.BlockWeights.
size()) / MF.
size() <
189 generateWeightInfoByInference(MF, MatchWeight);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static cl::opt< float > PropellerInferThreshold("propeller-infer-threshold", cl::desc("Threshold for infer stale profile"), cl::init(0.6), cl::Optional)
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
The object is used to identify and match basic blocks given their hashes.
void init(const std::vector< MachineBasicBlock * > &Blocks, const std::vector< BlendedBlockHash > &Hashes)
Initialize stale matcher.
MachineBasicBlock * matchBlock(BlendedBlockHash BlendedHash) const
Find the most similar block for a given hash.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
std::optional< WeightInfo > getWeightInfo(StringRef FuncName) const
bool runOnMachineFunction(MachineFunction &F) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
BasicBlockMatchingAndInference()
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
MachineFunctionPass(char &ID)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
StringRef - Represent a constant reference to a string, i.e.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void initializeBasicBlockMatchingAndInferencePass(PassRegistry &)
LLVM_ABI MachineFunctionPass * createBasicBlockMatchingAndInferencePass()
createBasicBlockMatchingAndInferencePass - This pass enables matching and inference when using propel...
An object wrapping several components of a basic block hash.
uint16_t getOpcodeHash() const
uint64_t distance(const BlendedBlockHash &BBH) const
Compute a distance between two given blended hashes.