================ @@ -414,31 +449,59 @@ createFlowFunction(const BinaryFunction::BasicBlockOrderType &BlockOrder) { /// matched to a jump in the binary, the count is recorded in CFG. size_t matchWeightsByHashes( BinaryContext &BC, const BinaryFunction::BasicBlockOrderType &BlockOrder, - const yaml::bolt::BinaryFunctionProfile &YamlBF, FlowFunction &Func) { + const yaml::bolt::BinaryFunctionProfile &YamlBF, FlowFunction &Func, + HashFunction HashFunction, + const DenseMap<uint32_t, std::string *> &IdToFunctionName) { + assert(Func.Blocks.size() == BlockOrder.size() + 2); + std::vector<uint64_t> CallHashes; std::vector<FlowBlock *> Blocks; std::vector<BlendedBlockHash> BlendedHashes; for (uint64_t I = 0; I < BlockOrder.size(); I++) { const BinaryBasicBlock *BB = BlockOrder[I]; assert(BB->getHash() != 0 && "empty hash of BinaryBasicBlock"); + + std::string CallHashStr = hashBlockCalls(BC, *BB); + if (CallHashStr.empty()) { + CallHashes.push_back(0); + } else if (HashFunction == HashFunction::StdHash) { + CallHashes.push_back(std::hash<std::string>{}(CallHashStr)); + } else if (HashFunction == HashFunction::XXH3) { + CallHashes.push_back(llvm::xxh3_64bits(CallHashStr)); + } else { + llvm_unreachable("Unhandled HashFunction"); + } + Blocks.push_back(&Func.Blocks[I + 1]); BlendedBlockHash BlendedHash(BB->getHash()); BlendedHashes.push_back(BlendedHash); LLVM_DEBUG(dbgs() << "BB with index " << I << " has hash = " << Twine::utohexstr(BB->getHash()) << "\n"); } StaleMatcher Matcher; - Matcher.init(Blocks, BlendedHashes); + Matcher.init(Blocks, BlendedHashes, CallHashes); // Index in yaml profile => corresponding (matched) block DenseMap<uint64_t, const FlowBlock *> MatchedBlocks; // Match blocks from the profile to the blocks in CFG for (const yaml::bolt::BinaryBasicBlockProfile &YamlBB : YamlBF.Blocks) { assert(YamlBB.Hash != 0 && "empty hash of BinaryBasicBlockProfile"); BlendedBlockHash YamlHash(YamlBB.Hash); - const FlowBlock *MatchedBlock = Matcher.matchBlock(YamlHash); - // Always match the entry block. + + const FlowBlock *MatchedBlock = nullptr; + std::string CallHashStr = hashBlockCalls(IdToFunctionName, YamlBB); + uint64_t CallHash = 0; + if (CallHashStr.empty()) { // Noop + } else if (HashFunction == HashFunction::StdHash) { + CallHash = std::hash<std::string>{}(CallHashStr); + } else if (HashFunction == HashFunction::XXH3) { + CallHash = llvm::xxh3_64bits(CallHashStr); + } else { + llvm_unreachable("Unhandled HashFunction"); ---------------- dcci wrote:
you might want to add a more informative message. https://github.com/llvm/llvm-project/pull/96596 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits