[Mlir-commits] [mlir] [mlir][ptr] Add constantop convertion (PR #204846)

lonely eagle llvmlistbot at llvm.org
Fri Jun 19 10:08:25 PDT 2026


https://github.com/linuxlonelyeagle updated https://github.com/llvm/llvm-project/pull/204846

>From 79d75f0f3e4d9e6c804d16eb6589fd1fd87244b4 Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Wed, 17 Jun 2026 12:31:41 +0000
Subject: [PATCH 1/6] add ptr.constant convert to llvm pattern.

---
 mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp | 42 ++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
index 01199155ade39..815553078206b 100644
--- a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
+++ b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
@@ -73,6 +73,16 @@ struct TypeOffsetOpConversion
   matchAndRewrite(ptr::TypeOffsetOp op, OpAdaptor adaptor,
                   ConversionPatternRewriter &rewriter) const override;
 };
+
+//===----------------------------------------------------------------------===//
+// ConstantOpConversion
+//===----------------------------------------------------------------------===//
+struct ConstantOpConversion : public ConvertOpToLLVMPattern<ptr::ConstantOp> {
+  using ConvertOpToLLVMPattern::ConvertOpToLLVMPattern;
+  LogicalResult
+  matchAndRewrite(ptr::ConstantOp op, OpAdaptor adaptor,
+                  ConversionPatternRewriter &rewriter) const override;
+};
 } // namespace
 
 //===----------------------------------------------------------------------===//
@@ -370,6 +380,35 @@ LogicalResult TypeOffsetOpConversion::matchAndRewrite(
   return success();
 }
 
+//===----------------------------------------------------------------------===//
+// ConstantOpConversion
+//===----------------------------------------------------------------------===//
+
+LogicalResult ConstantOpConversion::matchAndRewrite(
+    ptr::ConstantOp op, OpAdaptor adaptor,
+    ConversionPatternRewriter &rewriter) const {
+  mlir::TypedAttr value = op.getValue();
+  Type resultType = getTypeConverter()->convertType(op.getType());
+  if (!resultType)
+    return rewriter.notifyMatchFailure(op, "Couldn't convert the result type");
+
+  if (llvm::dyn_cast<ptr::NullAttr>(value)) {
+    rewriter.replaceOpWithNewOp<LLVM::ZeroOp>(op, resultType);
+    return llvm::success();
+  }
+
+  auto llvmPtrType = cast<LLVM::LLVMPointerType>(resultType);
+  auto addrAttr = cast<ptr::AddressAttr>(value);
+  unsigned addressSpace = llvmPtrType.getAddressSpace();
+  unsigned bitwidth = getTypeConverter()->getPointerBitwidth(addressSpace);
+  Type intType = rewriter.getIntegerType(bitwidth);
+  APInt addr = addrAttr.getValue().zextOrTrunc(bitwidth);
+  Value intConst =
+      LLVM::ConstantOp::create(rewriter, op.getLoc(), intType, addr);
+  rewriter.replaceOpWithNewOp<LLVM::IntToPtrOp>(op, resultType, intConst);
+  return llvm::success();
+}
+
 //===----------------------------------------------------------------------===//
 // ConvertToLLVMPatternInterface implementation
 //===----------------------------------------------------------------------===//
@@ -433,7 +472,8 @@ void mlir::ptr::populatePtrToLLVMConversionPatterns(
 
   // Add conversion patterns.
   patterns.add<FromPtrOpConversion, GetMetadataOpConversion, PtrAddOpConversion,
-               ToPtrOpConversion, TypeOffsetOpConversion>(converter);
+               ToPtrOpConversion, TypeOffsetOpConversion, ConstantOpConversion>(
+      converter);
 }
 
 void mlir::ptr::registerConvertPtrToLLVMInterface(DialectRegistry &registry) {

>From 0e95c2142e537c55b3dcb348541862430a61f9ef Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Wed, 17 Jun 2026 13:52:05 +0000
Subject: [PATCH 2/6] add test.

---
 mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir b/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir
index 5128fd8ccb265..d53fc19a47c90 100644
--- a/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir
+++ b/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir
@@ -316,3 +316,17 @@ func.func @test_memref_ptradd_indexing(%arg0: memref<10x?x30xf32, #ptr.generic_s
   %3 = ptr.ptr_add %0, %2 : !ptr.ptr<#ptr.generic_space>, index
   return %3 : !ptr.ptr<#ptr.generic_space>
 }
+
+// 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>) {
+  %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>
+}

>From ac95f9579db8cd48f465034edf0d27dca3490c06 Mon Sep 17 00:00:00 2001
From: lonely eagle <2020382038 at qq.com>
Date: Sat, 20 Jun 2026 00:24:39 +0800
Subject: [PATCH 3/6] Update mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp

Co-authored-by: Fabian Mora <fmora.dev at gmail.com>
---
 mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
index 815553078206b..4e098b3266720 100644
--- a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
+++ b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
@@ -406,7 +406,7 @@ LogicalResult ConstantOpConversion::matchAndRewrite(
   Value intConst =
       LLVM::ConstantOp::create(rewriter, op.getLoc(), intType, addr);
   rewriter.replaceOpWithNewOp<LLVM::IntToPtrOp>(op, resultType, intConst);
-  return llvm::success();
+  return success();
 }
 
 //===----------------------------------------------------------------------===//

>From 9982d9d98af4fc4ec62a6066665d30869fd94165 Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Fri, 19 Jun 2026 16:55:15 +0000
Subject: [PATCH 4/6] update code.

---
 mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp | 26 ++++++++++-----------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
index 4e098b3266720..1a8fd7e0b385d 100644
--- a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
+++ b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
@@ -15,8 +15,10 @@
 #include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
 #include "mlir/Dialect/LLVMIR/LLVMTypes.h"
+#include "mlir/Dialect/Ptr/IR/PtrAttrs.h"
 #include "mlir/Dialect/Ptr/IR/PtrOps.h"
 #include "mlir/IR/TypeUtilities.h"
+#include "llvm/Support/LogicalResult.h"
 #include <type_traits>
 
 using namespace mlir;
@@ -387,25 +389,23 @@ LogicalResult TypeOffsetOpConversion::matchAndRewrite(
 LogicalResult ConstantOpConversion::matchAndRewrite(
     ptr::ConstantOp op, OpAdaptor adaptor,
     ConversionPatternRewriter &rewriter) const {
-  mlir::TypedAttr value = op.getValue();
+  TypedAttr value = op.getValue();
   Type resultType = getTypeConverter()->convertType(op.getType());
   if (!resultType)
     return rewriter.notifyMatchFailure(op, "Couldn't convert the result type");
 
-  if (llvm::dyn_cast<ptr::NullAttr>(value)) {
+  if (isa<ptr::NullAttr>(value)) {
     rewriter.replaceOpWithNewOp<LLVM::ZeroOp>(op, resultType);
-    return llvm::success();
+  } else if (auto addrAttr = dyn_cast<ptr::AddressAttr>(value)) {
+    Type intType = rewriter.getIntegerType(addrAttr.getValue().getBitWidth());
+    Value intConst = LLVM::ConstantOp::create(rewriter, op.getLoc(), intType,
+                                              addrAttr.getValue());
+    rewriter.replaceOpWithNewOp<LLVM::IntToPtrOp>(op, resultType, intConst);
+  } else {
+    return rewriter.notifyMatchFailure(
+        op, "unsupported value attribute kind: " +
+                value.getAbstractAttribute().getName());
   }
-
-  auto llvmPtrType = cast<LLVM::LLVMPointerType>(resultType);
-  auto addrAttr = cast<ptr::AddressAttr>(value);
-  unsigned addressSpace = llvmPtrType.getAddressSpace();
-  unsigned bitwidth = getTypeConverter()->getPointerBitwidth(addressSpace);
-  Type intType = rewriter.getIntegerType(bitwidth);
-  APInt addr = addrAttr.getValue().zextOrTrunc(bitwidth);
-  Value intConst =
-      LLVM::ConstantOp::create(rewriter, op.getLoc(), intType, addr);
-  rewriter.replaceOpWithNewOp<LLVM::IntToPtrOp>(op, resultType, intConst);
   return success();
 }
 

>From 76725e9d827c74aff7696a5a588acc65f505236c Mon Sep 17 00:00:00 2001
From: lonely eagle <2020382038 at qq.com>
Date: Sat, 20 Jun 2026 01:03:53 +0800
Subject: [PATCH 5/6] Update mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp

Co-authored-by: Fabian Mora <fmora.dev at gmail.com>
---
 mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
index 1a8fd7e0b385d..fb9e92a3668ee 100644
--- a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
+++ b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
@@ -396,16 +396,19 @@ LogicalResult ConstantOpConversion::matchAndRewrite(
 
   if (isa<ptr::NullAttr>(value)) {
     rewriter.replaceOpWithNewOp<LLVM::ZeroOp>(op, resultType);
-  } else if (auto addrAttr = dyn_cast<ptr::AddressAttr>(value)) {
-    Type intType = rewriter.getIntegerType(addrAttr.getValue().getBitWidth());
-    Value intConst = LLVM::ConstantOp::create(rewriter, op.getLoc(), intType,
-                                              addrAttr.getValue());
-    rewriter.replaceOpWithNewOp<LLVM::IntToPtrOp>(op, resultType, intConst);
-  } else {
+    return success();
+  } 
+  auto addrAttr = dyn_cast<ptr::AddressAttr>(value);
+  // Early-exit if unknown attribute.
+  if (!addrAttr) {
     return rewriter.notifyMatchFailure(
         op, "unsupported value attribute kind: " +
                 value.getAbstractAttribute().getName());
   }
+  Type intType = rewriter.getIntegerType(addrAttr.getValue().getBitWidth());
+   Value intConst = LLVM::ConstantOp::create(rewriter, op.getLoc(), intType,
+                                            addrAttr.getValue());
+  rewriter.replaceOpWithNewOp<LLVM::IntToPtrOp>(op, resultType, intConst);
   return success();
 }
 

>From 8b6253340b25206e1a8c06faeb5c2f6ebf7d03d5 Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Fri, 19 Jun 2026 17:07:59 +0000
Subject: [PATCH 6/6] use clang-format.

---
 mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
index fb9e92a3668ee..cc1b3242c2619 100644
--- a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
+++ b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
@@ -397,7 +397,7 @@ LogicalResult ConstantOpConversion::matchAndRewrite(
   if (isa<ptr::NullAttr>(value)) {
     rewriter.replaceOpWithNewOp<LLVM::ZeroOp>(op, resultType);
     return success();
-  } 
+  }
   auto addrAttr = dyn_cast<ptr::AddressAttr>(value);
   // Early-exit if unknown attribute.
   if (!addrAttr) {
@@ -406,7 +406,7 @@ LogicalResult ConstantOpConversion::matchAndRewrite(
                 value.getAbstractAttribute().getName());
   }
   Type intType = rewriter.getIntegerType(addrAttr.getValue().getBitWidth());
-   Value intConst = LLVM::ConstantOp::create(rewriter, op.getLoc(), intType,
+  Value intConst = LLVM::ConstantOp::create(rewriter, op.getLoc(), intType,
                                             addrAttr.getValue());
   rewriter.replaceOpWithNewOp<LLVM::IntToPtrOp>(op, resultType, intConst);
   return success();



More information about the Mlir-commits mailing list