aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmir Ayupov <aaupov@fb.com>2024-05-30 17:32:20 -0700
committerGitHub <noreply@github.com>2024-05-30 17:32:20 -0700
commit31113a210b22252ef461192d6593a0b79b099ab1 (patch)
treeb07a58f8c3f663ba9a9419eb5c08e944b4e18c16
parent2d75b20f9aea720615c074f7065ff77851b128a1 (diff)
downloadllvm-users/aaupov/spr/main.bolt-detect-warm-split-functions-as-cold-fragments.zip
llvm-users/aaupov/spr/main.bolt-detect-warm-split-functions-as-cold-fragments.tar.gz
llvm-users/aaupov/spr/main.bolt-detect-warm-split-functions-as-cold-fragments.tar.bz2
[BOLT] Detect .warm split functions as cold fragments (#93759)users/aaupov/spr/main.bolt-detect-warm-split-functions-as-cold-fragments
-rw-r--r--bolt/include/bolt/Rewrite/RewriteInstance.h4
-rw-r--r--bolt/lib/Rewrite/RewriteInstance.cpp12
-rw-r--r--bolt/test/X86/register-fragments-bolt-symbols.s14
3 files changed, 21 insertions, 9 deletions
diff --git a/bolt/include/bolt/Rewrite/RewriteInstance.h b/bolt/include/bolt/Rewrite/RewriteInstance.h
index 64113bd..a55516d 100644
--- a/bolt/include/bolt/Rewrite/RewriteInstance.h
+++ b/bolt/include/bolt/Rewrite/RewriteInstance.h
@@ -21,6 +21,7 @@
#include "llvm/Object/ELFObjectFile.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Support/Error.h"
+#include "llvm/Support/Regex.h"
#include <map>
#include <set>
#include <unordered_map>
@@ -596,6 +597,9 @@ private:
NameResolver NR;
+ // Regex object matching split function names.
+ const Regex FunctionFragmentTemplate{"(.*)\\.(cold|warm)(\\.[0-9]+)?"};
+
friend class RewriteInstanceDiff;
};
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index 4b4913d..e452e95 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -55,7 +55,6 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/Regex.h"
#include "llvm/Support/Timer.h"
#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Support/raw_ostream.h"
@@ -945,9 +944,6 @@ void RewriteInstance::discoverFileObjects() {
BinaryFunction *PreviousFunction = nullptr;
unsigned AnonymousId = 0;
- // Regex object for matching cold fragments.
- const Regex ColdFragment(".*\\.cold(\\.[0-9]+)?");
-
const auto SortedSymbolsEnd =
LastSymbol == SortedSymbols.end() ? LastSymbol : std::next(LastSymbol);
for (auto Iter = SortedSymbols.begin(); Iter != SortedSymbolsEnd; ++Iter) {
@@ -1229,7 +1225,7 @@ void RewriteInstance::discoverFileObjects() {
}
// Check if it's a cold function fragment.
- if (ColdFragment.match(SymName)) {
+ if (FunctionFragmentTemplate.match(SymName)) {
static bool PrintedWarning = false;
if (!PrintedWarning) {
PrintedWarning = true;
@@ -1460,10 +1456,10 @@ void RewriteInstance::registerFragments() {
for (StringRef Name : Function.getNames()) {
StringRef BaseName = NR.restore(Name);
const bool IsGlobal = BaseName == Name;
- const size_t ColdSuffixPos = BaseName.find(".cold");
- if (ColdSuffixPos == StringRef::npos)
+ SmallVector<StringRef> Matches;
+ if (!FunctionFragmentTemplate.match(BaseName, &Matches))
continue;
- StringRef ParentName = BaseName.substr(0, ColdSuffixPos);
+ StringRef ParentName = Matches[1];
const BinaryData *BD = BC->getBinaryDataByName(ParentName);
const uint64_t NumPossibleLocalParents =
NR.getUniquifiedNameCount(ParentName);
diff --git a/bolt/test/X86/register-fragments-bolt-symbols.s b/bolt/test/X86/register-fragments-bolt-symbols.s
index 90c402b..d4f39b7 100644
--- a/bolt/test/X86/register-fragments-bolt-symbols.s
+++ b/bolt/test/X86/register-fragments-bolt-symbols.s
@@ -3,8 +3,20 @@
# RUN: llvm-mc --filetype=obj --triple x86_64-unknown-unknown %S/cdsplit-symbol-names.s -o %t.main.o
# RUN: llvm-mc --filetype=obj --triple x86_64-unknown-unknown %s -o %t.chain.o
# RUN: link_fdata %S/cdsplit-symbol-names.s %t.main.o %t.fdata
-# RUN: sed -i 's|chain|chain/2|g' %t.fdata
# RUN: llvm-strip --strip-unneeded %t.main.o
+
+## Check warm fragment name matching (produced by cdsplit)
+# RUN: %clang %cflags %t.main.o -o %t.warm.exe -Wl,-q
+# RUN: llvm-bolt %t.warm.exe -o %t.warm.bolt --split-functions --split-strategy=cdsplit \
+# RUN: --call-scale=2 --data=%t.fdata --reorder-blocks=ext-tsp --enable-bat
+# RUN: link_fdata %s %t.warm.bolt %t.preagg.warm PREAGGWARM
+# PREAGGWARM: B X:0 #chain.warm# 1 0
+# RUN: perf2bolt %t.warm.bolt -p %t.preagg.warm --pa -o %t.warm.fdata -w %t.warm.yaml \
+# RUN: -v=1 | FileCheck %s --check-prefix=CHECK-BOLT-WARM
+
+# CHECK-BOLT-WARM: marking chain.warm/1(*2) as a fragment of chain
+
+# RUN: sed -i 's|chain|chain/2|g' %t.fdata
# RUN: llvm-objcopy --localize-symbol=chain %t.main.o
# RUN: %clang %cflags %t.chain.o %t.main.o -o %t.exe -Wl,-q
# RUN: llvm-bolt %t.exe -o %t.bolt --split-functions --split-strategy=randomN \