[llvm] [SPIR-V] Lower clang __to_global, __to_local and __to_private builtins (PR #229211)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 5 13:47:18 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-spir-v
Author: Arseniy Obolenskiy (aobolensk)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/229211.diff
3 Files Affected:
- (modified) llvm/lib/Target/SPIRV/SPIRVBuiltins.td (+3)
- (modified) llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp (+3)
- (modified) llvm/test/CodeGen/SPIRV/transcoding/OpGenericCastToPtr.ll (+32)
``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.td b/llvm/lib/Target/SPIRV/SPIRVBuiltins.td
index 17e56694a3ed9..8f0fc7ef508de 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.td
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.td
@@ -761,6 +761,9 @@ defm : DemangledNativeBuiltin<"to_global", OpenCL_std, CastToPtr, 1, 1, OpGeneri
defm : DemangledNativeBuiltin<"to_local", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtrExplicit>;
defm : DemangledNativeBuiltin<"to_private", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtrExplicit>;
defm : DemangledNativeBuiltin<"get_fence", OpenCL_std, CastToPtr, 1, 1, OpGenericPtrMemSemantics>;
+defm : DemangledNativeBuiltin<"__to_global", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtrExplicit>;
+defm : DemangledNativeBuiltin<"__to_local", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtrExplicit>;
+defm : DemangledNativeBuiltin<"__to_private", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtrExplicit>;
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtr_ToGlobal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>;
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtr_ToLocal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>;
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtr_ToPrivate", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>;
diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
index 193503b8a30dc..f15b168f757b0 100644
--- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
@@ -1050,6 +1050,9 @@ Type *SPIRVEmitIntrinsicsImpl::deduceElementTypeHelper(
{"to_global", 0},
{"to_local", 0},
{"to_private", 0},
+ {"__to_global", 0},
+ {"__to_local", 0},
+ {"__to_private", 0},
{"__spirv_GenericCastToPtr_ToGlobal", 0},
{"__spirv_GenericCastToPtr_ToLocal", 0},
{"__spirv_GenericCastToPtr_ToPrivate", 0},
diff --git a/llvm/test/CodeGen/SPIRV/transcoding/OpGenericCastToPtr.ll b/llvm/test/CodeGen/SPIRV/transcoding/OpGenericCastToPtr.ll
index 73f0f639341a5..067055c8c0eb2 100644
--- a/llvm/test/CodeGen/SPIRV/transcoding/OpGenericCastToPtr.ll
+++ b/llvm/test/CodeGen/SPIRV/transcoding/OpGenericCastToPtr.ll
@@ -185,3 +185,35 @@ declare spir_func ptr @__spirv_GenericCastToPtrExplicit_ToPrivate(ptr addrspace(
declare spir_func ptr addrspace(1) @to_global(ptr addrspace(4))
declare spir_func ptr addrspace(3) @to_local(ptr addrspace(4))
declare spir_func ptr @to_private(ptr addrspace(4))
+
+; CHECK-SPIRV: OpFunction
+; CHECK-SPIRV: OpPtrCastToGeneric %[[#GenericIntPtr]]
+; CHECK-SPIRV-NEXT: OpPtrCastToGeneric %[[#GenericCharPtr]]
+; CHECK-SPIRV-NEXT: OpPtrCastToGeneric %[[#GenericIntPtr]]
+; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#GlobalIntPtr]] %{{.*}} CrossWorkgroup
+; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#LocalCharPtr]] %{{.*}} Workgroup
+; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#PrivateIntPtr]] %{{.*}} Function
+; CHECK-SPIRV: OpFunctionEnd
+
+define spir_kernel void @test5(ptr addrspace(1) %_arg_GlobalA, ptr byval(%id) %_arg_GlobalId, ptr addrspace(3) %_arg_LocalA) {
+entry:
+ %var = alloca i32
+ %p0 = load i64, ptr %_arg_GlobalId
+ %add = getelementptr inbounds i32, ptr addrspace(1) %_arg_GlobalA, i64 %p0
+ %p2 = load i64, ptr addrspace(1) @__spirv_BuiltInGlobalInvocationId
+ %idx = getelementptr inbounds i32, ptr addrspace(1) %add, i64 %p2
+ %var1 = addrspacecast ptr addrspace(1) %idx to ptr addrspace(4)
+ %var2 = addrspacecast ptr addrspace(3) %_arg_LocalA to ptr addrspace(4)
+ %var3 = addrspacecast ptr %var to ptr addrspace(4)
+ %G = call spir_func ptr addrspace(1) @__to_global(ptr addrspace(4) %var1)
+ %L = call spir_func ptr addrspace(3) @__to_local(ptr addrspace(4) %var2)
+ %P = call spir_func ptr @__to_private(ptr addrspace(4) %var3)
+ store i32 0, ptr addrspace(1) %G, align 4
+ store i8 0, ptr addrspace(3) %L, align 1
+ store i32 0, ptr %P, align 4
+ ret void
+}
+
+declare spir_func ptr addrspace(1) @__to_global(ptr addrspace(4))
+declare spir_func ptr addrspace(3) @__to_local(ptr addrspace(4))
+declare spir_func ptr @__to_private(ptr addrspace(4))
``````````
</details>
https://github.com/llvm/llvm-project/pull/229211
More information about the llvm-commits
mailing list