[llvm] IRMover: Proper fix of performance regression of #146020 (PR #157218)
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 5 18:54:10 PDT 2025
https://github.com/vitalybuka updated https://github.com/llvm/llvm-project/pull/157218
>From 6586cbfe078430e0698ce76c4cc49462fba64d1a Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at google.com>
Date: Fri, 5 Sep 2025 18:51:58 -0700
Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?=
=?UTF-8?q?itial=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.6
---
llvm/include/llvm/Linker/IRMover.h | 6 ++++++
llvm/lib/Linker/IRMover.cpp | 16 +++++++++-------
2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/llvm/include/llvm/Linker/IRMover.h b/llvm/include/llvm/Linker/IRMover.h
index 39929311a3227..1dac5605f4961 100644
--- a/llvm/include/llvm/Linker/IRMover.h
+++ b/llvm/include/llvm/Linker/IRMover.h
@@ -10,6 +10,7 @@
#define LLVM_LINKER_IRMOVER_H
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/FunctionExtras.h"
#include "llvm/Support/Compiler.h"
@@ -19,6 +20,8 @@ namespace llvm {
class Error;
class GlobalValue;
class Metadata;
+class MDNode;
+class NamedMDNode;
class Module;
class StructType;
class TrackingMDRef;
@@ -67,6 +70,8 @@ class IRMover {
using LazyCallback =
llvm::unique_function<void(GlobalValue &GV, ValueAdder Add)>;
+ typedef DenseMap<const NamedMDNode *, DenseSet<const MDNode *>> NamedMDNodesT;
+
/// Move in the provide values in \p ValuesToLink from \p Src.
///
/// - \p AddLazyFor is a call back that the IRMover will call when a global
@@ -86,6 +91,7 @@ class IRMover {
Module &Composite;
IdentifiedStructTypeSet IdentifiedStructTypes;
MDMapT SharedMDs; ///< A Metadata map to use for all calls to \a move().
+ NamedMDNodesT NamedMDNodes; ///< Cache for IRMover::linkNamedMDNodes().
};
} // End llvm namespace
diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp
index f53fe8f84fe3c..489e03d5fdd60 100644
--- a/llvm/lib/Linker/IRMover.cpp
+++ b/llvm/lib/Linker/IRMover.cpp
@@ -293,7 +293,7 @@ class IRLinker {
std::unique_ptr<Module> SrcM;
// Lookup table to optimize IRMover::linkNamedMDNodes().
- DenseMap<StringRef, DenseSet<MDNode *>> NamedMDNodes;
+ IRMover::NamedMDNodesT &NamedMDNodes;
/// See IRMover::move().
IRMover::LazyCallback AddLazyFor;
@@ -440,10 +440,12 @@ class IRLinker {
IRLinker(Module &DstM, MDMapT &SharedMDs,
IRMover::IdentifiedStructTypeSet &Set, std::unique_ptr<Module> SrcM,
ArrayRef<GlobalValue *> ValuesToLink,
- IRMover::LazyCallback AddLazyFor, bool IsPerformingImport)
- : DstM(DstM), SrcM(std::move(SrcM)), AddLazyFor(std::move(AddLazyFor)),
- TypeMap(Set), GValMaterializer(*this), LValMaterializer(*this),
- SharedMDs(SharedMDs), IsPerformingImport(IsPerformingImport),
+ IRMover::LazyCallback AddLazyFor, bool IsPerformingImport,
+ IRMover::NamedMDNodesT &NamedMDNodes)
+ : DstM(DstM), SrcM(std::move(SrcM)), NamedMDNodes(NamedMDNodes),
+ AddLazyFor(std::move(AddLazyFor)), TypeMap(Set),
+ GValMaterializer(*this), LValMaterializer(*this), SharedMDs(SharedMDs),
+ IsPerformingImport(IsPerformingImport),
Mapper(ValueMap, RF_ReuseAndMutateDistinctMDs | RF_IgnoreMissingLocals,
&TypeMap, &GValMaterializer),
IndirectSymbolMCID(Mapper.registerAlternateMappingContext(
@@ -1138,7 +1140,7 @@ void IRLinker::linkNamedMDNodes() {
NamedMDNode *DestNMD = DstM.getOrInsertNamedMetadata(NMD.getName());
- auto &Inserted = NamedMDNodes[DestNMD->getName()];
+ auto &Inserted = NamedMDNodes[DestNMD];
if (Inserted.empty()) {
// Must be the first module, copy everything from DestNMD.
Inserted.insert(DestNMD->operands().begin(), DestNMD->operands().end());
@@ -1683,6 +1685,6 @@ Error IRMover::move(std::unique_ptr<Module> Src,
LazyCallback AddLazyFor, bool IsPerformingImport) {
IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes,
std::move(Src), ValuesToLink, std::move(AddLazyFor),
- IsPerformingImport);
+ IsPerformingImport, NamedMDNodes);
return TheIRLinker.run();
}
>From a2ad08e0a371ae535682f44737c547ecd72b3c65 Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at google.com>
Date: Fri, 5 Sep 2025 18:54:03 -0700
Subject: [PATCH 2/2] Update llvm/include/llvm/Linker/IRMover.h
Co-authored-by: Copilot <175728472+Copilot at users.noreply.github.com>
---
llvm/include/llvm/Linker/IRMover.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/Linker/IRMover.h b/llvm/include/llvm/Linker/IRMover.h
index 1dac5605f4961..2a234d5d28fd8 100644
--- a/llvm/include/llvm/Linker/IRMover.h
+++ b/llvm/include/llvm/Linker/IRMover.h
@@ -70,7 +70,7 @@ class IRMover {
using LazyCallback =
llvm::unique_function<void(GlobalValue &GV, ValueAdder Add)>;
- typedef DenseMap<const NamedMDNode *, DenseSet<const MDNode *>> NamedMDNodesT;
+ using NamedMDNodesT = DenseMap<const NamedMDNode *, DenseSet<const MDNode *>>;
/// Move in the provide values in \p ValuesToLink from \p Src.
///
More information about the llvm-commits
mailing list