[Mlir-commits] [mlir] [mlir][ptr] Add LLVMAddrSpaceAttrInterface convert to LLVMPointerType in the ptr-to-llvm pass (PR #204946)

lonely eagle llvmlistbot at llvm.org
Sat Jun 20 12:18:57 PDT 2026


https://github.com/linuxlonelyeagle created https://github.com/llvm/llvm-project/pull/204946

The `ptr-to-llvm` conversion was missing the logic to convert `LLVMAddrSpaceAttrInterface` into the address space of `LLVMPointerType`, causing `!ptr.ptr<#llvm.address_space<1>>` to fail to resolve its address space. This PR fixes that

>From 16157370780a66a5ac06d179cddbcfa3aff3396c Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Sat, 20 Jun 2026 19:15:38 +0000
Subject: [PATCH] add LLVMAddrSpaceAttrInterface convert to LLVMPointerType in
 the ptr-to-llvm pass.

---
 mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp   |  5 ++++
 .../Conversion/PtrToLLVM/ptr-to-llvm.mlir     | 28 ++++++++++++-------
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
index cc1b3242c2619..73e7f1c84da3c 100644
--- a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
+++ b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
@@ -453,6 +453,11 @@ void mlir::ptr::populatePtrToLLVMConversionPatterns(
 
   // Add type conversions.
   converter.addConversion([&](ptr::PtrType type) -> Type {
+    if (auto memSpace =
+            dyn_cast<LLVM::LLVMAddrSpaceAttrInterface>(type.getMemorySpace()))
+      return LLVM::LLVMPointerType::get(type.getContext(),
+                                        memSpace.getAddressSpace());
+
     std::optional<Attribute> maybeAttr =
         converter.convertTypeAttribute(type, type.getMemorySpace());
     auto memSpace =
diff --git a/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir b/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir
index d53fc19a47c90..63e802f98fc9e 100644
--- a/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir
+++ b/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir
@@ -318,15 +318,23 @@ func.func @test_memref_ptradd_indexing(%arg0: memref<10x?x30xf32, #ptr.generic_s
 }
 
 // CHECK-LABEL: func @test_constant_address_ops
-//       CHECK:   %[[C_0:.*]] = llvm.mlir.constant(0 : i64) : i64
-//       CHECK:   %[[PTR_0:.*]] = llvm.inttoptr %[[C_0]] : i64 to !llvm.ptr
-//       CHECK:   %[[PTR_ZERO:.*]] = llvm.mlir.zero : !llvm.ptr
-//       CHECK:   %[[RET_0:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr)>
-//       CHECK:   %[[RET_1:.*]] = llvm.insertvalue %[[PTR_0]], %[[RET_0]][0] : !llvm.struct<(ptr, ptr)>
-//       CHECK:   %[[RET_2:.*]] = llvm.insertvalue %[[PTR_ZERO]], %[[RET_1]][1] : !llvm.struct<(ptr, ptr)>
-//       CHECK:   llvm.return %[[RET_2]] : !llvm.struct<(ptr, ptr)>
-func.func @test_constant_address_ops() -> (!ptr.ptr<#ptr.generic_space>, !ptr.ptr<#ptr.generic_space>) {
+//       CHECK:           %[[C_0:.*]] = llvm.mlir.constant(0 : i64) : i64
+//       CHECK:           %[[PTR_0:.*]] = llvm.inttoptr %[[C_0]] : i64 to !llvm.ptr
+//       CHECK:           %[[ZERO:.*]] = llvm.mlir.zero : !llvm.ptr
+//       CHECK:           %[[C_1:.*]] = llvm.mlir.constant(1 : i4) : i4
+//       CHECK:           %[[PTR_1:.*]] = llvm.inttoptr %[[C_1]] : i4 to !llvm.ptr<1>
+//       CHECK:           %[[C_2:.*]] = llvm.mlir.constant(2 : i4) : i4
+//       CHECK:           %[[PTR_2:.*]] = llvm.inttoptr %[[C_2]] : i4 to !llvm.ptr<2>
+//       CHECK:           %[[RET_0:.*]] = llvm.mlir.poison : !llvm.struct<(ptr, ptr, ptr<1>, ptr<2>)>
+//       CHECK:           %[[RET_1:.*]] = llvm.insertvalue %[[PTR_0]], %[[RET_0]][0] : !llvm.struct<(ptr, ptr, ptr<1>, ptr<2>)>
+//       CHECK:           %[[RET_2:.*]] = llvm.insertvalue %[[ZERO]], %[[RET_1]][1] : !llvm.struct<(ptr, ptr, ptr<1>, ptr<2>)>
+//       CHECK:           %[[RET_3:.*]] = llvm.insertvalue %[[PTR_1]], %[[RET_2]][2] : !llvm.struct<(ptr, ptr, ptr<1>, ptr<2>)>
+//       CHECK:           %[[RET_4:.*]] = llvm.insertvalue %[[PTR_2]], %[[RET_3]][3] : !llvm.struct<(ptr, ptr, ptr<1>, ptr<2>)>
+//       CHECK:           llvm.return %[[RET_4]] : !llvm.struct<(ptr, ptr, ptr<1>, ptr<2>)>
+func.func @test_constant_address_ops() -> (!ptr.ptr<#ptr.generic_space>, !ptr.ptr<#ptr.generic_space>, !ptr.ptr<#llvm.address_space<1>>, !ptr.ptr<#llvm.address_space<2>>) {
   %addr_0 = ptr.constant #ptr.address<0> : !ptr.ptr<#ptr.generic_space>
-  %null = ptr.constant #ptr.null : !ptr.ptr<#ptr.generic_space> 
-  return %addr_0, %null : !ptr.ptr<#ptr.generic_space>, !ptr.ptr<#ptr.generic_space>
+  %null = ptr.constant #ptr.null : !ptr.ptr<#ptr.generic_space>
+  %space_1 = ptr.constant #ptr.address<1> : !ptr.ptr<#llvm.address_space<1>>
+  %space_2 = ptr.constant #ptr.address<2> : !ptr.ptr<#llvm.address_space<2>> 
+  return %addr_0, %null, %space_1, %space_2 : !ptr.ptr<#ptr.generic_space>, !ptr.ptr<#ptr.generic_space>, !ptr.ptr<#llvm.address_space<1>>, !ptr.ptr<#llvm.address_space<2>>
 }



More information about the Mlir-commits mailing list