[llvm-branch-commits] [llvm] 9581e94 - Revert "[ProfileData] Implement contains in SampleProfileNameTable (NFC) (#21…"
antoine moynault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jul 31 02:45:00 PDT 2026
Author: antoine moynault
Date: 2026-07-31T11:44:55+02:00
New Revision: 9581e94cfd1301d3c6b725fcbd75167bae616199
URL: https://github.com/llvm/llvm-project/commit/9581e94cfd1301d3c6b725fcbd75167bae616199
DIFF: https://github.com/llvm/llvm-project/commit/9581e94cfd1301d3c6b725fcbd75167bae616199.diff
LOG: Revert "[ProfileData] Implement contains in SampleProfileNameTable (NFC) (#21…"
This reverts commit 86fb40ddfa3c7cd5c32d758f4b1709d01028a7db.
Added:
Modified:
llvm/include/llvm/ProfileData/SampleProfReader.h
llvm/lib/Transforms/IPO/SampleProfile.cpp
llvm/lib/Transforms/IPO/SampleProfileMatcher.cpp
llvm/unittests/ProfileData/SampleProfTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ProfileData/SampleProfReader.h b/llvm/include/llvm/ProfileData/SampleProfReader.h
index 75cc8545c37dd..0003d06e60373 100644
--- a/llvm/include/llvm/ProfileData/SampleProfReader.h
+++ b/llvm/include/llvm/ProfileData/SampleProfReader.h
@@ -226,8 +226,6 @@
#define LLVM_PROFILEDATA_SAMPLEPROFREADER_H
#include "llvm/ADT/Eytzinger.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
@@ -397,37 +395,9 @@ class SampleProfileNameTable {
virtual size_t size() const = 0;
bool empty() const { return size() == 0; }
virtual FunctionId operator[](size_t Idx) const = 0;
- virtual bool contains(StringRef Key) const {
- return contains(FunctionId(Key).getHashCode());
- }
- virtual bool contains(uint64_t GUID) const {
- return getOrCreateSet(GUIDSet, *this, GetFunctionIdHash).contains(GUID);
- }
iterator begin() const { return iterator(this, 0); }
iterator end() const { return iterator(this, size()); }
-
-protected:
- mutable std::optional<DenseSet<uint64_t>> GUIDSet;
-
- static constexpr auto GetFunctionIdHash = [](FunctionId F) {
- return F.getHashCode();
- };
- static constexpr auto GetFunctionIdString = [](FunctionId F) {
- return F.stringRef();
- };
-
- template <typename SetT, typename RangeT, typename ProjT = llvm::identity>
- static const SetT &getOrCreateSet(std::optional<SetT> &Set,
- const RangeT &Range, ProjT Proj = ProjT()) {
- if (!Set) {
- Set.emplace();
- Set->reserve(Range.size());
- for (const auto &Item : Range)
- Set->insert(Proj(Item));
- }
- return *Set;
- }
};
class LazySampleProfileNameTable final : public SampleProfileNameTable {
@@ -446,17 +416,10 @@ class LazySampleProfileNameTable final : public SampleProfileNameTable {
return FunctionId(endian::read<uint64_t, unaligned>(
Start + Idx * sizeof(uint64_t), endianness::little));
}
-
- bool contains(uint64_t GUID) const override {
- ArrayRef<support::ulittle64_t> Table(
- reinterpret_cast<const support::ulittle64_t *>(Start), Size);
- return getOrCreateSet(GUIDSet, Table).contains(GUID);
- }
};
class StringSampleProfileNameTable final : public SampleProfileNameTable {
std::vector<FunctionId> Vec;
- mutable std::optional<DenseSet<StringRef>> NameSet;
public:
explicit StringSampleProfileNameTable(std::vector<FunctionId> &&Vec)
@@ -470,10 +433,6 @@ class StringSampleProfileNameTable final : public SampleProfileNameTable {
assert(Idx < Vec.size() && "Index out of bounds");
return Vec[Idx];
}
-
- bool contains(StringRef Key) const override {
- return getOrCreateSet(NameSet, Vec, GetFunctionIdString).contains(Key);
- }
};
class MD5SampleProfileNameTable final : public SampleProfileNameTable {
@@ -495,29 +454,18 @@ class MD5SampleProfileNameTable final : public SampleProfileNameTable {
class EytzingerSampleProfileNameTable final : public SampleProfileNameTable {
ArrayRef<support::ulittle64_t> Array;
- std::array<EytzingerTableSpan<support::ulittle64_t>,
- static_cast<size_t>(EytzingerSpan::NumSpans)>
- Spans;
public:
EytzingerSampleProfileNameTable(const support::ulittle64_t *Data,
uint64_t NumCS, uint64_t NumFlat,
uint64_t NumInlinees)
- : Array(Data, NumCS + NumFlat + NumInlinees),
- Spans{{{Data, NumCS},
- {Data + NumCS, NumFlat},
- {Data + NumCS + NumFlat, NumInlinees}}} {}
+ : Array(Data, NumCS + NumFlat + NumInlinees) {}
size_t size() const override { return Array.size(); }
FunctionId operator[](size_t Idx) const override {
return FunctionId(Array[Idx]);
}
-
- bool contains(uint64_t GUID) const override {
- return llvm::any_of(Spans,
- [&](const auto &Span) { return Span.contains(GUID); });
- }
};
class SampleProfileReader {
@@ -682,8 +630,6 @@ class SampleProfileReader {
SampleProfileNameTable::iterator()};
}
virtual bool dumpSectionInfo(raw_ostream &OS = dbgs()) { return false; };
- virtual bool contains(StringRef Key) const { return false; }
- virtual bool contains(uint64_t GUID) const { return false; }
/// Return whether names in the profile are all MD5 numbers.
bool useMD5() const { return ProfileIsMD5; }
@@ -847,16 +793,6 @@ class LLVM_ABI SampleProfileReaderBinary : public SampleProfileReader {
return {NameTable->begin(), NameTable->end()};
}
- bool contains(StringRef Key) const override {
- assert(NameTable && "NameTable should be populated before querying");
- return NameTable->contains(Key);
- }
-
- bool contains(uint64_t GUID) const override {
- assert(NameTable && "NameTable should be populated before querying");
- return NameTable->contains(GUID);
- }
-
protected:
/// Read a numeric value of type T from the profile.
///
@@ -1255,6 +1191,23 @@ class LLVM_ABI SampleProfileReaderGCC : public SampleProfileReader {
static const uint32_t GCOVTagAFDOFunction = 0xac000000;
};
+/// A helper class that wraps a local set of string names from NameTable.
+class SampleProfileNameSet {
+ const SampleProfileReader &Reader;
+ StringSet<> NamesInProfile;
+
+public:
+ explicit SampleProfileNameSet(const SampleProfileReader &R) : Reader(R) {
+ for (FunctionId Name : Reader.getNameTable())
+ NamesInProfile.insert(Name.stringRef());
+ }
+
+ /// Check if a canonical function name exists in the profile name table.
+ bool contains(StringRef CanonName) const {
+ return NamesInProfile.contains(CanonName);
+ }
+};
+
} // end namespace sampleprof
} // end namespace llvm
diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp
index cb11372183bc8..4234e05430dbf 100644
--- a/llvm/lib/Transforms/IPO/SampleProfile.cpp
+++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp
@@ -573,6 +573,15 @@ class SampleProfileLoader final : public SampleProfileLoaderBaseImpl<Function> {
// all the function symbols defined or declared in current module.
DenseMap<uint64_t, StringRef> GUIDToFuncNameMap;
+ // All the Names used in FunctionSamples including outline function
+ // names, inline instance names and call target names.
+ StringSet<> NamesInProfile;
+ // MD5 version of NamesInProfile. Either NamesInProfile or GUIDsInProfile is
+ // populated, depends on whether the profile uses MD5. Because the name table
+ // generally contains several magnitude more entries than the number of
+ // functions, we do not want to convert all names from one form to another.
+ llvm::DenseSet<uint64_t> GUIDsInProfile;
+
// For symbol in profile symbol list, whether to regard their profiles
// to be accurate. It is mainly decided by existance of profile symbol
// list and -profile-accurate-for-symsinlist flag, but it can be
@@ -1977,8 +1986,19 @@ bool SampleProfileLoader::doInitialization(Module &M,
// While profile-sample-accurate is on, ignore symbol list.
ProfAccForSymsInList =
ProfileAccurateForSymsInList && PSL && !ProfileSampleAccurate;
- if (ProfAccForSymsInList)
+ if (ProfAccForSymsInList) {
+ NamesInProfile.clear();
+ GUIDsInProfile.clear();
+ auto NameTable = Reader->getNameTable();
+ if (FunctionSamples::UseMD5) {
+ for (FunctionId Name : NameTable)
+ GUIDsInProfile.insert(Name.getHashCode());
+ } else {
+ for (FunctionId Name : NameTable)
+ NamesInProfile.insert(Name.stringRef());
+ }
CoverageTracker.setProfAccForSymsInList(true);
+ }
if (FAM && !ProfileInlineReplayFile.empty()) {
ExternalInlineAdvisor = getReplayInlineAdvisor(
@@ -2260,10 +2280,10 @@ bool SampleProfileLoader::runOnFunction(Function &F,
// but not cold accumulatively...), so the outline function showing up as
// cold in sampled binary will actually not be cold after current build.
StringRef CanonName = FunctionSamples::getCanonicalFnName(F);
- if (FunctionSamples::UseMD5
- ? Reader->contains(
- Function::getGUIDAssumingExternalLinkage(CanonName))
- : Reader->contains(CanonName))
+ if ((FunctionSamples::UseMD5 &&
+ GUIDsInProfile.count(
+ Function::getGUIDAssumingExternalLinkage(CanonName))) ||
+ (!FunctionSamples::UseMD5 && NamesInProfile.count(CanonName)))
initialEntryCount = -1;
}
diff --git a/llvm/lib/Transforms/IPO/SampleProfileMatcher.cpp b/llvm/lib/Transforms/IPO/SampleProfileMatcher.cpp
index ffd6a265dafc8..d3aec9d7c363c 100644
--- a/llvm/lib/Transforms/IPO/SampleProfileMatcher.cpp
+++ b/llvm/lib/Transforms/IPO/SampleProfileMatcher.cpp
@@ -771,6 +771,7 @@ void SampleProfileMatcher::findFunctionsWithoutProfile() {
// TODO: Support MD5 profile.
if (FunctionSamples::UseMD5)
return;
+ SampleProfileNameSet NamesInProfile(Reader);
for (auto &F : M) {
// Skip declarations, as even if the function can be matched, we have
@@ -786,7 +787,7 @@ void SampleProfileMatcher::findFunctionsWithoutProfile() {
// For extended binary, functions fully inlined may not be loaded in the
// top-level profile, so check the NameTable which has the all symbol names
// in profile.
- if (Reader.contains(CanonFName))
+ if (NamesInProfile.contains(CanonFName))
continue;
// For extended binary, non-profiled function symbols are in the profile
diff --git a/llvm/unittests/ProfileData/SampleProfTest.cpp b/llvm/unittests/ProfileData/SampleProfTest.cpp
index d35427478e129..50fe3a1951577 100644
--- a/llvm/unittests/ProfileData/SampleProfTest.cpp
+++ b/llvm/unittests/ProfileData/SampleProfTest.cpp
@@ -456,17 +456,6 @@ struct SampleProfTest : ::testing::Test {
if (Samples != nullptr)
Esamples = Samples->getTotalSamples();
ASSERT_EQ(I->getValue(), Esamples);
-
- if (Format == SampleProfileFormat::SPF_Ext_Binary) {
- ASSERT_TRUE(Reader->contains(I->getKey()));
- ASSERT_TRUE(Reader->contains(FunctionId(I->getKey()).getHashCode()));
- }
- }
-
- if (Format == SampleProfileFormat::SPF_Ext_Binary) {
- StringRef FakeSymbol = "non_existent_symbol_for_test";
- ASSERT_FALSE(Reader->contains(FakeSymbol));
- ASSERT_FALSE(Reader->contains(FunctionId(FakeSymbol).getHashCode()));
}
}
};
More information about the llvm-branch-commits
mailing list