From f93bd2b082a6571d316224ec2a4633ddad842dda Mon Sep 17 00:00:00 2001 From: mencotton Date: Wed, 26 Nov 2025 01:33:15 +0900 Subject: [PATCH 1/6] [mlir][LLVMIR] Handle missing functions in CGProfile module flags --- .../LLVMIR/LLVMToLLVMIRTranslation.cpp | 21 ++++++++------- .../Dialect/LLVMIR/invalid-cg-profile.mlir | 26 +++++++++++++++++++ 2 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir diff --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp index 7d3486acaf82a..f11b9a6c61690 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp @@ -243,16 +243,17 @@ convertModuleFlagValue(StringRef key, ArrayAttr arrayAttr, if (key == LLVMDialect::getModuleFlagKeyCGProfileName()) { for (auto entry : arrayAttr.getAsRange()) { - llvm::Metadata *fromMetadata = - entry.getFrom() - ? llvm::ValueAsMetadata::get(moduleTranslation.lookupFunction( - entry.getFrom().getValue())) - : nullptr; - llvm::Metadata *toMetadata = - entry.getTo() - ? llvm::ValueAsMetadata::get( - moduleTranslation.lookupFunction(entry.getTo().getValue())) - : nullptr; + const auto getFuncMetadata = + [&](FlatSymbolRefAttr sym) -> llvm::Metadata * { + if (!sym) + return nullptr; + if (llvm::Function *fn = + moduleTranslation.lookupFunction(sym.getValue())) + return llvm::ValueAsMetadata::get(fn); + return nullptr; + }; + llvm::Metadata *const fromMetadata = getFuncMetadata(entry.getFrom()); + llvm::Metadata *const toMetadata = getFuncMetadata(entry.getTo()); llvm::Metadata *vals[] = { fromMetadata, toMetadata, diff --git a/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir b/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir new file mode 100644 index 0000000000000..d7a0f386303e0 --- /dev/null +++ b/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir @@ -0,0 +1,26 @@ +// RUN: mlir-translate %s -mlir-to-llvmir | FileCheck %s +// CHECK: !llvm.module.flags + +module { + llvm.module_flags [#llvm.mlir.module_flag, + #llvm.mlir.module_flag, + #llvm.mlir.module_flag, + #llvm.mlir.module_flag, + #llvm.mlir.module_flag, + #llvm.mlir.module_flag, + #llvm.mlir.module_flag, + #llvm.cgprofile_entry, + #llvm.cgprofile_entry + ]>, + #llvm.mlir.module_flag, + + >>] +} From 263187102eed3ad59a4f08438d2cd15f2d56b8d1 Mon Sep 17 00:00:00 2001 From: mencotton Date: Wed, 26 Nov 2025 22:11:48 +0900 Subject: [PATCH 2/6] Fix: drop unnecessary const --- .../LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp index f11b9a6c61690..b6ea4ba6e4921 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp @@ -243,8 +243,7 @@ convertModuleFlagValue(StringRef key, ArrayAttr arrayAttr, if (key == LLVMDialect::getModuleFlagKeyCGProfileName()) { for (auto entry : arrayAttr.getAsRange()) { - const auto getFuncMetadata = - [&](FlatSymbolRefAttr sym) -> llvm::Metadata * { + auto getFuncMetadata = [&](FlatSymbolRefAttr sym) -> llvm::Metadata * { if (!sym) return nullptr; if (llvm::Function *fn = @@ -252,8 +251,8 @@ convertModuleFlagValue(StringRef key, ArrayAttr arrayAttr, return llvm::ValueAsMetadata::get(fn); return nullptr; }; - llvm::Metadata *const fromMetadata = getFuncMetadata(entry.getFrom()); - llvm::Metadata *const toMetadata = getFuncMetadata(entry.getTo()); + llvm::Metadata *fromMetadata = getFuncMetadata(entry.getFrom()); + llvm::Metadata *toMetadata = getFuncMetadata(entry.getTo()); llvm::Metadata *vals[] = { fromMetadata, toMetadata, From 9ff428edcede8900b1adea3bc2f5906a6321e532 Mon Sep 17 00:00:00 2001 From: mencotton Date: Wed, 26 Nov 2025 22:35:05 +0900 Subject: [PATCH 3/6] Fix: drop the module flags --- .../Dialect/LLVMIR/invalid-cg-profile.mlir | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir b/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir index d7a0f386303e0..a5b50fa1c4cfe 100644 --- a/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir +++ b/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir @@ -2,25 +2,9 @@ // CHECK: !llvm.module.flags module { - llvm.module_flags [#llvm.mlir.module_flag, - #llvm.mlir.module_flag, - #llvm.mlir.module_flag, - #llvm.mlir.module_flag, - #llvm.mlir.module_flag, - #llvm.mlir.module_flag, - #llvm.mlir.module_flag, #llvm.cgprofile_entry, #llvm.cgprofile_entry - ]>, - #llvm.mlir.module_flag, - - >>] + ]>] } From 6ca0824d7089b5b9a1529e03dd5ff408691ee693 Mon Sep 17 00:00:00 2001 From: mencotton Date: Wed, 26 Nov 2025 22:35:31 +0900 Subject: [PATCH 4/6] Fix: expand the checks to cover the exported cgprofile entry --- mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir b/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir index a5b50fa1c4cfe..bf8c4a0e99114 100644 --- a/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir +++ b/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir @@ -1,5 +1,9 @@ // RUN: mlir-translate %s -mlir-to-llvmir | FileCheck %s -// CHECK: !llvm.module.flags +// CHECK: !llvm.module.flags = !{!0, !3} +// CHECK: !0 = !{i32 5, !"CG Profile", !1} +// CHECK: !1 = distinct !{!2, !2, !2} +// CHECK: !2 = !{null, null, i64 222} +// CHECK: !3 = !{i32 2, !"Debug Info Version", i32 3} module { llvm.module_flags [#llvm.mlir.module_flag Date: Thu, 27 Nov 2025 03:33:24 +0900 Subject: [PATCH 5/6] Fix: use matchers --- mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir b/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir index bf8c4a0e99114..86d177acfdfaf 100644 --- a/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir +++ b/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir @@ -1,9 +1,9 @@ // RUN: mlir-translate %s -mlir-to-llvmir | FileCheck %s -// CHECK: !llvm.module.flags = !{!0, !3} -// CHECK: !0 = !{i32 5, !"CG Profile", !1} -// CHECK: !1 = distinct !{!2, !2, !2} -// CHECK: !2 = !{null, null, i64 222} -// CHECK: !3 = !{i32 2, !"Debug Info Version", i32 3} +// CHECK: !llvm.module.flags = !{![[CG_FLAG:[0-9]+]], ![[DBG_FLAG:[0-9]+]]} +// CHECK: [[CG_FLAG]] = !{i32 5, !"CG Profile", [[CG_LIST:![0-9]+]]} +// CHECK: [[CG_LIST]] = distinct !{[[CG_ENTRY:![0-9]+]], [[CG_ENTRY]], [[CG_ENTRY]]} +// CHECK: [[CG_ENTRY]] = !{null, null, i64 222} +// CHECK: [[DBG_FLAG]] = !{i32 2, !"Debug Info Version", i32 3} module { llvm.module_flags [#llvm.mlir.module_flag Date: Thu, 27 Nov 2025 11:19:43 +0900 Subject: [PATCH 6/6] Fix: use the exclamation mark for the matchers --- mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir b/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir index 86d177acfdfaf..bdc98ed30a06b 100644 --- a/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir +++ b/mlir/test/Dialect/LLVMIR/invalid-cg-profile.mlir @@ -1,9 +1,9 @@ // RUN: mlir-translate %s -mlir-to-llvmir | FileCheck %s // CHECK: !llvm.module.flags = !{![[CG_FLAG:[0-9]+]], ![[DBG_FLAG:[0-9]+]]} -// CHECK: [[CG_FLAG]] = !{i32 5, !"CG Profile", [[CG_LIST:![0-9]+]]} -// CHECK: [[CG_LIST]] = distinct !{[[CG_ENTRY:![0-9]+]], [[CG_ENTRY]], [[CG_ENTRY]]} -// CHECK: [[CG_ENTRY]] = !{null, null, i64 222} -// CHECK: [[DBG_FLAG]] = !{i32 2, !"Debug Info Version", i32 3} +// CHECK: ![[CG_FLAG]] = !{i32 5, !"CG Profile", ![[CG_LIST:[0-9]+]]} +// CHECK: ![[CG_LIST]] = distinct !{![[CG_ENTRY:[0-9]+]], ![[CG_ENTRY]], ![[CG_ENTRY]]} +// CHECK: ![[CG_ENTRY]] = !{null, null, i64 222} +// CHECK: ![[DBG_FLAG]] = !{i32 2, !"Debug Info Version", i32 3} module { llvm.module_flags [#llvm.mlir.module_flag