From 85e7d8923e5d9366e233705008cc05666a253958 Mon Sep 17 00:00:00 2001 From: "Cai, Justin" Date: Tue, 28 Jan 2025 13:37:48 -0800 Subject: [PATCH 1/6] [SYCL] Add SYCL registered kernel metadata into property sets --- llvm/include/llvm/Support/PropertySetIO.h | 1 + .../SYCLLowerIR/ComputeModuleRuntimeInfo.cpp | 12 ++++++ .../sycl-post-link/sycl-registered-kernels.ll | 41 +++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll diff --git a/llvm/include/llvm/Support/PropertySetIO.h b/llvm/include/llvm/Support/PropertySetIO.h index f93a6d605c8ce..70abbe6bd585e 100644 --- a/llvm/include/llvm/Support/PropertySetIO.h +++ b/llvm/include/llvm/Support/PropertySetIO.h @@ -211,6 +211,7 @@ class PropertySetRegistry { static constexpr char SYCL_HOST_PIPES[] = "SYCL/host pipes"; static constexpr char SYCL_VIRTUAL_FUNCTIONS[] = "SYCL/virtual functions"; static constexpr char SYCL_IMPLICIT_LOCAL_ARG[] = "SYCL/implicit local arg"; + static constexpr char SYCL_REGISTERED_KERNELS[] = "SYCL/registered kernels"; static constexpr char PROPERTY_REQD_WORK_GROUP_SIZE[] = "reqd_work_group_size_uint64_t"; diff --git a/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp b/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp index 9526f7ec61009..d0cf8c8328238 100644 --- a/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp +++ b/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp @@ -471,6 +471,18 @@ PropSetRegTy computeModuleProperties(const Module &M, } } + if (const NamedMDNode *MD = M.getNamedMetadata("sycl_registered_kernels")) { + assert(MD->getNumOperands() == 1 && "Invalid sycl_registered_kernels metadata"); + const MDNode *RegistredKernels = MD->getOperand(0); + for (const MDOperand &Op : RegistredKernels->operands()) { + const auto *RegisteredKernel = cast(Op); + assert(RegisteredKernel->getNumOperands() == 2 && "Invalid sycl_registered_kernels metadata"); + PropSet.add(PropSetRegTy::SYCL_REGISTERED_KERNELS, + cast(RegisteredKernel->getOperand(0))->getString(), + cast(RegisteredKernel->getOperand(1))->getString()); + } + } + return PropSet; } std::string computeModuleSymbolTable(const Module &M, diff --git a/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll b/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll new file mode 100644 index 0000000000000..d1d8da9851938 --- /dev/null +++ b/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll @@ -0,0 +1,41 @@ +; This test checks that the sycl-post-link ouputs registered kernel data +; from !sycl_registered_kernels metadata into the SYCL/registerd_kernels section. +; RUN: sycl-post-link %s -properties -o %t.table +; RUN: FileCheck %s -input-file=%t_0.prop + +!sycl_registered_kernels = !{!4} +!4 = !{!5, !6, !7, !8, !9, !10, !11, !12, !13} + +; CHECK: [SYCL/registered kernels] + +; For each entry in !sycl_registered_kernels, an entry +; mapping the registered name to the mangled name is added in the +; SYCL/registered kernels. (Although in the prop files, the +; mapped values are base64 encoded, so just using simplifed check +; with a regex.) +; CHECK-NEXT: foo=2|{{[A-Za-z0-9+/]+}} +!5 = !{!"foo", !"_Z17__sycl_kernel_foov"} + +; CHECK-NEXT: foo3=2|{{[A-Za-z0-9+/]+}} +!6 = !{!"foo3", !"_Z18__sycl_kernel_ff_4v"} + +; CHECK-NEXT: iota=2|{{[A-Za-z0-9+/]+}} +!7 = !{!"iota", !"_Z18__sycl_kernel_iotaiPi"} + +; CHECK-NEXT: inst temp=2|{{[A-Za-z0-9+/]+}} +!8 = !{!"inst temp", !"_Z22__sycl_kernel_tempfoo2IiEvT_"} + +; CHECK-NEXT: def spec=2|{{[A-Za-z0-9+/]+}} +!9 = !{!"def spec", !"_Z22__sycl_kernel_tempfoo2IsEvT_"} + +; CHECK-NEXT: decl temp=2|{{[A-Za-z0-9+/]+}} +!10 = !{!"decl temp", !"_Z21__sycl_kernel_tempfooIiEvT_"} + +; CHECK-NEXT: decl spec=2|{{[A-Za-z0-9+/]+}} +!11 = !{!"decl spec", !"_Z22__sycl_kernel_tempfoo2IfEvT_"} + +; CHECK-NEXT: nontype=2|{{[A-Za-z0-9+/]+}} +!12 = !{!"nontype", !"_Z22__sycl_kernel_tempfoo3ILi5EEvv"} + +; CHECK-NEXT: non-temp=2|{{[A-Za-z0-9+/]+}} +!13 = !{!"decl non-temp", !"_Z17__sycl_kernel_barv"} From 5a55f91fb85c9f7c988705f88c84c07f72757daa Mon Sep 17 00:00:00 2001 From: "Cai, Justin" Date: Tue, 28 Jan 2025 21:57:08 +0000 Subject: [PATCH 2/6] clang-format --- llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp b/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp index d0cf8c8328238..307ad68f9064e 100644 --- a/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp +++ b/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp @@ -472,12 +472,14 @@ PropSetRegTy computeModuleProperties(const Module &M, } if (const NamedMDNode *MD = M.getNamedMetadata("sycl_registered_kernels")) { - assert(MD->getNumOperands() == 1 && "Invalid sycl_registered_kernels metadata"); + assert(MD->getNumOperands() == 1 && + "Invalid sycl_registered_kernels metadata"); const MDNode *RegistredKernels = MD->getOperand(0); for (const MDOperand &Op : RegistredKernels->operands()) { const auto *RegisteredKernel = cast(Op); - assert(RegisteredKernel->getNumOperands() == 2 && "Invalid sycl_registered_kernels metadata"); - PropSet.add(PropSetRegTy::SYCL_REGISTERED_KERNELS, + assert(RegisteredKernel->getNumOperands() == 2 && + "Invalid sycl_registered_kernels metadata"); + PropSet.add(PropSetRegTy::SYCL_REGISTERED_KERNELS, cast(RegisteredKernel->getOperand(0))->getString(), cast(RegisteredKernel->getOperand(1))->getString()); } From 7ef3e97662564ce11c9aefd9ca0d61a676e33f2f Mon Sep 17 00:00:00 2001 From: "Cai, Justin" Date: Tue, 4 Feb 2025 14:55:48 +0000 Subject: [PATCH 3/6] Add splitting logic to registered_kernel_names --- .../SYCLLowerIR/ComputeModuleRuntimeInfo.cpp | 21 +++--- llvm/lib/SYCLLowerIR/ModuleSplitter.cpp | 26 ++++++++ .../sycl-post-link/sycl-registered-kernels.ll | 65 +++++++++++++++---- 3 files changed, 89 insertions(+), 23 deletions(-) diff --git a/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp b/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp index 307ad68f9064e..f01b82473fa97 100644 --- a/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp +++ b/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp @@ -472,16 +472,17 @@ PropSetRegTy computeModuleProperties(const Module &M, } if (const NamedMDNode *MD = M.getNamedMetadata("sycl_registered_kernels")) { - assert(MD->getNumOperands() == 1 && - "Invalid sycl_registered_kernels metadata"); - const MDNode *RegistredKernels = MD->getOperand(0); - for (const MDOperand &Op : RegistredKernels->operands()) { - const auto *RegisteredKernel = cast(Op); - assert(RegisteredKernel->getNumOperands() == 2 && - "Invalid sycl_registered_kernels metadata"); - PropSet.add(PropSetRegTy::SYCL_REGISTERED_KERNELS, - cast(RegisteredKernel->getOperand(0))->getString(), - cast(RegisteredKernel->getOperand(1))->getString()); + if (MD->getNumOperands() == 1) { + const MDNode *RegistredKernels = MD->getOperand(0); + for (const MDOperand &Op : RegistredKernels->operands()) { + const auto *RegisteredKernel = cast(Op); + if (RegisteredKernel->getNumOperands() != 2) + continue; + PropSet.add( + PropSetRegTy::SYCL_REGISTERED_KERNELS, + cast(RegisteredKernel->getOperand(0))->getString(), + cast(RegisteredKernel->getOperand(1))->getString()); + } } } diff --git a/llvm/lib/SYCLLowerIR/ModuleSplitter.cpp b/llvm/lib/SYCLLowerIR/ModuleSplitter.cpp index 904424f93dae6..c7df31835f143 100644 --- a/llvm/lib/SYCLLowerIR/ModuleSplitter.cpp +++ b/llvm/lib/SYCLLowerIR/ModuleSplitter.cpp @@ -697,6 +697,31 @@ static bool mustPreserveGV(const GlobalValue &GV) { return true; } +void cleanupSYCLRegisteredKernels(Module *M) { + NamedMDNode *MD = M->getNamedMetadata("sycl_registered_kernels"); + if (!MD) + return; + + if (MD->getNumOperands() == 0) + return; + + SmallVector OperandsToKeep; + MDNode *RegisterdKernels = MD->getOperand(0); + for (const MDOperand &Op : RegisterdKernels->operands()) { + auto RegisteredKernel = cast(Op); + // Ignore metadata nodes with wrong number of operands. + if (RegisteredKernel->getNumOperands() != 2) + continue; + + StringRef MangledName = + cast(RegisteredKernel->getOperand(1))->getString(); + if (M->getFunction(MangledName)) + OperandsToKeep.push_back(RegisteredKernel); + } + MD->clearOperands(); + MD->addOperand(MDNode::get(M->getContext(), OperandsToKeep)); +} + // TODO: try to move all passes (cleanup, spec consts, compile time properties) // in one place and execute MPM.run() only once. void ModuleDesc::cleanup() { @@ -740,6 +765,7 @@ void ModuleDesc::cleanup() { // process all nodes in the named metadata and remove nodes which are // referencing kernels which are not included into submodule. processSubModuleNamedMetadata(M.get()); + cleanupSYCLRegisteredKernels(M.get()); } bool ModuleDesc::isSpecConstantDefault() const { diff --git a/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll b/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll index d1d8da9851938..2d1946d95fb73 100644 --- a/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll +++ b/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll @@ -1,41 +1,80 @@ ; This test checks that the sycl-post-link ouputs registered kernel data ; from !sycl_registered_kernels metadata into the SYCL/registerd_kernels section. -; RUN: sycl-post-link %s -properties -o %t.table -; RUN: FileCheck %s -input-file=%t_0.prop + +; RUN: sycl-post-link %s -properties -split=auto -o %t.table +; RUN: FileCheck %s -input-file=%t_0.prop --check-prefixes=CHECK-WITH-ASPECT,CHECK \ +; RUN: --implicit-check-not=kernel_with_aspects +; RUN: FileCheck %s -input-file=%t_1.prop --check-prefixes=CHECK-NO-ASPECT,CHECK !sycl_registered_kernels = !{!4} -!4 = !{!5, !6, !7, !8, !9, !10, !11, !12, !13} +!4 = !{!5, !6, !7, !8, !9, !10, !11, !12, !13, !14} +; Both splits should contain the registered kernel data. ; CHECK: [SYCL/registered kernels] ; For each entry in !sycl_registered_kernels, an entry ; mapping the registered name to the mangled name is added in the -; SYCL/registered kernels. (Although in the prop files, the +; SYCL/registered kernels if it references a kernel that appears +; in the split. (Although in the prop files, the ; mapped values are base64 encoded, so just using simplifed check ; with a regex.) -; CHECK-NEXT: foo=2|{{[A-Za-z0-9+/]+}} +; CHECK-NO-ASPECT-NEXT: foo=2|{{[A-Za-z0-9+/]+}} !5 = !{!"foo", !"_Z17__sycl_kernel_foov"} +define spir_kernel void @_Z17__sycl_kernel_foov() { + ret void +} -; CHECK-NEXT: foo3=2|{{[A-Za-z0-9+/]+}} +; CHECK-NO-ASPECT-NEXT: foo3=2|{{[A-Za-z0-9+/]+}} !6 = !{!"foo3", !"_Z18__sycl_kernel_ff_4v"} +define spir_kernel void @_Z18__sycl_kernel_ff_4v() { + ret void +} -; CHECK-NEXT: iota=2|{{[A-Za-z0-9+/]+}} +; CHECK-NO-ASPECT-NEXT: iota=2|{{[A-Za-z0-9+/]+}} !7 = !{!"iota", !"_Z18__sycl_kernel_iotaiPi"} +define spir_kernel void @_Z18__sycl_kernel_iotaiPi() { + ret void +} -; CHECK-NEXT: inst temp=2|{{[A-Za-z0-9+/]+}} +; CHECK-NO-ASPECT-NEXT: inst temp=2|{{[A-Za-z0-9+/]+}} !8 = !{!"inst temp", !"_Z22__sycl_kernel_tempfoo2IiEvT_"} +define spir_kernel void @_Z22__sycl_kernel_tempfoo2IiEvT_() { + ret void +} -; CHECK-NEXT: def spec=2|{{[A-Za-z0-9+/]+}} +; CHECK-NO-ASPECT-NEXT: def spec=2|{{[A-Za-z0-9+/]+}} !9 = !{!"def spec", !"_Z22__sycl_kernel_tempfoo2IsEvT_"} +define spir_kernel void @_Z22__sycl_kernel_tempfoo2IsEvT_() { + ret void +} -; CHECK-NEXT: decl temp=2|{{[A-Za-z0-9+/]+}} +; CHECK-NO-ASPECT-NEXT: decl temp=2|{{[A-Za-z0-9+/]+}} !10 = !{!"decl temp", !"_Z21__sycl_kernel_tempfooIiEvT_"} +define spir_kernel void @_Z21__sycl_kernel_tempfooIiEvT_() { + ret void +} -; CHECK-NEXT: decl spec=2|{{[A-Za-z0-9+/]+}} +; CHECK-NO-ASPECT-NEXT: decl spec=2|{{[A-Za-z0-9+/]+}} !11 = !{!"decl spec", !"_Z22__sycl_kernel_tempfoo2IfEvT_"} +define spir_kernel void @_Z22__sycl_kernel_tempfoo2IfEvT_() { + ret void +} -; CHECK-NEXT: nontype=2|{{[A-Za-z0-9+/]+}} +; CHECK-NO-ASPECT-NEXT: nontype=2|{{[A-Za-z0-9+/]+}} !12 = !{!"nontype", !"_Z22__sycl_kernel_tempfoo3ILi5EEvv"} +define spir_kernel void @_Z22__sycl_kernel_tempfoo3ILi5EEvv() { + ret void +} -; CHECK-NEXT: non-temp=2|{{[A-Za-z0-9+/]+}} +; CHECK-NO-ASPECT-NEXT: non-temp=2|{{[A-Za-z0-9+/]+}} !13 = !{!"decl non-temp", !"_Z17__sycl_kernel_barv"} +define spir_kernel void @_Z17__sycl_kernel_barv() { + ret void +} + +!14 = !{!"kernel_with_aspects", !"kernel_with_aspects"} +!15 = !{i32 1} +; CHECK-WITH-ASPECT-NEXT: kernel_with_aspects=2|{{[A-Za-z0-9+/]+}} +define spir_kernel void @kernel_with_aspects() !sycl_used_aspects !15 { + ret void +} \ No newline at end of file From cdcc204eaded0328a0bb30918cf651802c821948 Mon Sep 17 00:00:00 2001 From: "Cai, Justin" Date: Tue, 4 Feb 2025 15:16:29 +0000 Subject: [PATCH 4/6] Address review comments --- llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp | 4 ++-- .../sycl-post-link/sycl-registered-kernels-empty.ll | 3 +++ .../tools/sycl-post-link/sycl-registered-kernels.ll | 10 +++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 llvm/test/tools/sycl-post-link/sycl-registered-kernels-empty.ll diff --git a/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp b/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp index f01b82473fa97..07e0cad4dea25 100644 --- a/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp +++ b/llvm/lib/SYCLLowerIR/ComputeModuleRuntimeInfo.cpp @@ -473,8 +473,8 @@ PropSetRegTy computeModuleProperties(const Module &M, if (const NamedMDNode *MD = M.getNamedMetadata("sycl_registered_kernels")) { if (MD->getNumOperands() == 1) { - const MDNode *RegistredKernels = MD->getOperand(0); - for (const MDOperand &Op : RegistredKernels->operands()) { + const MDNode *RegisteredKernels = MD->getOperand(0); + for (const MDOperand &Op : RegisteredKernels->operands()) { const auto *RegisteredKernel = cast(Op); if (RegisteredKernel->getNumOperands() != 2) continue; diff --git a/llvm/test/tools/sycl-post-link/sycl-registered-kernels-empty.ll b/llvm/test/tools/sycl-post-link/sycl-registered-kernels-empty.ll new file mode 100644 index 0000000000000..4b068a354624a --- /dev/null +++ b/llvm/test/tools/sycl-post-link/sycl-registered-kernels-empty.ll @@ -0,0 +1,3 @@ +; RUN: sycl-post-link -properties %s -o %t.table +; RUN: FileCheck %s -input-file=%t_0.prop --implicit-check-not="[SYCL/registered kernels]" +!sycl_registered_kernels = !{} \ No newline at end of file diff --git a/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll b/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll index 2d1946d95fb73..9e0ab9f4ba5b0 100644 --- a/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll +++ b/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll @@ -7,14 +7,14 @@ ; RUN: FileCheck %s -input-file=%t_1.prop --check-prefixes=CHECK-NO-ASPECT,CHECK !sycl_registered_kernels = !{!4} -!4 = !{!5, !6, !7, !8, !9, !10, !11, !12, !13, !14} +!4 = !{!5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !16} ; Both splits should contain the registered kernel data. ; CHECK: [SYCL/registered kernels] ; For each entry in !sycl_registered_kernels, an entry ; mapping the registered name to the mangled name is added in the -; SYCL/registered kernels if it references a kernel that appears +; [SYCL/registered kernels] if it references a kernel that appears ; in the split. (Although in the prop files, the ; mapped values are base64 encoded, so just using simplifed check ; with a regex.) @@ -77,4 +77,8 @@ define spir_kernel void @_Z17__sycl_kernel_barv() { ; CHECK-WITH-ASPECT-NEXT: kernel_with_aspects=2|{{[A-Za-z0-9+/]+}} define spir_kernel void @kernel_with_aspects() !sycl_used_aspects !15 { ret void -} \ No newline at end of file +} + +; Data with incorrect format should be ignored. +; CHECK-NOT: incorrect_data_format +!16 = !{!"incorrect_data_format"} From 4dbf0ee38a2fb4d03a18509d82e87a660f100274 Mon Sep 17 00:00:00 2001 From: "Cai, Justin" Date: Mon, 10 Feb 2025 07:28:31 -0800 Subject: [PATCH 5/6] Add duplicate test --- .../tools/sycl-post-link/sycl-registered-kernels.ll | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll b/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll index 9e0ab9f4ba5b0..3179100cb5711 100644 --- a/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll +++ b/llvm/test/tools/sycl-post-link/sycl-registered-kernels.ll @@ -7,7 +7,7 @@ ; RUN: FileCheck %s -input-file=%t_1.prop --check-prefixes=CHECK-NO-ASPECT,CHECK !sycl_registered_kernels = !{!4} -!4 = !{!5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !16} +!4 = !{!5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !16, !17, !18, !19} ; Both splits should contain the registered kernel data. ; CHECK: [SYCL/registered kernels] @@ -82,3 +82,12 @@ define spir_kernel void @kernel_with_aspects() !sycl_used_aspects !15 { ; Data with incorrect format should be ignored. ; CHECK-NOT: incorrect_data_format !16 = !{!"incorrect_data_format"} + +!17 = !{!"bar", !"_Z3barv"} +!18 = !{!"bar", !"_Z3barv"} +!19 = !{!"(void(*)())bar", !"_Z3barv"} +; CHECK-NO-ASPECT-NEXT: bar=2|[[BAR:[A-Za-z0-9+/]+]] +; CHECK-NO-ASPECT-NEXT: (void(*)())bar=2|[[BAR]] +define spir_kernel void @_Z3barv() { + ret void +} From b139b0bf0c9a5dfe948c971a9bd4df5db3657c7f Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Thu, 13 Feb 2025 08:22:11 +0100 Subject: [PATCH 6/6] Update llvm/test/tools/sycl-post-link/sycl-registered-kernels-empty.ll --- llvm/test/tools/sycl-post-link/sycl-registered-kernels-empty.ll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/test/tools/sycl-post-link/sycl-registered-kernels-empty.ll b/llvm/test/tools/sycl-post-link/sycl-registered-kernels-empty.ll index 4b068a354624a..bb92dd8b081ac 100644 --- a/llvm/test/tools/sycl-post-link/sycl-registered-kernels-empty.ll +++ b/llvm/test/tools/sycl-post-link/sycl-registered-kernels-empty.ll @@ -1,3 +1,3 @@ ; RUN: sycl-post-link -properties %s -o %t.table ; RUN: FileCheck %s -input-file=%t_0.prop --implicit-check-not="[SYCL/registered kernels]" -!sycl_registered_kernels = !{} \ No newline at end of file +!sycl_registered_kernels = !{}