From 887e2705800396e09ab7462817043b727291666f Mon Sep 17 00:00:00 2001 From: mingmingl Date: Sat, 13 Sep 2025 23:16:50 -0700 Subject: [PATCH 1/7] [NFCI][Globals]Add GlobalObjects::updateSectionPrefix and change setSectionPrefix to handle empty strings --- llvm/include/llvm/IR/GlobalObject.h | 7 ++- llvm/lib/IR/Globals.cpp | 17 ++++++ llvm/unittests/IR/CMakeLists.txt | 1 + llvm/unittests/IR/GlobalObjectTest.cpp | 81 ++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 llvm/unittests/IR/GlobalObjectTest.cpp diff --git a/llvm/include/llvm/IR/GlobalObject.h b/llvm/include/llvm/IR/GlobalObject.h index 08a02b42bdc14..740d7fb9bc41f 100644 --- a/llvm/include/llvm/IR/GlobalObject.h +++ b/llvm/include/llvm/IR/GlobalObject.h @@ -121,9 +121,14 @@ class GlobalObject : public GlobalValue { /// appropriate default object file section. LLVM_ABI void setSection(StringRef S); - /// Set the section prefix for this global object. + /// Set the section prefix for this global object. If \p Prefix is empty, + /// the section prefix metadata will be cleared if it exists. LLVM_ABI void setSectionPrefix(StringRef Prefix); + /// If \p Prefix is different from existing prefix, update section prefix. + /// Returns true if an update happens and false otherwise. + LLVM_ABI bool updateSectionPrefix(StringRef Prefix); + /// Get the section prefix for this global object. LLVM_ABI std::optional getSectionPrefix() const; diff --git a/llvm/lib/IR/Globals.cpp b/llvm/lib/IR/Globals.cpp index 11d33e262fecb..0731fcbde106a 100644 --- a/llvm/lib/IR/Globals.cpp +++ b/llvm/lib/IR/Globals.cpp @@ -289,11 +289,28 @@ void GlobalObject::setSection(StringRef S) { } void GlobalObject::setSectionPrefix(StringRef Prefix) { + if (Prefix.empty()) { + setMetadata(LLVMContext::MD_section_prefix, nullptr); + return; + } MDBuilder MDB(getContext()); setMetadata(LLVMContext::MD_section_prefix, MDB.createGlobalObjectSectionPrefix(Prefix)); } +bool GlobalObject::updateSectionPrefix(StringRef Prefix) { + auto MD = getMetadata(LLVMContext::MD_section_prefix); + StringRef ExistingPrefix; // Empty by default. + if (MD != nullptr) + ExistingPrefix = cast(MD->getOperand(1))->getString(); + + if (ExistingPrefix != Prefix) { + setSectionPrefix(Prefix); + return true; + } + return false; +} + std::optional GlobalObject::getSectionPrefix() const { if (MDNode *MD = getMetadata(LLVMContext::MD_section_prefix)) { [[maybe_unused]] StringRef MDName = diff --git a/llvm/unittests/IR/CMakeLists.txt b/llvm/unittests/IR/CMakeLists.txt index 8b7bd3997ea27..d62ce66ef9d34 100644 --- a/llvm/unittests/IR/CMakeLists.txt +++ b/llvm/unittests/IR/CMakeLists.txt @@ -28,6 +28,7 @@ add_llvm_unittest(IRTests DominatorTreeBatchUpdatesTest.cpp DroppedVariableStatsIRTest.cpp FunctionTest.cpp + GlobalObjectTest.cpp PassBuilderCallbacksTest.cpp IRBuilderTest.cpp InstructionsTest.cpp diff --git a/llvm/unittests/IR/GlobalObjectTest.cpp b/llvm/unittests/IR/GlobalObjectTest.cpp new file mode 100644 index 0000000000000..0732b6f6691f1 --- /dev/null +++ b/llvm/unittests/IR/GlobalObjectTest.cpp @@ -0,0 +1,81 @@ +//===- GlobalObjectTest.cpp - Global object unit tests --------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/IR/GlobalObject.h" +#include "llvm-c/Core.h" +#include "llvm/AsmParser/Parser.h" +#include "llvm/IR/Module.h" +#include "llvm/Support/SourceMgr.h" +#include "gtest/gtest.h" +#include "gmock/gmock.h" +using namespace llvm; +namespace { + +using testing::Eq; +using testing::Optional; +using testing::StrEq; + +static std::unique_ptr parseIR(LLVMContext &C, const char *IR) { + SMDiagnostic Err; + std::unique_ptr Mod = parseAssemblyString(IR, Err, C); + if (!Mod) + Err.print("GlobalObjectTests", errs()); + return Mod; +} + +static LLVMContext C; +static std::unique_ptr M; + +class GlobalObjectTest : public testing::Test { +public: +static void SetUpTestSuite() { + + M = parseIR(C, R"( +@foo = global i32 3, !section_prefix !0 +@bar = global i32 0 + +!0 = !{!"section_prefix", !"hot"} +)"); + + } + +}; + +TEST_F(GlobalObjectTest, SectionPrefix) { + GlobalVariable* Foo = M->getGlobalVariable("foo"); + + // Initial section prefix is hot. + ASSERT_NE(Foo, nullptr); + ASSERT_THAT(Foo->getSectionPrefix(), Optional(StrEq("hot"))); + + // No actual update. + EXPECT_FALSE(Foo->updateSectionPrefix("hot")); + + // Update prefix from hot to unlikely. + Foo->setSectionPrefix("unlikely"); + EXPECT_THAT(Foo->getSectionPrefix(), Optional(StrEq("unlikely"))); + + // Update prefix to empty is the same as clear. + Foo->setSectionPrefix(""); + EXPECT_THAT(Foo->getSectionPrefix(), Eq(std::nullopt)); + + GlobalVariable* Bar = M->getGlobalVariable("bar"); + + // Initial section prefix is empty. + ASSERT_NE(Bar, nullptr); + ASSERT_THAT(Bar->getSectionPrefix(), Eq(std::nullopt)); + + // No actual update. + EXPECT_FALSE(Bar->updateSectionPrefix("")); + + // Update from empty to hot. + EXPECT_TRUE(Bar->updateSectionPrefix("hot")); + EXPECT_THAT(Bar->getSectionPrefix(), Optional(StrEq("hot"))); +} + +} // namespace From 314696a7adc95e47f4937e6a218b081e29b1d709 Mon Sep 17 00:00:00 2001 From: mingmingl Date: Sat, 13 Sep 2025 23:19:47 -0700 Subject: [PATCH 2/7] run clang format --- llvm/unittests/IR/GlobalObjectTest.cpp | 57 ++++++++++++-------------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/llvm/unittests/IR/GlobalObjectTest.cpp b/llvm/unittests/IR/GlobalObjectTest.cpp index 0732b6f6691f1..26949ae3a39fa 100644 --- a/llvm/unittests/IR/GlobalObjectTest.cpp +++ b/llvm/unittests/IR/GlobalObjectTest.cpp @@ -11,11 +11,10 @@ #include "llvm/AsmParser/Parser.h" #include "llvm/IR/Module.h" #include "llvm/Support/SourceMgr.h" -#include "gtest/gtest.h" #include "gmock/gmock.h" +#include "gtest/gtest.h" using namespace llvm; namespace { - using testing::Eq; using testing::Optional; using testing::StrEq; @@ -33,49 +32,45 @@ static std::unique_ptr M; class GlobalObjectTest : public testing::Test { public: -static void SetUpTestSuite() { - + static void SetUpTestSuite() { M = parseIR(C, R"( @foo = global i32 3, !section_prefix !0 @bar = global i32 0 !0 = !{!"section_prefix", !"hot"} )"); - } - }; TEST_F(GlobalObjectTest, SectionPrefix) { - GlobalVariable* Foo = M->getGlobalVariable("foo"); - - // Initial section prefix is hot. - ASSERT_NE(Foo, nullptr); - ASSERT_THAT(Foo->getSectionPrefix(), Optional(StrEq("hot"))); + GlobalVariable *Foo = M->getGlobalVariable("foo"); - // No actual update. - EXPECT_FALSE(Foo->updateSectionPrefix("hot")); + // Initial section prefix is hot. + ASSERT_NE(Foo, nullptr); + ASSERT_THAT(Foo->getSectionPrefix(), Optional(StrEq("hot"))); - // Update prefix from hot to unlikely. - Foo->setSectionPrefix("unlikely"); - EXPECT_THAT(Foo->getSectionPrefix(), Optional(StrEq("unlikely"))); - - // Update prefix to empty is the same as clear. - Foo->setSectionPrefix(""); - EXPECT_THAT(Foo->getSectionPrefix(), Eq(std::nullopt)); + // No actual update. + EXPECT_FALSE(Foo->updateSectionPrefix("hot")); - GlobalVariable* Bar = M->getGlobalVariable("bar"); + // Update prefix from hot to unlikely. + Foo->setSectionPrefix("unlikely"); + EXPECT_THAT(Foo->getSectionPrefix(), Optional(StrEq("unlikely"))); - // Initial section prefix is empty. - ASSERT_NE(Bar, nullptr); - ASSERT_THAT(Bar->getSectionPrefix(), Eq(std::nullopt)); - - // No actual update. - EXPECT_FALSE(Bar->updateSectionPrefix("")); + // Update prefix to empty is the same as clear. + Foo->setSectionPrefix(""); + EXPECT_THAT(Foo->getSectionPrefix(), Eq(std::nullopt)); - // Update from empty to hot. - EXPECT_TRUE(Bar->updateSectionPrefix("hot")); - EXPECT_THAT(Bar->getSectionPrefix(), Optional(StrEq("hot"))); -} + GlobalVariable *Bar = M->getGlobalVariable("bar"); + + // Initial section prefix is empty. + ASSERT_NE(Bar, nullptr); + ASSERT_THAT(Bar->getSectionPrefix(), Eq(std::nullopt)); + // No actual update. + EXPECT_FALSE(Bar->updateSectionPrefix("")); + + // Update from empty to hot. + EXPECT_TRUE(Bar->updateSectionPrefix("hot")); + EXPECT_THAT(Bar->getSectionPrefix(), Optional(StrEq("hot"))); +} } // namespace From b894f774a874f822598e02faf8a04a1d985d9c63 Mon Sep 17 00:00:00 2001 From: mingmingl Date: Mon, 15 Sep 2025 15:52:09 -0700 Subject: [PATCH 3/7] incorporate review feedback --- llvm/include/llvm/IR/GlobalObject.h | 3 ++- llvm/lib/IR/Globals.cpp | 7 +++---- llvm/unittests/IR/GlobalObjectTest.cpp | 11 ++++++++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/llvm/include/llvm/IR/GlobalObject.h b/llvm/include/llvm/IR/GlobalObject.h index 740d7fb9bc41f..99d20c5520033 100644 --- a/llvm/include/llvm/IR/GlobalObject.h +++ b/llvm/include/llvm/IR/GlobalObject.h @@ -125,7 +125,8 @@ class GlobalObject : public GlobalValue { /// the section prefix metadata will be cleared if it exists. LLVM_ABI void setSectionPrefix(StringRef Prefix); - /// If \p Prefix is different from existing prefix, update section prefix. + /// If \p Prefix is different from existing prefix, update section prefix; + /// if \p Prefix is empty, an update clears the existing metadata. /// Returns true if an update happens and false otherwise. LLVM_ABI bool updateSectionPrefix(StringRef Prefix); diff --git a/llvm/lib/IR/Globals.cpp b/llvm/lib/IR/Globals.cpp index 0731fcbde106a..fad8d6083a4ae 100644 --- a/llvm/lib/IR/Globals.cpp +++ b/llvm/lib/IR/Globals.cpp @@ -299,10 +299,9 @@ void GlobalObject::setSectionPrefix(StringRef Prefix) { } bool GlobalObject::updateSectionPrefix(StringRef Prefix) { - auto MD = getMetadata(LLVMContext::MD_section_prefix); - StringRef ExistingPrefix; // Empty by default. - if (MD != nullptr) - ExistingPrefix = cast(MD->getOperand(1))->getString(); + StringRef ExistingPrefix; + if (std::optional MaybePrefix = getSectionPrefix()) + ExistingPrefix = *MaybePrefix; if (ExistingPrefix != Prefix) { setSectionPrefix(Prefix); diff --git a/llvm/unittests/IR/GlobalObjectTest.cpp b/llvm/unittests/IR/GlobalObjectTest.cpp index 26949ae3a39fa..52984bf09e34e 100644 --- a/llvm/unittests/IR/GlobalObjectTest.cpp +++ b/llvm/unittests/IR/GlobalObjectTest.cpp @@ -7,7 +7,6 @@ //===----------------------------------------------------------------------===// #include "llvm/IR/GlobalObject.h" -#include "llvm-c/Core.h" #include "llvm/AsmParser/Parser.h" #include "llvm/IR/Module.h" #include "llvm/Support/SourceMgr.h" @@ -56,8 +55,9 @@ TEST_F(GlobalObjectTest, SectionPrefix) { Foo->setSectionPrefix("unlikely"); EXPECT_THAT(Foo->getSectionPrefix(), Optional(StrEq("unlikely"))); - // Update prefix to empty is the same as clear. + // Set prefix to empty is the same as clear. Foo->setSectionPrefix(""); + // Test that section prefix is cleared. EXPECT_THAT(Foo->getSectionPrefix(), Eq(std::nullopt)); GlobalVariable *Bar = M->getGlobalVariable("bar"); @@ -66,11 +66,16 @@ TEST_F(GlobalObjectTest, SectionPrefix) { ASSERT_NE(Bar, nullptr); ASSERT_THAT(Bar->getSectionPrefix(), Eq(std::nullopt)); - // No actual update. + // Teset that update method returns false since Bar doesn't have prefix + // metadata. EXPECT_FALSE(Bar->updateSectionPrefix("")); // Update from empty to hot. EXPECT_TRUE(Bar->updateSectionPrefix("hot")); EXPECT_THAT(Bar->getSectionPrefix(), Optional(StrEq("hot"))); + + // Teset that update method returns true and section prefix is cleared. + EXPECT_TRUE(Bar->updateSectionPrefix("")); + EXPECT_THAT(Bar->getSectionPrefix(), Eq(std::nullopt)); } } // namespace From eb55b818e00fc46fbcd393e593cf6c2ccf88cee6 Mon Sep 17 00:00:00 2001 From: mingmingl Date: Mon, 15 Sep 2025 20:18:49 -0700 Subject: [PATCH 4/7] fix typo --- llvm/unittests/IR/GlobalObjectTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/unittests/IR/GlobalObjectTest.cpp b/llvm/unittests/IR/GlobalObjectTest.cpp index 52984bf09e34e..d6eab060cddff 100644 --- a/llvm/unittests/IR/GlobalObjectTest.cpp +++ b/llvm/unittests/IR/GlobalObjectTest.cpp @@ -66,7 +66,7 @@ TEST_F(GlobalObjectTest, SectionPrefix) { ASSERT_NE(Bar, nullptr); ASSERT_THAT(Bar->getSectionPrefix(), Eq(std::nullopt)); - // Teset that update method returns false since Bar doesn't have prefix + // Test that update method returns false since Bar doesn't have prefix // metadata. EXPECT_FALSE(Bar->updateSectionPrefix("")); From 1df1bf539fc845adfa4b0d0433f7db658bc7d8fc Mon Sep 17 00:00:00 2001 From: mingmingl Date: Tue, 16 Sep 2025 10:54:28 -0700 Subject: [PATCH 5/7] merge update inside set, and update callsites to make use of return value --- llvm/include/llvm/IR/GlobalObject.h | 12 ++++------ llvm/lib/CodeGen/CodeGenPrepare.cpp | 8 +++---- llvm/lib/CodeGen/StaticDataAnnotator.cpp | 3 +-- llvm/lib/IR/Globals.cpp | 24 ++++++++----------- .../Transforms/Instrumentation/MemProfUse.cpp | 5 ++-- llvm/unittests/IR/GlobalObjectTest.cpp | 19 +++++++-------- 6 files changed, 30 insertions(+), 41 deletions(-) diff --git a/llvm/include/llvm/IR/GlobalObject.h b/llvm/include/llvm/IR/GlobalObject.h index 99d20c5520033..3a83f1b428d09 100644 --- a/llvm/include/llvm/IR/GlobalObject.h +++ b/llvm/include/llvm/IR/GlobalObject.h @@ -121,14 +121,10 @@ class GlobalObject : public GlobalValue { /// appropriate default object file section. LLVM_ABI void setSection(StringRef S); - /// Set the section prefix for this global object. If \p Prefix is empty, - /// the section prefix metadata will be cleared if it exists. - LLVM_ABI void setSectionPrefix(StringRef Prefix); - - /// If \p Prefix is different from existing prefix, update section prefix; - /// if \p Prefix is empty, an update clears the existing metadata. - /// Returns true if an update happens and false otherwise. - LLVM_ABI bool updateSectionPrefix(StringRef Prefix); + /// If existing prefix is different from \p Prefix is different, set it to + /// \p Prefix. If \p Prefix is empty, the set clears the existing metadata. + /// Returns true if section prefix changed and false otherwise. + LLVM_ABI bool setSectionPrefix(StringRef Prefix); /// Get the section prefix for this global object. LLVM_ABI std::optional getSectionPrefix() const; diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index 9db4c9e5e2807..92d87681c9adc 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -583,23 +583,23 @@ bool CodeGenPrepare::_run(Function &F) { // if requested. if (BBSectionsGuidedSectionPrefix && BBSectionsProfileReader && BBSectionsProfileReader->isFunctionHot(F.getName())) { - F.setSectionPrefix("hot"); + EverMadeChange |= F.setSectionPrefix("hot"); } else if (ProfileGuidedSectionPrefix) { // The hot attribute overwrites profile count based hotness while profile // counts based hotness overwrite the cold attribute. // This is a conservative behabvior. if (F.hasFnAttribute(Attribute::Hot) || PSI->isFunctionHotInCallGraph(&F, *BFI)) - F.setSectionPrefix("hot"); + EverMadeChange |= F.setSectionPrefix("hot"); // If PSI shows this function is not hot, we will placed the function // into unlikely section if (1) PSI shows this is a cold function, or // (2) the function has a attribute of cold. else if (PSI->isFunctionColdInCallGraph(&F, *BFI) || F.hasFnAttribute(Attribute::Cold)) - F.setSectionPrefix("unlikely"); + EverMadeChange |= F.setSectionPrefix("unlikely"); else if (ProfileUnknownInSpecialSection && PSI->hasPartialSampleProfile() && PSI->isFunctionHotnessUnknown(F)) - F.setSectionPrefix("unknown"); + EverMadeChange |= F.setSectionPrefix("unknown"); } /// This optimization identifies DIV instructions that can be diff --git a/llvm/lib/CodeGen/StaticDataAnnotator.cpp b/llvm/lib/CodeGen/StaticDataAnnotator.cpp index 2d9b489a80acb..53a9ab4dbda02 100644 --- a/llvm/lib/CodeGen/StaticDataAnnotator.cpp +++ b/llvm/lib/CodeGen/StaticDataAnnotator.cpp @@ -91,8 +91,7 @@ bool StaticDataAnnotator::runOnModule(Module &M) { if (SectionPrefix.empty()) continue; - GV.setSectionPrefix(SectionPrefix); - Changed = true; + Changed |= GV.setSectionPrefix(SectionPrefix); } return Changed; diff --git a/llvm/lib/IR/Globals.cpp b/llvm/lib/IR/Globals.cpp index fad8d6083a4ae..1a7a5c5fbad6b 100644 --- a/llvm/lib/IR/Globals.cpp +++ b/llvm/lib/IR/Globals.cpp @@ -288,26 +288,22 @@ void GlobalObject::setSection(StringRef S) { setGlobalObjectFlag(HasSectionHashEntryBit, !S.empty()); } -void GlobalObject::setSectionPrefix(StringRef Prefix) { - if (Prefix.empty()) { - setMetadata(LLVMContext::MD_section_prefix, nullptr); - return; - } - MDBuilder MDB(getContext()); - setMetadata(LLVMContext::MD_section_prefix, - MDB.createGlobalObjectSectionPrefix(Prefix)); -} - -bool GlobalObject::updateSectionPrefix(StringRef Prefix) { +bool GlobalObject::setSectionPrefix(StringRef Prefix) { StringRef ExistingPrefix; if (std::optional MaybePrefix = getSectionPrefix()) ExistingPrefix = *MaybePrefix; - if (ExistingPrefix != Prefix) { - setSectionPrefix(Prefix); + if (ExistingPrefix == Prefix) + return false; + + if (Prefix.empty()) { + setMetadata(LLVMContext::MD_section_prefix, nullptr); return true; } - return false; + MDBuilder MDB(getContext()); + setMetadata(LLVMContext::MD_section_prefix, + MDB.createGlobalObjectSectionPrefix(Prefix)); + return true; } std::optional GlobalObject::getSectionPrefix() const { diff --git a/llvm/lib/Transforms/Instrumentation/MemProfUse.cpp b/llvm/lib/Transforms/Instrumentation/MemProfUse.cpp index ecb2f2dbc552b..c86092bd51eda 100644 --- a/llvm/lib/Transforms/Instrumentation/MemProfUse.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemProfUse.cpp @@ -848,13 +848,12 @@ bool MemProfUsePass::annotateGlobalVariables( // So we just print out the static data section prefix in LLVM_DEBUG. if (Record && Record->AccessCount > 0) { ++NumOfMemProfHotGlobalVars; - GVar.setSectionPrefix("hot"); - Changed = true; + Changed |= GVar.setSectionPrefix("hot"); LLVM_DEBUG(dbgs() << "Global variable " << Name << " is annotated as hot\n"); } else if (DataAccessProf->isKnownColdSymbol(Name)) { ++NumOfMemProfColdGlobalVars; - GVar.setSectionPrefix("unlikely"); + Changed |= GVar.setSectionPrefix("unlikely"); Changed = true; LLVM_DEBUG(dbgs() << "Global variable " << Name << " is annotated as unlikely\n"); diff --git a/llvm/unittests/IR/GlobalObjectTest.cpp b/llvm/unittests/IR/GlobalObjectTest.cpp index d6eab060cddff..0e16d01e759de 100644 --- a/llvm/unittests/IR/GlobalObjectTest.cpp +++ b/llvm/unittests/IR/GlobalObjectTest.cpp @@ -48,10 +48,10 @@ TEST_F(GlobalObjectTest, SectionPrefix) { ASSERT_NE(Foo, nullptr); ASSERT_THAT(Foo->getSectionPrefix(), Optional(StrEq("hot"))); - // No actual update. - EXPECT_FALSE(Foo->updateSectionPrefix("hot")); + // Test that set method returns false since existing section prefix is hot. + EXPECT_FALSE(Foo->setSectionPrefix("hot")); - // Update prefix from hot to unlikely. + // Set prefix from hot to unlikely. Foo->setSectionPrefix("unlikely"); EXPECT_THAT(Foo->getSectionPrefix(), Optional(StrEq("unlikely"))); @@ -66,16 +66,15 @@ TEST_F(GlobalObjectTest, SectionPrefix) { ASSERT_NE(Bar, nullptr); ASSERT_THAT(Bar->getSectionPrefix(), Eq(std::nullopt)); - // Test that update method returns false since Bar doesn't have prefix - // metadata. - EXPECT_FALSE(Bar->updateSectionPrefix("")); + // Test that set method returns false since Bar doesn't have prefix metadata. + EXPECT_FALSE(Bar->setSectionPrefix("")); - // Update from empty to hot. - EXPECT_TRUE(Bar->updateSectionPrefix("hot")); + // Set from empty to hot. + EXPECT_TRUE(Bar->setSectionPrefix("hot")); EXPECT_THAT(Bar->getSectionPrefix(), Optional(StrEq("hot"))); - // Teset that update method returns true and section prefix is cleared. - EXPECT_TRUE(Bar->updateSectionPrefix("")); + // Test that set method returns true and section prefix is cleared. + EXPECT_TRUE(Bar->setSectionPrefix("")); EXPECT_THAT(Bar->getSectionPrefix(), Eq(std::nullopt)); } } // namespace From 381d31d5971a7533068bdc029128a15901f71e74 Mon Sep 17 00:00:00 2001 From: mingmingl Date: Tue, 16 Sep 2025 11:11:59 -0700 Subject: [PATCH 6/7] fix typo --- llvm/include/llvm/IR/GlobalObject.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/IR/GlobalObject.h b/llvm/include/llvm/IR/GlobalObject.h index 3a83f1b428d09..e273387807cf6 100644 --- a/llvm/include/llvm/IR/GlobalObject.h +++ b/llvm/include/llvm/IR/GlobalObject.h @@ -121,9 +121,9 @@ class GlobalObject : public GlobalValue { /// appropriate default object file section. LLVM_ABI void setSection(StringRef S); - /// If existing prefix is different from \p Prefix is different, set it to - /// \p Prefix. If \p Prefix is empty, the set clears the existing metadata. - /// Returns true if section prefix changed and false otherwise. + /// If existing prefix is different from \p Prefix, set it to \p Prefix. If \p + /// Prefix is empty, the set clears the existing metadata. Returns true if + /// section prefix changed and false otherwise. LLVM_ABI bool setSectionPrefix(StringRef Prefix); /// Get the section prefix for this global object. From 5ece82e19f0540d99c4564aac8556f62856e24fe Mon Sep 17 00:00:00 2001 From: mingmingl Date: Tue, 16 Sep 2025 12:59:08 -0700 Subject: [PATCH 7/7] fix test failure --- llvm/lib/CodeGen/CodeGenPrepare.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index 92d87681c9adc..a190f0dac1379 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -583,23 +583,23 @@ bool CodeGenPrepare::_run(Function &F) { // if requested. if (BBSectionsGuidedSectionPrefix && BBSectionsProfileReader && BBSectionsProfileReader->isFunctionHot(F.getName())) { - EverMadeChange |= F.setSectionPrefix("hot"); + (void)F.setSectionPrefix("hot"); } else if (ProfileGuidedSectionPrefix) { // The hot attribute overwrites profile count based hotness while profile // counts based hotness overwrite the cold attribute. // This is a conservative behabvior. if (F.hasFnAttribute(Attribute::Hot) || PSI->isFunctionHotInCallGraph(&F, *BFI)) - EverMadeChange |= F.setSectionPrefix("hot"); + (void)F.setSectionPrefix("hot"); // If PSI shows this function is not hot, we will placed the function // into unlikely section if (1) PSI shows this is a cold function, or // (2) the function has a attribute of cold. else if (PSI->isFunctionColdInCallGraph(&F, *BFI) || F.hasFnAttribute(Attribute::Cold)) - EverMadeChange |= F.setSectionPrefix("unlikely"); + (void)F.setSectionPrefix("unlikely"); else if (ProfileUnknownInSpecialSection && PSI->hasPartialSampleProfile() && PSI->isFunctionHotnessUnknown(F)) - EverMadeChange |= F.setSectionPrefix("unknown"); + (void)F.setSectionPrefix("unknown"); } /// This optimization identifies DIV instructions that can be