================ @@ -193,18 +193,43 @@ class StaleMatcher { public: /// Initialize stale matcher. void init(const std::vector<FlowBlock *> &Blocks, - const std::vector<BlendedBlockHash> &Hashes) { + const std::vector<BlendedBlockHash> &Hashes, + const std::vector<uint64_t> &CallHashes) { assert(Blocks.size() == Hashes.size() && + Hashes.size() == CallHashes.size() && "incorrect matcher initialization"); for (size_t I = 0; I < Blocks.size(); I++) { FlowBlock *Block = Blocks[I]; uint16_t OpHash = Hashes[I].OpcodeHash; OpHashToBlocks[OpHash].push_back(std::make_pair(Hashes[I], Block)); + if (CallHashes[I]) + CallHashToBlocks[CallHashes[I]].push_back( + std::make_pair(Hashes[I], Block)); } } /// Find the most similar block for a given hash. - const FlowBlock *matchBlock(BlendedBlockHash BlendedHash) const { + const FlowBlock *matchBlock(BlendedBlockHash &BlendedHash, + uint64_t &CallHash) const { + const FlowBlock *BestBlock = matchWithOpcodes(BlendedHash); + return BestBlock ? BestBlock : matchWithCalls(BlendedHash, CallHash); + } + + /// Returns true if the two basic blocks (in the binary and in the profile) + /// corresponding to the given hashes are matched to each other with a high + /// confidence. + static bool isHighConfidenceMatch(BlendedBlockHash Hash1, + BlendedBlockHash Hash2) { + return Hash1.InstrHash == Hash2.InstrHash; + } + +private: + using HashBlockPairType = std::pair<BlendedBlockHash, FlowBlock *>; + std::unordered_map<uint16_t, std::vector<HashBlockPairType>> OpHashToBlocks; + std::unordered_map<uint64_t, std::vector<HashBlockPairType>> CallHashToBlocks; + + // Uses OpcodeHash to find the most similar block for a given hash. + const FlowBlock *matchWithOpcodes(BlendedBlockHash &BlendedHash) const { ---------------- aaupov wrote:
ditto 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