[clang] [CIR][CUDA] Support built-in CUDA surface type (PR #196079)
Orphic Dreamer via cfe-commits
cfe-commits at lists.llvm.org
Fri May 8 03:13:01 PDT 2026
https://github.com/Siya-05 updated https://github.com/llvm/llvm-project/pull/196079
>From 00f545475131364aba04009d94f95cdcbc329098 Mon Sep 17 00:00:00 2001
From: Sivapriya Venkateswarar <sivapriyaofficial2005 at gmail.com>
Date: Wed, 6 May 2026 17:36:31 +0400
Subject: [PATCH 1/2] [CIR][CUDA] Support built-in CUDA surface type
---
clang/lib/CIR/CodeGen/CIRGenTypes.cpp | 8 ++++++++
clang/lib/CIR/CodeGen/TargetInfo.cpp | 6 ++++++
clang/lib/CIR/CodeGen/TargetInfo.h | 4 ++++
clang/test/CIR/CodeGenCUDA/surface.cu | 21 +++++++++++++++++++++
4 files changed, 39 insertions(+)
create mode 100644 clang/test/CIR/CodeGenCUDA/surface.cu
diff --git a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp
index 85b7e854abb7f..308e1b44a6352 100644
--- a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp
@@ -295,6 +295,14 @@ mlir::Type CIRGenTypes::convertType(QualType type) {
type = astContext.getCanonicalType(type);
const Type *ty = type.getTypePtr();
+ if (astContext.getLangOpts().CUDAIsDevice) {
+ if (type->isCUDADeviceBuiltinSurfaceType()) {
+ if (mlir::Type ty =
+ cgm.getTargetCIRGenInfo().getCUDADeviceBuiltinSurfaceDeviceType())
+ return ty;
+ }
+ }
+
// Process record types before the type cache lookup.
if (const auto *recordType = dyn_cast<RecordType>(type))
return convertRecordDeclType(recordType->getDecl()->getDefinitionOrSelf());
diff --git a/clang/lib/CIR/CodeGen/TargetInfo.cpp b/clang/lib/CIR/CodeGen/TargetInfo.cpp
index f674299168960..658e46a2a9e4f 100644
--- a/clang/lib/CIR/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CIR/CodeGen/TargetInfo.cpp
@@ -130,6 +130,12 @@ class NVPTXTargetCIRGenInfo : public TargetCIRGenInfo {
public:
NVPTXTargetCIRGenInfo(CIRGenTypes &cgt)
: TargetCIRGenInfo(std::make_unique<NVPTXABIInfo>(cgt)) {}
+
+ mlir::Type getCUDADeviceBuiltinSurfaceDeviceType() const override {
+ // CUDA surface is represented as a 64-bit handle on device
+ return cir::IntType::get(&getABIInfo().cgt.getMLIRContext(), 64,
+ /*isSigned=*/true);
+ }
};
} // namespace
diff --git a/clang/lib/CIR/CodeGen/TargetInfo.h b/clang/lib/CIR/CodeGen/TargetInfo.h
index 5e0103093827b..f64305df5bccf 100644
--- a/clang/lib/CIR/CodeGen/TargetInfo.h
+++ b/clang/lib/CIR/CodeGen/TargetInfo.h
@@ -63,6 +63,10 @@ class TargetCIRGenInfo {
cir::LangAddressSpace::Default);
}
+ virtual mlir::Type getCUDADeviceBuiltinSurfaceDeviceType() const {
+ return nullptr;
+ }
+
/// Determine whether a call to an unprototyped functions under
/// the given calling convention should use the variadic
/// convention or the non-variadic convention.
diff --git a/clang/test/CIR/CodeGenCUDA/surface.cu b/clang/test/CIR/CodeGenCUDA/surface.cu
new file mode 100644
index 0000000000000..d28f876080180
--- /dev/null
+++ b/clang/test/CIR/CodeGenCUDA/surface.cu
@@ -0,0 +1,21 @@
+// REQUIRES: x86-registered-target
+// REQUIRES: nvptx-registered-target
+// RUN: %clang_cc1 -fclangir -std=c++11 -fcuda-is-device -triple nvptx64-nvidia-cuda -emit-cir -o - %s | FileCheck --check-prefix=DEVICE-CIR %s
+// RUN: %clang_cc1 -fclangir -std=c++11 -fcuda-is-device -triple nvptx64-nvidia-cuda -emit-llvm -o - %s | FileCheck --check-prefix=DEVICE-LLVM %s
+
+struct surfaceReference {
+ int desc;
+};
+
+template <typename T, int dim = 1>
+struct __attribute__((device_builtin_surface_type)) surface
+ : public surfaceReference {};
+
+template <int dim>
+struct __attribute__((device_builtin_surface_type)) surface<void, dim>
+ : public surfaceReference {};
+
+surface<void, 2> surf;
+
+// DEVICE-CIR: cir.global external target_address_space(1) @surf = #cir.poison : !s64i
+// DEVICE-LLVM: @surf ={{.*}} addrspace(1) externally_initialized global i64 poison
\ No newline at end of file
>From 0f88956e014d319c981effdf1fc7e7d9a6edef1c Mon Sep 17 00:00:00 2001
From: Sivapriya Venkateswarar <sivapriyaofficial2005 at gmail.com>
Date: Fri, 8 May 2026 14:12:08 +0400
Subject: [PATCH 2/2] [CIR][CUDA] Add trailing newline to surface test
---
clang/test/CIR/CodeGenCUDA/surface.cu | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/test/CIR/CodeGenCUDA/surface.cu b/clang/test/CIR/CodeGenCUDA/surface.cu
index d28f876080180..6044d63f85dd3 100644
--- a/clang/test/CIR/CodeGenCUDA/surface.cu
+++ b/clang/test/CIR/CodeGenCUDA/surface.cu
@@ -18,4 +18,4 @@ struct __attribute__((device_builtin_surface_type)) surface<void, dim>
surface<void, 2> surf;
// DEVICE-CIR: cir.global external target_address_space(1) @surf = #cir.poison : !s64i
-// DEVICE-LLVM: @surf ={{.*}} addrspace(1) externally_initialized global i64 poison
\ No newline at end of file
+// DEVICE-LLVM: @surf ={{.*}} addrspace(1) externally_initialized global i64 poison
More information about the cfe-commits
mailing list