From ef0cb372dc80c9f71a181125e6dca22e5c59ece5 Mon Sep 17 00:00:00 2001 From: wlei Date: Mon, 28 Nov 2022 10:02:14 -0800 Subject: [PATCH] [llvm_stats] Do not import llvm.stats metadata for thinlto The stats are computed per module and will all be merged in the binary, importing the metadata will cause duplication of the stats. Reviewed By: hoy, wenlei Differential Revision: https://reviews.llvm.org/D138833 --- llvm/lib/Linker/IRMover.cpp | 5 ++++ .../ThinLTO/X86/Inputs/llvm-stats-import.ll | 12 ++++++++ llvm/test/ThinLTO/X86/llvm-stats-import.ll | 28 +++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 llvm/test/ThinLTO/X86/Inputs/llvm-stats-import.ll create mode 100644 llvm/test/ThinLTO/X86/llvm-stats-import.ll diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index d9dcd613bd7c..518f1a162210 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -1244,6 +1244,11 @@ void IRLinker::linkNamedMDNodes() { DstM.getModuleIdentifier() + "' is not\n"); continue; } + // The stats are computed per module and will all be merged in the binary. + // Importing the metadata will cause duplication of the stats. + if (IsPerformingImport && NMD.getName() == "llvm.stats") + continue; + NamedMDNode *DestNMD = DstM.getOrInsertNamedMetadata(NMD.getName()); // Add Src elements into Dest node. for (const MDNode *Op : NMD.operands()) diff --git a/llvm/test/ThinLTO/X86/Inputs/llvm-stats-import.ll b/llvm/test/ThinLTO/X86/Inputs/llvm-stats-import.ll new file mode 100644 index 000000000000..5e981fec9e35 --- /dev/null +++ b/llvm/test/ThinLTO/X86/Inputs/llvm-stats-import.ll @@ -0,0 +1,12 @@ +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @foo() { +entry: + ret void +} + +attributes #0 = { inaccessiblememonly nounwind willreturn } + +!llvm.stats = !{!0} +!0 = !{!"foo", i64 456} diff --git a/llvm/test/ThinLTO/X86/llvm-stats-import.ll b/llvm/test/ThinLTO/X86/llvm-stats-import.ll new file mode 100644 index 000000000000..4250cdd59193 --- /dev/null +++ b/llvm/test/ThinLTO/X86/llvm-stats-import.ll @@ -0,0 +1,28 @@ +; RUN: opt -module-summary %s -o %t1.bc +; RUN: opt -module-summary %p/Inputs/llvm-stats-import.ll -o %t2.bc +; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc %t2.bc + +; RUN: llvm-lto -thinlto-action=import %t1.bc -thinlto-index=%t.index.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=CHECK-MAIN +; RUN: llvm-lto -thinlto-action=import %t2.bc -thinlto-index=%t.index.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=CHECK-FOO + +; CHECK-MAIN: !0 = !{!"main", i64 123} +; CHECK-MAIN-NOT: !{!"foo", i64 456} + +; CHECK-FOO: !0 = !{!"foo", i64 456} +; CHECK-FOO-NOT: !{!"main", i64 123} + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define i32 @main() { +entry: + call void (...) @foo() + ret i32 0 +} + +declare void @foo(...) + +attributes #0 = { inaccessiblememonly nounwind willreturn } + +!llvm.stats = !{!0} +!0 = !{!"main", i64 123}