[llvm-branch-commits] [llvm] [BOLT] Match functions with name similarity (PR #95884)
Amir Ayupov via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jul 3 09:31:24 PDT 2024
================
@@ -342,6 +350,107 @@ bool YAMLProfileReader::mayHaveProfileData(const BinaryFunction &BF) {
return false;
}
+uint64_t YAMLProfileReader::matchWithNameSimilarity(BinaryContext &BC) {
+ uint64_t MatchedWithNameSimilarity = 0;
+ ItaniumPartialDemangler Demangler;
+
+ // Demangle and derive namespace from function name.
+ auto DemangleName = [&](std::string &FunctionName) {
+ StringRef RestoredName = NameResolver::restore(FunctionName);
+ return demangle(RestoredName);
+ };
+ auto DeriveNameSpace = [&](std::string &DemangledName) {
+ if (Demangler.partialDemangle(DemangledName.c_str()))
+ return std::string("");
+ std::vector<char> Buffer(DemangledName.begin(), DemangledName.end());
+ size_t BufferSize = Buffer.size();
+ char *NameSpace =
+ Demangler.getFunctionDeclContextName(&Buffer[0], &BufferSize);
+ return std::string(NameSpace, BufferSize);
+ };
+
+ // Maps namespaces to associated function block counts and gets profile
+ // function names and namespaces to minimize the number of BFs to process and
+ // avoid repeated name demangling/namespace derivation.
+ StringMap<std::set<uint32_t>> NamespaceToProfiledBFSizes;
+ std::vector<std::string> ProfileBFDemangledNames;
+ ProfileBFDemangledNames.reserve(YamlBP.Functions.size());
+ std::vector<std::string> ProfiledBFNamespaces;
+ ProfiledBFNamespaces.reserve(YamlBP.Functions.size());
+
+ for (auto &YamlBF : YamlBP.Functions) {
+ std::string YamlBFDemangledName = DemangleName(YamlBF.Name);
+ ProfileBFDemangledNames.push_back(YamlBFDemangledName);
+ std::string YamlBFNamespace = DeriveNameSpace(YamlBFDemangledName);
+ ProfiledBFNamespaces.push_back(YamlBFNamespace);
+ NamespaceToProfiledBFSizes[YamlBFNamespace].insert(YamlBF.NumBasicBlocks);
+ }
+
+ StringMap<std::vector<BinaryFunction *>> NamespaceToBFs;
+
+ // Maps namespaces to BFs excluding binary functions with no equal sized
+ // profiled functions belonging to the same namespace.
+ for (BinaryFunction *BF : BC.getAllBinaryFunctions()) {
+ std::string DemangledName = BF->getDemangledName();
+ std::string Namespace = DeriveNameSpace(DemangledName);
+
+ auto NamespaceToProfiledBFSizesIt =
+ NamespaceToProfiledBFSizes.find(Namespace);
+ if (NamespaceToProfiledBFSizesIt == NamespaceToProfiledBFSizes.end())
+ continue;
+ if (NamespaceToProfiledBFSizesIt->second.count(BF->size()) == 0)
+ continue;
+ auto NamespaceToBFsIt = NamespaceToBFs.find(Namespace);
+ if (NamespaceToBFsIt == NamespaceToBFs.end())
+ NamespaceToBFs[Namespace] = {BF};
+ else
+ NamespaceToBFsIt->second.push_back(BF);
+ }
+
+ // Iterates through all profiled functions and binary functions belonging to
+ // the same namespace and matches based on edit distance thresehold.
+ assert(YamlBP.Functions.size() == ProfiledBFNamespaces.size() &&
+ ProfiledBFNamespaces.size() == ProfileBFDemangledNames.size());
+ for (size_t I = 0; I < YamlBP.Functions.size(); ++I) {
+ yaml::bolt::BinaryFunctionProfile &YamlBF = YamlBP.Functions[I];
+ std::string &YamlBFNamespace = ProfiledBFNamespaces[I];
+ if (YamlBF.Used)
+ continue;
+ auto It = NamespaceToBFs.find(YamlBFNamespace);
----------------
aaupov wrote:
```suggestion
// Skip if there are no BFs in a given \p Namespace.
auto It = NamespaceToBFs.find(YamlBFNamespace);
```
https://github.com/llvm/llvm-project/pull/95884
More information about the llvm-branch-commits
mailing list