[clang] [CIR][CUDA] Add semantic surface reference type (PR #223013)

via cfe-commits cfe-commits at lists.llvm.org
Sun Sep 13 19:13:09 PDT 2026


https://github.com/Siya-05 updated https://github.com/llvm/llvm-project/pull/223013

>From 272088a1d31bab8c0d50d93587093bd26e69ae80 Mon Sep 17 00:00:00 2001
From: Sivapriya <sivapriyaofficial2005 at gmail.com>
Date: Fri, 11 Sep 2026 18:28:54 +0000
Subject: [PATCH 1/2] [CIR][CUDA] Add semantic surface reference type

---
 clang/include/clang/CIR/Dialect/IR/CIRTypes.td  | 17 ++++++++++++++++-
 clang/lib/CIR/CodeGen/Targets/NVPTX.cpp         |  5 +----
 .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp   |  3 +++
 clang/test/CIR/CodeGenCUDA/surface.cu           |  2 +-
 4 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/clang/include/clang/CIR/Dialect/IR/CIRTypes.td b/clang/include/clang/CIR/Dialect/IR/CIRTypes.td
index c969bdbe322395..c8333e884e8c38 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIRTypes.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIRTypes.td
@@ -401,6 +401,20 @@ def CIR_VPtrType : CIR_Type<"VPtr", "vptr", [
   }];
 }
 
+//===----------------------------------------------------------------------===//
+// CUDADeviceSurfaceType
+//===----------------------------------------------------------------------===//
+
+def CIR_CUDADeviceSurfaceType :
+    CIR_Type<"CUDADeviceSurface", "cuda_surface"> {
+  let summary = "CUDA device surface reference type";
+  let description = [{
+    `!cir.cuda_surface` represents a CUDA built-in surface reference in CIR.
+    The type preserves surface semantics at the CIR level and is lowered to
+    the target device representation during lowering to LLVM IR.
+  }];
+}
+
 //===----------------------------------------------------------------------===//
 // CUDADeviceTextureType
 //===----------------------------------------------------------------------===//
@@ -1165,7 +1179,8 @@ def CIR_AnyType : AnyTypeOf<[
   CIR_VoidType, CIR_BoolType, CIR_ArrayType, CIR_VectorType, CIR_IntType,
   CIR_AnyFloatType, CIR_PointerType, CIR_FuncType, CIR_StructType,
   CIR_UnionType, CIR_BitFieldType,
-  CIR_ComplexType, CIR_VPtrType, CIR_CUDADeviceTextureType,
+  CIR_ComplexType, CIR_VPtrType, CIR_CUDADeviceSurfaceType,
+  CIR_CUDADeviceTextureType,
   CIR_DataMemberType, CIR_MethodType,
   CIR_EhTokenType, CIR_CleanupTokenType, CIR_CatchTokenType
 ]>;
diff --git a/clang/lib/CIR/CodeGen/Targets/NVPTX.cpp b/clang/lib/CIR/CodeGen/Targets/NVPTX.cpp
index 9d9b5b196ac5b2..8fecef08316156 100644
--- a/clang/lib/CIR/CodeGen/Targets/NVPTX.cpp
+++ b/clang/lib/CIR/CodeGen/Targets/NVPTX.cpp
@@ -110,10 +110,7 @@ class NVPTXTargetCIRGenInfo : public TargetCIRGenInfo {
   }
 
   mlir::Type getCUDADeviceBuiltinSurfaceDeviceType() const override {
-    // On the device side, surface reference is represented as an object handle
-    // in 64-bit integer.
-    return cir::IntType::get(&getABIInfo().cgt.getMLIRContext(), 64,
-                             /*isSigned=*/true);
+    return cir::CUDADeviceSurfaceType::get(&getABIInfo().cgt.getMLIRContext());
   }
 
   mlir::Type getCUDADeviceBuiltinTextureDeviceType() const override {
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 31e01c770c55b4..b08f7e8f05b9af 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -3855,6 +3855,9 @@ static void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
     assert(!cir::MissingFeatures::addressSpace());
     return mlir::LLVM::LLVMPointerType::get(type.getContext());
   });
+  converter.addConversion([&](cir::CUDADeviceSurfaceType type) -> mlir::Type {
+    return mlir::IntegerType::get(type.getContext(), 64);
+  });
   converter.addConversion([&](cir::CUDADeviceTextureType type) -> mlir::Type {
     return mlir::IntegerType::get(type.getContext(), 64);
   });
diff --git a/clang/test/CIR/CodeGenCUDA/surface.cu b/clang/test/CIR/CodeGenCUDA/surface.cu
index 6ec9b53ad64731..67d7257c07c6e5 100644
--- a/clang/test/CIR/CodeGenCUDA/surface.cu
+++ b/clang/test/CIR/CodeGenCUDA/surface.cu
@@ -18,7 +18,7 @@ struct __attribute__((device_builtin_surface_type)) surface<void, dim>
 
 surface<void, 2> surf;
 
-// CIR-DEVICE: cir.global external target_address_space(1) @surf = #cir.undef : !s64i
+// CIR-DEVICE: cir.global external target_address_space(1) @surf = #cir.undef : !cir.cuda_surface
 
 // CIR now matches OG CodeGen and emits undef for CUDA shadow variables.
 // LLVM-DEVICE: @surf ={{.*}} addrspace(1) externally_initialized global i64 undef

>From 223aa1c1c326bc6d94bd70ffee6a4ca0c60ce0c5 Mon Sep 17 00:00:00 2001
From: Sivapriya <sivapriyaofficial2005 at gmail.com>
Date: Mon, 14 Sep 2026 02:12:46 +0000
Subject: [PATCH 2/2] [CIR][CUDA] Address review comments

---
 clang/include/clang/CIR/Dialect/IR/CIRTypes.td      | 4 ++--
 clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 2 ++
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/CIR/Dialect/IR/CIRTypes.td b/clang/include/clang/CIR/Dialect/IR/CIRTypes.td
index c8333e884e8c38..674f6cffb32f41 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIRTypes.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIRTypes.td
@@ -410,8 +410,8 @@ def CIR_CUDADeviceSurfaceType :
   let summary = "CUDA device surface reference type";
   let description = [{
     `!cir.cuda_surface` represents a CUDA built-in surface reference in CIR.
-    The type preserves surface semantics at the CIR level and is lowered to
-    the target device representation during lowering to LLVM IR.
+    The type preserves surface semantics at the CIR level and lowers to the NVPTX
+    device-side handle representation (`i64`) during lowering to LLVM IR.
   }];
 }
 
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index b08f7e8f05b9af..8ccaba5d4ab202 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -3855,6 +3855,8 @@ static void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
     assert(!cir::MissingFeatures::addressSpace());
     return mlir::LLVM::LLVMPointerType::get(type.getContext());
   });
+  // On the device side, surface reference is represented as an object handle
+  // in 64-bit integer.
   converter.addConversion([&](cir::CUDADeviceSurfaceType type) -> mlir::Type {
     return mlir::IntegerType::get(type.getContext(), 64);
   });



More information about the cfe-commits mailing list