[llvm] [MergeFunctions] Preserve import GUIDs when folding functions (PR #207003)
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 30 07:47:38 PDT 2026
================
@@ -856,43 +859,75 @@ void MergeFunctions::writeAlias(Function *F, Function *G) {
++NumAliasesWritten;
}
+static DenseSet<GlobalValue::GUID> unionImportGUIDs(const Function &F,
+ const Function &G) {
+ DenseSet<GlobalValue::GUID> AllImports = F.getImportGUIDs();
+ DenseSet<GlobalValue::GUID> GImports = G.getImportGUIDs();
+ AllImports.insert(GImports.begin(), GImports.end());
+ return AllImports;
+}
+
+static void mergeEntryCountsAndImportsInto(Function &F, Function &G) {
+ std::optional<uint64_t> FEntryCount = F.getEntryCount();
+ std::optional<uint64_t> GEntryCount = G.getEntryCount();
+ DenseSet<GlobalValue::GUID> AllImports = unionImportGUIDs(F, G);
+ if (!FEntryCount && !GEntryCount && AllImports.empty())
+ return;
+
+ // -1 is a safe placeholder here, getEntryCount() already treats it as
+ // "unknown" (same sentinel SamplePGO uses for no-sample functions), so
+ // it won't look hot to anyone reading the count back.
+ uint64_t Sum = static_cast<uint64_t>(-1);
+ if (FEntryCount || GEntryCount)
+ Sum = SaturatingAdd(FEntryCount ? *FEntryCount : uint64_t{0},
+ GEntryCount ? *GEntryCount : uint64_t{0});
+ F.setEntryCount(Sum, AllImports.empty() ? nullptr : &AllImports);
+}
+
// If needed, replace G with an alias to F if possible, or a thunk to F if
// profitable. Returns false if neither is the case. If \p G is not needed (i.e.
-// it is discardable and unused), \p G is removed directly.
-bool MergeFunctions::writeThunkOrAliasIfNeeded(Function *F, Function *G) {
- if (G->isDiscardableIfUnused() && G->use_empty() && !MergeFunctionsPDI) {
+// it is discardable and unused), \p G is removed directly. If \p MergeProfile
+// is set, G's profile metadata is merged into F.
+bool MergeFunctions::writeThunkOrAliasIfNeeded(Function *F, Function *G,
+ bool MergeProfile) {
+ bool ShouldErase =
+ G->isDiscardableIfUnused() && G->use_empty() && !MergeFunctionsPDI;
+ bool ShouldAlias = canCreateAliasFor(G);
+ bool ShouldThunk = canCreateThunkFor(F);
+
+ if (!ShouldErase && !ShouldAlias && !ShouldThunk)
+ return false;
+
+ if (MergeProfile) {
----------------
teresajohnson wrote:
Nit: no braces around single line if body
https://github.com/llvm/llvm-project/pull/207003
More information about the llvm-commits
mailing list