[Mlir-commits] [mlir] [mlir][ptr] Add ptr.masked_load op convert pattern to ptr-to-llvm pass (PR #205022)

lonely eagle llvmlistbot at llvm.org
Sun Jun 21 19:13:18 PDT 2026


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

`ptr.masked_load `was missing the lowering pattern to LLVM IR. This PR adds the missing conversion logic.

>From 2f1cc1fe72f8931f2b0be3f20994397a5beb8c37 Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Sun, 21 Jun 2026 08:12:39 +0000
Subject: [PATCH 1/3] add MaskLoadOpConversion to ptr-to-llvm pass.

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

diff --git a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
index cc1b3242c2619..44057ce778667 100644
--- a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
+++ b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
@@ -85,6 +85,16 @@ struct ConstantOpConversion : public ConvertOpToLLVMPattern<ptr::ConstantOp> {
   matchAndRewrite(ptr::ConstantOp op, OpAdaptor adaptor,
                   ConversionPatternRewriter &rewriter) const override;
 };
+
+//===----------------------------------------------------------------------===//
+// MaskLoadOpConversion
+//===----------------------------------------------------------------------===//
+struct MaskLoadOpConversion : public ConvertOpToLLVMPattern<ptr::MaskedLoadOp> {
+  using ConvertOpToLLVMPattern::ConvertOpToLLVMPattern;
+  LogicalResult
+  matchAndRewrite(ptr::MaskedLoadOp op, OpAdaptor adaptor,
+                  ConversionPatternRewriter &rewriter) const override;
+};
 } // namespace
 
 //===----------------------------------------------------------------------===//
@@ -412,6 +422,28 @@ LogicalResult ConstantOpConversion::matchAndRewrite(
   return success();
 }
 
+//===----------------------------------------------------------------------===//
+// MaskLoadOpConversion
+//===----------------------------------------------------------------------===//
+
+LogicalResult MaskLoadOpConversion::matchAndRewrite(
+    ptr::MaskedLoadOp op, OpAdaptor adaptor,
+    ConversionPatternRewriter &rewriter) const {
+  Type ptrType = getTypeConverter()->convertType(op.getPtr().getType());
+  if (!ptrType)
+    return rewriter.notifyMatchFailure(op, "Couldn't convert the ptr type");
+  Type resultType = getTypeConverter()->convertType(op.getType());
+  if (!resultType)
+    return rewriter.notifyMatchFailure(op, "Couldn't convert the result type");
+  unsigned alignment = 0;
+  if (std::optional<int64_t> align = op.getAlignment())
+    alignment = *align;
+  rewriter.replaceOpWithNewOp<LLVM::MaskedLoadOp>(
+      op, resultType, adaptor.getPtr(), adaptor.getMask(),
+      adaptor.getPassthrough(), alignment);
+  return success();
+}
+
 //===----------------------------------------------------------------------===//
 // ConvertToLLVMPatternInterface implementation
 //===----------------------------------------------------------------------===//
@@ -475,8 +507,8 @@ void mlir::ptr::populatePtrToLLVMConversionPatterns(
 
   // Add conversion patterns.
   patterns.add<FromPtrOpConversion, GetMetadataOpConversion, PtrAddOpConversion,
-               ToPtrOpConversion, TypeOffsetOpConversion, ConstantOpConversion>(
-      converter);
+               ToPtrOpConversion, TypeOffsetOpConversion, ConstantOpConversion,
+               MaskLoadOpConversion>(converter);
 }
 
 void mlir::ptr::registerConvertPtrToLLVMInterface(DialectRegistry &registry) {

>From f4b1ca9547fb6ffee7dc82e20538653d4a23eeea Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Sun, 21 Jun 2026 15:40:33 +0000
Subject: [PATCH 2/3] add nontemporal to ptr.masked_load op.

---
 mlir/include/mlir/Dialect/Ptr/IR/PtrOps.td | 9 +++++++--
 mlir/test/Dialect/Ptr/ops.mlir             | 2 ++
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/mlir/include/mlir/Dialect/Ptr/IR/PtrOps.td b/mlir/include/mlir/Dialect/Ptr/IR/PtrOps.td
index e14f64330c294..1f8780cf81f3d 100644
--- a/mlir/include/mlir/Dialect/Ptr/IR/PtrOps.td
+++ b/mlir/include/mlir/Dialect/Ptr/IR/PtrOps.td
@@ -299,10 +299,15 @@ def Ptr_MaskedLoadOp : Pointer_Op<"masked_load", [
   let arguments = (ins Ptr_PtrType:$ptr,
                        Ptr_Mask1DType:$mask,
                        Ptr_Any1DType:$passthrough,
-                       AlignmentProp:$alignment);
+                       AlignmentProp:$alignment,
+                       UnitProp:$nontemporal);
   let results = (outs Ptr_Any1DType:$result);
   let assemblyFormat = [{
-    $ptr `,` $mask `,` $passthrough (`alignment` `=` $alignment^)?
+    $ptr `,` $mask `,` $passthrough
+    oilist(
+      `alignment` `=` $alignment |
+      `nontemporal` $nontemporal
+    )
     attr-dict `:` qualified(type($ptr)) `->` type($result)
   }];
   let builders = [
diff --git a/mlir/test/Dialect/Ptr/ops.mlir b/mlir/test/Dialect/Ptr/ops.mlir
index 0a906ad559e21..f07295a553a52 100644
--- a/mlir/test/Dialect/Ptr/ops.mlir
+++ b/mlir/test/Dialect/Ptr/ops.mlir
@@ -89,6 +89,7 @@ func.func @scatter_ops_tensor(%value: tensor<8xi64>, %ptrs: tensor<8x!ptr.ptr<#p
 func.func @masked_load_ops(%ptr: !ptr.ptr<#ptr.generic_space>, %mask: vector<4xi1>, %passthrough: vector<4xf32>) -> vector<4xf32> {
   %0 = ptr.masked_load %ptr, %mask, %passthrough : !ptr.ptr<#ptr.generic_space> -> vector<4xf32>
   %1 = ptr.masked_load %ptr, %mask, %passthrough alignment = 16 : !ptr.ptr<#ptr.generic_space> -> vector<4xf32>
+  %2 = ptr.masked_load %ptr, %mask, %passthrough alignment = 16 nontemporal : !ptr.ptr<#ptr.generic_space> -> vector<4xf32> 
   return %0 : vector<4xf32>
 }
 
@@ -96,6 +97,7 @@ func.func @masked_load_ops(%ptr: !ptr.ptr<#ptr.generic_space>, %mask: vector<4xi
 func.func @masked_load_ops_tensor(%ptr: !ptr.ptr<#ptr.generic_space>, %mask: tensor<8xi1>, %passthrough: tensor<8xi32>) -> tensor<8xi32> {
   %0 = ptr.masked_load %ptr, %mask, %passthrough : !ptr.ptr<#ptr.generic_space> -> tensor<8xi32>
   %1 = ptr.masked_load %ptr, %mask, %passthrough alignment = 4 : !ptr.ptr<#ptr.generic_space> -> tensor<8xi32>
+  %2 = ptr.masked_load %ptr, %mask, %passthrough alignment = 4 nontemporal : !ptr.ptr<#ptr.generic_space> -> tensor<8xi32>
   return %0 : tensor<8xi32>
 }
 

>From ced5cb6761a432e65a8238cc396ce2e536b7647e Mon Sep 17 00:00:00 2001
From: linuxlonelyeagle <2020382038 at qq.com>
Date: Mon, 22 Jun 2026 01:49:36 +0000
Subject: [PATCH 3/3] add test.

---
 mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp   |  2 +-
 .../Conversion/PtrToLLVM/ptr-to-llvm.mlir     | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
index 44057ce778667..4253a0c29f2cf 100644
--- a/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
+++ b/mlir/lib/Conversion/PtrToLLVM/PtrToLLVM.cpp
@@ -440,7 +440,7 @@ LogicalResult MaskLoadOpConversion::matchAndRewrite(
     alignment = *align;
   rewriter.replaceOpWithNewOp<LLVM::MaskedLoadOp>(
       op, resultType, adaptor.getPtr(), adaptor.getMask(),
-      adaptor.getPassthrough(), alignment);
+      adaptor.getPassthrough(), alignment, op.getNontemporal());
   return success();
 }
 
diff --git a/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir b/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir
index d53fc19a47c90..1474c6cc88e64 100644
--- a/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir
+++ b/mlir/test/Conversion/PtrToLLVM/ptr-to-llvm.mlir
@@ -330,3 +330,22 @@ func.func @test_constant_address_ops() -> (!ptr.ptr<#ptr.generic_space>, !ptr.pt
   %null = ptr.constant #ptr.null : !ptr.ptr<#ptr.generic_space> 
   return %addr_0, %null : !ptr.ptr<#ptr.generic_space>, !ptr.ptr<#ptr.generic_space>
 }
+
+// CHECK-LABEL:  func @test_masked_load_ops(
+//  CHECK-SAME:    %[[ARG0:.*]]: !llvm.ptr,
+//  CHECK-SAME:    %[[ARG1:.*]]: vector<4xi1>,
+//  CHECK-SAME:    %[[ARG2:.*]]: vector<4xf32>
+//       CHECK:    %[[LOAD_0:.*]] = llvm.intr.masked.load %[[ARG0]], %[[ARG1]], %[[ARG2]] {alignment = 0 : i32} : (!llvm.ptr, vector<4xi1>, vector<4xf32>) -> vector<4xf32>
+//       CHECK:    %[[LOAD_1:.*]] = llvm.intr.masked.load %[[ARG0]], %[[ARG1]], %[[ARG2]] {alignment = 16 : i32} : (!llvm.ptr, vector<4xi1>, vector<4xf32>) -> vector<4xf32>
+//       CHECK:    %[[LOAD_2:.*]] = llvm.intr.masked.load %[[ARG0]], %[[ARG1]], %[[ARG2]] {alignment = 16 : i32, nontemporal} : (!llvm.ptr, vector<4xi1>, vector<4xf32>) -> vector<4xf32>
+//       CHECK:    %[[RET_0:.*]] = llvm.mlir.poison : !llvm.struct<(vector<4xf32>, vector<4xf32>, vector<4xf32>)>
+//       CHECK:    %[[RET_1:.*]] = llvm.insertvalue %[[LOAD_0]], %[[RET_0]][0] : !llvm.struct<(vector<4xf32>, vector<4xf32>, vector<4xf32>)>
+//       CHECK:    %[[RET_2:.*]] = llvm.insertvalue %[[LOAD_1]], %[[RET_1]][1] : !llvm.struct<(vector<4xf32>, vector<4xf32>, vector<4xf32>)>
+//       CHECK:    %[[RET_3:.*]] = llvm.insertvalue %[[LOAD_2]], %[[RET_2]][2] : !llvm.struct<(vector<4xf32>, vector<4xf32>, vector<4xf32>)>
+//       CHECK:    llvm.return %[[RET_3]] : !llvm.struct<(vector<4xf32>, vector<4xf32>, vector<4xf32>)>
+func.func @test_masked_load_ops(%ptr: !ptr.ptr<#ptr.generic_space>, %mask: vector<4xi1>, %passthrough: vector<4xf32>) -> (vector<4xf32>, vector<4xf32>, vector<4xf32>) {
+  %0 = ptr.masked_load %ptr, %mask, %passthrough : !ptr.ptr<#ptr.generic_space> -> vector<4xf32>
+  %1 = ptr.masked_load %ptr, %mask, %passthrough alignment = 16 : !ptr.ptr<#ptr.generic_space> -> vector<4xf32>
+  %2 = ptr.masked_load %ptr, %mask, %passthrough alignment = 16 nontemporal : !ptr.ptr<#ptr.generic_space> -> vector<4xf32> 
+  return %0, %1, %2 : vector<4xf32>, vector<4xf32>, vector<4xf32>
+}



More information about the Mlir-commits mailing list