https://github.com/aobolensk created 
https://github.com/llvm/llvm-project/pull/233756

Lower __builtin_amdgcn_load_to_lds, load_async_to_lds and 
cluster_load_b{32,64,128} to their overloaded intrinsics, matching classic 
codegen

>From f5898322d065bee79ecd6e3871d701fff9989314 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <[email protected]>
Date: Tue, 20 Oct 2026 11:25:17 +0200
Subject: [PATCH] [CIR][AMDGPU] Support load to LDS and cluster load builtins

Lower __builtin_amdgcn_load_to_lds, load_async_to_lds and 
cluster_load_b{32,64,128} to their overloaded intrinsics, matching classic 
codegen
---
 clang/lib/CIR/CodeGen/CIRGenBuiltinAMDGPU.cpp | 35 +++++++++++++------
 .../CodeGenHIP/builtins-amdgcn-gfx1250.hip    | 27 ++++++++++++++
 .../CIR/CodeGenHIP/builtins-amdgcn-gfx950.hip | 19 ++++++++++
 3 files changed, 71 insertions(+), 10 deletions(-)

diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAMDGPU.cpp 
b/clang/lib/CIR/CodeGen/CIRGenBuiltinAMDGPU.cpp
index cf2a424c341489..4e62f3f1b026cb 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAMDGPU.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAMDGPU.cpp
@@ -824,17 +824,32 @@ CIRGenFunction::emitAMDGPUBuiltinExpr(unsigned builtinId,
   case AMDGPU::BI__builtin_amdgcn_cluster_load_b32:
   case AMDGPU::BI__builtin_amdgcn_cluster_load_b64:
   case AMDGPU::BI__builtin_amdgcn_cluster_load_b128: {
-    cgm.errorNYI(expr->getSourceRange(),
-                 std::string("unimplemented AMDGPU builtin call: ") +
-                     getContext().BuiltinInfo.getName(builtinId));
-    return mlir::Value{};
-  }
-  case AMDGPU::BI__builtin_amdgcn_load_to_lds: {
-    cgm.errorNYI(expr->getSourceRange(),
-                 std::string("unimplemented AMDGPU builtin call: ") +
-                     getContext().BuiltinInfo.getName(builtinId));
-    return mlir::Value{};
+    llvm::StringRef intrinsicName;
+    switch (builtinId) {
+    case AMDGPU::BI__builtin_amdgcn_cluster_load_b32:
+      intrinsicName = "amdgcn.cluster.load.b32";
+      break;
+    case AMDGPU::BI__builtin_amdgcn_cluster_load_b64:
+      intrinsicName = "amdgcn.cluster.load.b64";
+      break;
+    case AMDGPU::BI__builtin_amdgcn_cluster_load_b128:
+      intrinsicName = "amdgcn.cluster.load.b128";
+      break;
+    }
+    return emitBuiltinWithOneOverloadedType<3>(expr, intrinsicName,
+                                               convertType(expr->getType()))
+        .getValue();
   }
+  case AMDGPU::BI__builtin_amdgcn_load_to_lds:
+    return emitBuiltinWithOneOverloadedType<5>(
+               expr, "amdgcn.load.to.lds",
+               cir::VoidType::get(builder.getContext()))
+        .getValue();
+  case AMDGPU::BI__builtin_amdgcn_load_async_to_lds:
+    return emitBuiltinWithOneOverloadedType<5>(
+               expr, "amdgcn.load.async.to.lds",
+               cir::VoidType::get(builder.getContext()))
+        .getValue();
   case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_32x4B:
   case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_store_32x4B:
   case AMDGPU::BI__builtin_amdgcn_cooperative_atomic_load_16x8B:
diff --git a/clang/test/CIR/CodeGenHIP/builtins-amdgcn-gfx1250.hip 
b/clang/test/CIR/CodeGenHIP/builtins-amdgcn-gfx1250.hip
index 3c400aec174e23..216d0643ab2446 100644
--- a/clang/test/CIR/CodeGenHIP/builtins-amdgcn-gfx1250.hip
+++ b/clang/test/CIR/CodeGenHIP/builtins-amdgcn-gfx1250.hip
@@ -151,3 +151,30 @@ __device__ void test_permlane_xor(unsigned int* out, 
unsigned int src0,
                                   unsigned int src1, unsigned int src2) {
   *out = __builtin_amdgcn_permlane_xor(src0, src1, src2);
 }
+
+typedef int v2i __attribute__((ext_vector_type(2)));
+typedef int v4i __attribute__((ext_vector_type(4)));
+
+// CIR-LABEL: @_Z21test_cluster_load_b32PiPU3AS1ii
+// CIR: cir.call_llvm_intrinsic "amdgcn.cluster.load.b32" {{.*}} : 
(!cir.ptr<!s32i, target_address_space(1)>, !s32i, !s32i) -> !s32i
+// LLVM: define{{.*}} void @_Z21test_cluster_load_b32PiPU3AS1ii
+// LLVM: call{{.*}} i32 @llvm.amdgcn.cluster.load.b32.i32(ptr addrspace(1) 
%{{.+}}, i32 10, i32 %{{.+}})
+__device__ void test_cluster_load_b32(int* out, global int* inptr, int mask) {
+  *out = __builtin_amdgcn_cluster_load_b32(inptr, 10, mask);
+}
+
+// CIR-LABEL: @_Z21test_cluster_load_b64PDv2_iPU3AS1S_i
+// CIR: cir.call_llvm_intrinsic "amdgcn.cluster.load.b64" {{.*}} : 
(!cir.ptr<!cir.vector<2 x !s32i>, target_address_space(1)>, !s32i, !s32i) -> 
!cir.vector<2 x !s32i>
+// LLVM: define{{.*}} void @_Z21test_cluster_load_b64PDv2_iPU3AS1S_i
+// LLVM: call{{.*}} <2 x i32> @llvm.amdgcn.cluster.load.b64.v2i32(ptr 
addrspace(1) %{{.+}}, i32 22, i32 %{{.+}})
+__device__ void test_cluster_load_b64(v2i* out, global v2i* inptr, int mask) {
+  *out = __builtin_amdgcn_cluster_load_b64(inptr, 22, mask);
+}
+
+// CIR-LABEL: @_Z22test_cluster_load_b128PDv4_iPU3AS1S_i
+// CIR: cir.call_llvm_intrinsic "amdgcn.cluster.load.b128" {{.*}} : 
(!cir.ptr<!cir.vector<4 x !s32i>, target_address_space(1)>, !s32i, !s32i) -> 
!cir.vector<4 x !s32i>
+// LLVM: define{{.*}} void @_Z22test_cluster_load_b128PDv4_iPU3AS1S_i
+// LLVM: call{{.*}} <4 x i32> @llvm.amdgcn.cluster.load.b128.v4i32(ptr 
addrspace(1) %{{.+}}, i32 27, i32 %{{.+}})
+__device__ void test_cluster_load_b128(v4i* out, global v4i* inptr, int mask) {
+  *out = __builtin_amdgcn_cluster_load_b128(inptr, 27, mask);
+}
diff --git a/clang/test/CIR/CodeGenHIP/builtins-amdgcn-gfx950.hip 
b/clang/test/CIR/CodeGenHIP/builtins-amdgcn-gfx950.hip
index 4fd0e12d6b0439..aec538eae5a5cd 100644
--- a/clang/test/CIR/CodeGenHIP/builtins-amdgcn-gfx950.hip
+++ b/clang/test/CIR/CodeGenHIP/builtins-amdgcn-gfx950.hip
@@ -31,3 +31,22 @@ __device__ void test_bitop3_b16(global unsigned short* out, 
unsigned short a,
                                 unsigned short b, unsigned short c) {
   *out = __builtin_amdgcn_bitop3_b16(a, b, c, 1);
 }
+
+// CIR-LABEL: @_Z16test_load_to_ldsPjS_
+// CIR: cir.call_llvm_intrinsic "amdgcn.load.to.lds" {{.*}} : 
(!cir.ptr<!void>, !cir.ptr<!void, target_address_space(3)>, !u32i, !s32i, 
!u32i) -> !void
+// LLVM: define{{.*}} void @_Z16test_load_to_ldsPjS_
+// LLVM: call void @llvm.amdgcn.load.to.lds.p0(ptr %{{.+}}, ptr addrspace(3) 
%{{.+}}, i32 4, i32 0, i32 0)
+__device__ void test_load_to_lds(unsigned int* src, unsigned int* dst) {
+  __builtin_amdgcn_load_to_lds(src, dst, /*size=*/4, /*offset=*/0, /*aux=*/0);
+}
+
+// CIR-LABEL: @_Z22test_load_async_to_ldsPU3AS1jPU3AS3j
+// CIR: cir.call_llvm_intrinsic "amdgcn.load.async.to.lds" {{.*}} : 
(!cir.ptr<!void, target_address_space(1)>, !cir.ptr<!void, 
target_address_space(3)>, !u32i, !s32i, !u32i) -> !void
+// LLVM: define{{.*}} void @_Z22test_load_async_to_ldsPU3AS1jPU3AS3j
+// LLVM: call void @llvm.amdgcn.load.async.to.lds.p1(ptr addrspace(1) %{{.+}}, 
ptr addrspace(3) %{{.+}}, i32 16, i32 8, i32 1)
+__device__ void
+test_load_async_to_lds(global unsigned int* src,
+                       __attribute__((address_space(3))) unsigned int* dst) {
+  __builtin_amdgcn_load_async_to_lds(src, dst, /*size=*/16, /*offset=*/8,
+                                     /*aux=*/1);
+}

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to