[Mlir-commits] [mlir] [mlir][vector] Adding support for volatile flags in vector loads (PR #179794)

Aditya Kankariya llvmlistbot at llvm.org
Fri Feb 6 09:15:40 PST 2026


https://github.com/adityakankariya updated https://github.com/llvm/llvm-project/pull/179794

>From 8387a0bf25b62556d53c2249346712fed28719e9 Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Wed, 4 Feb 2026 13:58:23 -0800
Subject: [PATCH 01/11] Adding support for volatile flags in vector loads

---
 mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td | 10 +++++++---
 mlir/include/mlir/Dialect/Vector/IR/VectorOps.td |  7 +++++--
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
index 6f8f1481725fc..378db85c52ee7 100644
--- a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
+++ b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
@@ -1279,14 +1279,16 @@ def LoadOp : MemRef_Op<"load",
                            [MemRead]>:$memref,
                        Variadic<Index>:$indices,
                        DefaultValuedOptionalAttr<BoolAttr, "false">:$nontemporal,
+                       DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile,
                        OptionalAttr<IntValidAlignment<I64Attr>>:$alignment);
 
   let builders = [
     OpBuilder<(ins "Value":$memref,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
+                   CArg<"bool", "false">:$volatile,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, memref, indices, nontemporal,
+      return build($_builder, $_state, memref, indices, nontemporal, volatile,
                    alignment ? $_builder.getI64IntegerAttr(alignment->value()) :
                                nullptr);
     }]>,
@@ -1294,8 +1296,9 @@ def LoadOp : MemRef_Op<"load",
                    "Value":$memref,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
+                   CArg<"bool", "false">:$volatile,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, resultType, memref, indices, nontemporal,
+      return build($_builder, $_state, resultType, memref, indices, nontemporal, volatile,
                    alignment ? $_builder.getI64IntegerAttr(alignment->value()) :
                                nullptr);
     }]>,
@@ -1303,8 +1306,9 @@ def LoadOp : MemRef_Op<"load",
                    "Value":$memref,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
+                   CArg<"bool", "false">:$volatile,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, resultTypes, memref, indices, nontemporal,
+      return build($_builder, $_state, resultTypes, memref, indices, nontemporal, volatile,
                    alignment ? $_builder.getI64IntegerAttr(alignment->value()) :
                                nullptr);
     }]>
diff --git a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
index ddb04b6bbe40d..c65fc67f175cf 100644
--- a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
+++ b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
@@ -1715,6 +1715,7 @@ def Vector_LoadOp : Vector_Op<"load", [
       [MemRead]>:$base,
       Variadic<Index>:$indices,
       DefaultValuedOptionalAttr<BoolAttr, "false">:$nontemporal,
+      DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile,
       OptionalAttr<IntValidAlignment<I64Attr>>: $alignment);
 
   let builders = [
@@ -1722,8 +1723,9 @@ def Vector_LoadOp : Vector_Op<"load", [
                    "Value":$base,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
+                   CArg<"bool", "false">:$volatile,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, resultType, base, indices, nontemporal,
+      return build($_builder, $_state, resultType, base, indices, nontemporal, volatile,
                    alignment.has_value() ? $_builder.getI64IntegerAttr(alignment->value()) :
                                     nullptr);
     }]>,
@@ -1731,8 +1733,9 @@ def Vector_LoadOp : Vector_Op<"load", [
                    "Value":$base,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
+                   CArg<"bool", "false">:$volatile,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, resultTypes, base, indices, nontemporal,
+      return build($_builder, $_state, resultTypes, base, indices, nontemporal, volatile,
                    alignment.has_value() ? $_builder.getI64IntegerAttr(alignment->value()) :
                                     nullptr);
     }]>

>From 0a3d888d2a6a7b6c66648d29d3513b71068cd56d Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Wed, 4 Feb 2026 14:31:10 -0800
Subject: [PATCH 02/11] Added volatile flag support to vector store ops

---
 mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td | 4 +++-
 mlir/include/mlir/Dialect/Vector/IR/VectorOps.td | 4 +++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
index 378db85c52ee7..5eb89ab2155f5 100644
--- a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
+++ b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
@@ -2058,6 +2058,7 @@ def MemRef_StoreOp : MemRef_Op<"store",
                            [MemWrite]>:$memref,
                        Variadic<Index>:$indices,
                        DefaultValuedOptionalAttr<BoolAttr, "false">:$nontemporal,
+                       DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile,
                        OptionalAttr<IntValidAlignment<I64Attr>>:$alignment);
 
   let builders = [
@@ -2065,8 +2066,9 @@ def MemRef_StoreOp : MemRef_Op<"store",
                    "Value":$memref,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
+                   CArg<"bool", "false">:$volatile,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, valueToStore, memref, indices, nontemporal,
+      return build($_builder, $_state, valueToStore, memref, indices, nontemporal, volatile,
                    alignment ? $_builder.getI64IntegerAttr(alignment->value()) :
                                nullptr);
     }]>,
diff --git a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
index c65fc67f175cf..4784ce925638a 100644
--- a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
+++ b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
@@ -1836,6 +1836,7 @@ def Vector_StoreOp : Vector_Op<"store", [
       [MemWrite]>:$base,
       Variadic<Index>:$indices,
       DefaultValuedOptionalAttr<BoolAttr, "false">:$nontemporal,
+      DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile,
       OptionalAttr<IntValidAlignment<I64Attr>>: $alignment);
 
   let builders = [
@@ -1843,8 +1844,9 @@ def Vector_StoreOp : Vector_Op<"store", [
                    "Value":$base,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
+                   CArg<"bool", "false">:$volatile,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, valueToStore, base, indices, nontemporal,
+      return build($_builder, $_state, valueToStore, base, indices, nontemporal, volatile,
                    alignment.has_value() ? $_builder.getI64IntegerAttr(alignment->value()) :
                                     nullptr);
     }]>

>From fed9c4ff5c6a88348e651f67289ad44737c7af20 Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Wed, 4 Feb 2026 15:55:09 -0800
Subject: [PATCH 03/11] Updated tests in ops.mlir, added bailout checks for
 volatile flag, propagating volatile flag in transformation passes and LLVM
 lowering

---
 .../Conversion/MemRefToLLVM/MemRefToLLVM.cpp  |  8 +++++++
 .../MemRefToSPIRV/MemRefToSPIRV.cpp           | 20 ++++++++++++++++++
 .../VectorToLLVM/ConvertVectorToLLVM.cpp      |  4 ++--
 .../MemRef/Transforms/EmulateWideInt.cpp      |  4 ++--
 .../Transforms/ExtractAddressComputations.cpp |  5 +++--
 .../MemRef/Transforms/FoldMemRefAliasOps.cpp  | 21 ++++++++++---------
 mlir/test/Dialect/MemRef/ops.mlir             | 10 +++++++++
 mlir/test/Dialect/Vector/ops.mlir             | 10 +++++++++
 8 files changed, 66 insertions(+), 16 deletions(-)

diff --git a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
index 91a0c4b55fa84..6914473d01cc1 100644
--- a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
+++ b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
@@ -938,6 +938,10 @@ struct LoadOpLowering : public LoadStoreOpLowering<memref::LoadOp> {
                   ConversionPatternRewriter &rewriter) const override {
     auto type = loadOp.getMemRefType();
 
+    // Bail out if volatile flag is set
+    if (loadOp.getVolatile())
+      return rewriter.notifyMatchFailure(loadOp, "volatile loads not supported");
+
     // Per memref.load spec, the indices must be in-bounds:
     // 0 <= idx < dim_size, and additionally all offsets are non-negative,
     // hence inbounds and nuw are used when lowering to llvm.getelementptr.
@@ -961,6 +965,10 @@ struct StoreOpLowering : public LoadStoreOpLowering<memref::StoreOp> {
                   ConversionPatternRewriter &rewriter) const override {
     auto type = op.getMemRefType();
 
+    // Bail out if volatile flag is set
+    if (op.getVolatile())
+      return rewriter.notifyMatchFailure(op, "volatile stores not supported");
+
     // Per memref.store spec, the indices must be in-bounds:
     // 0 <= idx < dim_size, and additionally all offsets are non-negative,
     // hence inbounds and nuw are used when lowering to llvm.getelementptr.
diff --git a/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp b/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp
index 42e082f69e475..b3916ea811360 100644
--- a/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp
+++ b/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp
@@ -539,6 +539,10 @@ calculateMemoryRequirements(Value accessedPtr, LoadOrStoreOp loadOrStoreOp) {
 LogicalResult
 IntLoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
                                   ConversionPatternRewriter &rewriter) const {
+  // Bail out if volatile flag is set
+  if (loadOp.getVolatile())
+    return rewriter.notifyMatchFailure(loadOp, "volatile loads not yet supported");
+
   auto loc = loadOp.getLoc();
   auto memrefType = cast<MemRefType>(loadOp.getMemref().getType());
   if (!memrefType.getElementType().isSignlessInteger())
@@ -668,6 +672,10 @@ IntLoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
 LogicalResult
 LoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
                                ConversionPatternRewriter &rewriter) const {
+  // Bail out if volatile flag is set
+  if (loadOp.getVolatile())
+    return rewriter.notifyMatchFailure(loadOp, "volatile loads not yet supported");
+
   auto memrefType = cast<MemRefType>(loadOp.getMemref().getType());
   if (memrefType.getElementType().isSignlessInteger())
     return failure();
@@ -733,6 +741,10 @@ extractLoadCoordsForComposite(memref::LoadOp loadOp, OpAdaptor adaptor,
 LogicalResult
 ImageLoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
                                     ConversionPatternRewriter &rewriter) const {
+  // Bail out if volatile flag is set
+  if (loadOp.getVolatile())
+    return rewriter.notifyMatchFailure(loadOp, "volatile loads not yet supported");
+
   auto memrefType = cast<MemRefType>(loadOp.getMemref().getType());
 
   auto memorySpaceAttr =
@@ -818,6 +830,10 @@ ImageLoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
 LogicalResult
 IntStoreOpPattern::matchAndRewrite(memref::StoreOp storeOp, OpAdaptor adaptor,
                                    ConversionPatternRewriter &rewriter) const {
+  // Bail out if volatile flag is set
+  if (storeOp.getVolatile())
+    return rewriter.notifyMatchFailure(storeOp, "volatile stores not yet supported");
+
   auto memrefType = cast<MemRefType>(storeOp.getMemref().getType());
   if (!memrefType.getElementType().isSignlessInteger())
     return rewriter.notifyMatchFailure(storeOp,
@@ -1018,6 +1034,10 @@ LogicalResult MemorySpaceCastOpPattern::matchAndRewrite(
 LogicalResult
 StoreOpPattern::matchAndRewrite(memref::StoreOp storeOp, OpAdaptor adaptor,
                                 ConversionPatternRewriter &rewriter) const {
+  // Bail out if volatile flag is set
+  if (storeOp.getVolatile())
+    return rewriter.notifyMatchFailure(storeOp, "volatile stores not yet supported");
+
   auto memrefType = cast<MemRefType>(storeOp.getMemref().getType());
   if (memrefType.getElementType().isSignlessInteger())
     return rewriter.notifyMatchFailure(storeOp, "signless int");
diff --git a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
index 05d541fe80356..78e855fb593a5 100644
--- a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
+++ b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
@@ -194,7 +194,7 @@ static void replaceLoadOrStoreOp(vector::LoadOp loadOp,
                                  VectorType vectorTy, Value ptr, unsigned align,
                                  ConversionPatternRewriter &rewriter) {
   rewriter.replaceOpWithNewOp<LLVM::LoadOp>(loadOp, vectorTy, ptr, align,
-                                            /*volatile_=*/false,
+                                            loadOp.getVolatile(),
                                             loadOp.getNontemporal());
 }
 
@@ -211,7 +211,7 @@ static void replaceLoadOrStoreOp(vector::StoreOp storeOp,
                                  VectorType vectorTy, Value ptr, unsigned align,
                                  ConversionPatternRewriter &rewriter) {
   rewriter.replaceOpWithNewOp<LLVM::StoreOp>(storeOp, adaptor.getValueToStore(),
-                                             ptr, align, /*volatile_=*/false,
+                                             ptr, align, storeOp.getVolatile(),
                                              storeOp.getNontemporal());
 }
 
diff --git a/mlir/lib/Dialect/MemRef/Transforms/EmulateWideInt.cpp b/mlir/lib/Dialect/MemRef/Transforms/EmulateWideInt.cpp
index 6f815ae46904c..aec26a7123bbb 100644
--- a/mlir/lib/Dialect/MemRef/Transforms/EmulateWideInt.cpp
+++ b/mlir/lib/Dialect/MemRef/Transforms/EmulateWideInt.cpp
@@ -68,7 +68,7 @@ struct ConvertMemRefLoad final : OpConversionPattern<memref::LoadOp> {
 
     rewriter.replaceOpWithNewOp<memref::LoadOp>(
         op, newResTy, adaptor.getMemref(), adaptor.getIndices(),
-        op.getNontemporal());
+        op.getNontemporal(), op.getVolatile());
     return success();
   }
 };
@@ -91,7 +91,7 @@ struct ConvertMemRefStore final : OpConversionPattern<memref::StoreOp> {
 
     rewriter.replaceOpWithNewOp<memref::StoreOp>(
         op, adaptor.getValue(), adaptor.getMemref(), adaptor.getIndices(),
-        op.getNontemporal());
+        op.getNontemporal(), op.getVolatile());
     return success();
   }
 };
diff --git a/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp b/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp
index 0946da8e4e919..2acccbc9a90cb 100644
--- a/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp
+++ b/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp
@@ -43,7 +43,7 @@ static memref::LoadOp rebuildLoadOp(RewriterBase &rewriter,
                                     ArrayRef<Value> indices) {
   Location loc = loadOp.getLoc();
   return memref::LoadOp::create(rewriter, loc, srcMemRef, indices,
-                                loadOp.getNontemporal());
+                                loadOp.getNontemporal(), loadOp.getVolatile());
 }
 
 // Matches getViewSizeForEachDim specs for LoadOp.
@@ -73,7 +73,8 @@ static memref::StoreOp rebuildStoreOp(RewriterBase &rewriter,
                                       ArrayRef<Value> indices) {
   Location loc = storeOp.getLoc();
   return memref::StoreOp::create(rewriter, loc, storeOp.getValueToStore(),
-                                 srcMemRef, indices, storeOp.getNontemporal());
+                                 srcMemRef, indices, storeOp.getNontemporal(),
+                                 storeOp.getVolatile());
 }
 
 // Matches getViewSizeForEachDim specs for StoreOp.
diff --git a/mlir/lib/Dialect/MemRef/Transforms/FoldMemRefAliasOps.cpp b/mlir/lib/Dialect/MemRef/Transforms/FoldMemRefAliasOps.cpp
index 06c3392cd6732..457a3c97a9832 100644
--- a/mlir/lib/Dialect/MemRef/Transforms/FoldMemRefAliasOps.cpp
+++ b/mlir/lib/Dialect/MemRef/Transforms/FoldMemRefAliasOps.cpp
@@ -254,7 +254,8 @@ LogicalResult LoadOpOfSubViewOpFolder<OpTy>::matchAndRewrite(
   llvm::TypeSwitch<Operation *, void>(loadOp)
       .Case([&](memref::LoadOp op) {
         rewriter.replaceOpWithNewOp<memref::LoadOp>(
-            loadOp, subViewOp.getSource(), sourceIndices, op.getNontemporal());
+            loadOp, subViewOp.getSource(), sourceIndices, op.getNontemporal(),
+            op.getVolatile());
       })
       .Case([&](vector::LoadOp op) {
         rewriter.replaceOpWithNewOp<vector::LoadOp>(
@@ -307,13 +308,13 @@ LogicalResult LoadOpOfExpandShapeOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::LoadOp op) {
         rewriter.replaceOpWithNewOp<memref::LoadOp>(
             loadOp, expandShapeOp.getViewSource(), sourceIndices,
-            op.getNontemporal());
+            op.getNontemporal(), op.getVolatile());
         return success();
       })
       .Case([&](vector::LoadOp op) {
         rewriter.replaceOpWithNewOp<vector::LoadOp>(
             op, op.getType(), expandShapeOp.getViewSource(), sourceIndices,
-            op.getNontemporal());
+            op.getNontemporal(), op.getVolatile());
         return success();
       })
       .Case([&](vector::MaskedLoadOp op) {
@@ -381,12 +382,12 @@ LogicalResult LoadOpOfCollapseShapeOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::LoadOp op) {
         rewriter.replaceOpWithNewOp<memref::LoadOp>(
             loadOp, collapseShapeOp.getViewSource(), sourceIndices,
-            op.getNontemporal());
+            op.getNontemporal(), op.getVolatile());
       })
       .Case([&](vector::LoadOp op) {
         rewriter.replaceOpWithNewOp<vector::LoadOp>(
             op, op.getType(), collapseShapeOp.getViewSource(), sourceIndices,
-            op.getNontemporal());
+            op.getNontemporal(), op.getVolatile());
       })
       .Case([&](vector::MaskedLoadOp op) {
         rewriter.replaceOpWithNewOp<vector::MaskedLoadOp>(
@@ -421,7 +422,7 @@ LogicalResult StoreOpOfSubViewOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::StoreOp op) {
         rewriter.replaceOpWithNewOp<memref::StoreOp>(
             op, op.getValue(), subViewOp.getSource(), sourceIndices,
-            op.getNontemporal());
+            op.getNontemporal(), op.getVolatile());
       })
       .Case([&](vector::TransferWriteOp op) {
         rewriter.replaceOpWithNewOp<vector::TransferWriteOp>(
@@ -468,12 +469,12 @@ LogicalResult StoreOpOfExpandShapeOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::StoreOp op) {
         rewriter.replaceOpWithNewOp<memref::StoreOp>(
             storeOp, op.getValueToStore(), expandShapeOp.getViewSource(),
-            sourceIndices, op.getNontemporal());
+            sourceIndices, op.getNontemporal(), op.getVolatile());
       })
       .Case([&](vector::StoreOp op) {
         rewriter.replaceOpWithNewOp<vector::StoreOp>(
             op, op.getValueToStore(), expandShapeOp.getViewSource(),
-            sourceIndices, op.getNontemporal());
+            sourceIndices, op.getNontemporal(), op.getVolatile());
       })
       .Case([&](vector::MaskedStoreOp op) {
         rewriter.replaceOpWithNewOp<vector::MaskedStoreOp>(
@@ -500,12 +501,12 @@ LogicalResult StoreOpOfCollapseShapeOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::StoreOp op) {
         rewriter.replaceOpWithNewOp<memref::StoreOp>(
             storeOp, op.getValueToStore(), collapseShapeOp.getViewSource(),
-            sourceIndices, op.getNontemporal());
+            sourceIndices, op.getNontemporal(), op.getVolatile());
       })
       .Case([&](vector::StoreOp op) {
         rewriter.replaceOpWithNewOp<vector::StoreOp>(
             op, op.getValueToStore(), collapseShapeOp.getViewSource(),
-            sourceIndices, op.getNontemporal());
+            sourceIndices, op.getNontemporal(), op.getVolatile());
       })
       .Case([&](vector::MaskedStoreOp op) {
         rewriter.replaceOpWithNewOp<vector::MaskedStoreOp>(
diff --git a/mlir/test/Dialect/MemRef/ops.mlir b/mlir/test/Dialect/MemRef/ops.mlir
index cddc79f693b11..f80501028c38f 100644
--- a/mlir/test/Dialect/MemRef/ops.mlir
+++ b/mlir/test/Dialect/MemRef/ops.mlir
@@ -276,6 +276,16 @@ func.func @load_store_alignment(%memref: memref<4xi32>) {
   return
 }
 
+// CHECK-LABEL: func @load_store_volatile
+func.func @load_store_volatile(%memref: memref<4xi32>) {
+  %c0 = arith.constant 0 : index
+  // CHECK: memref.load {{.*}} {volatile} : memref<4xi32>
+  %val = memref.load %memref[%c0] { volatile } : memref<4xi32>
+  // CHECK: memref.store {{.*}} {volatile} : memref<4xi32>
+  memref.store %val, %memref[%c0] { volatile } : memref<4xi32>
+  return
+}
+
 // CHECK-LABEL: func @memref_view(%arg0
 func.func @memref_view(%arg0 : index, %arg1 : index, %arg2 : index) {
   %0 = memref.alloc() : memref<2048xi8>
diff --git a/mlir/test/Dialect/Vector/ops.mlir b/mlir/test/Dialect/Vector/ops.mlir
index de620221944de..9768474e2aac8 100644
--- a/mlir/test/Dialect/Vector/ops.mlir
+++ b/mlir/test/Dialect/Vector/ops.mlir
@@ -817,6 +817,16 @@ func.func @load_store_alignment(%memref: memref<4xi32>) {
   return
 }
 
+// CHECK-LABEL: func @load_store_volatile
+func.func @load_store_volatile(%memref: memref<4xi32>) {
+  %c0 = arith.constant 0 : index
+  // CHECK: vector.load {{.*}} {volatile} : memref<4xi32>, vector<4xi32>
+  %val = vector.load %memref[%c0] { volatile } : memref<4xi32>, vector<4xi32>
+  // CHECK: vector.store {{.*}} {volatile} : memref<4xi32>, vector<4xi32>
+  vector.store %val, %memref[%c0] { volatile } : memref<4xi32>, vector<4xi32>
+  return
+}
+
 // CHECK-LABEL: @masked_load_and_store
 func.func @masked_load_and_store(%base: memref<?xf32>, %mask: vector<16xi1>, %passthru: vector<16xf32>) {
   %c0 = arith.constant 0 : index

>From a245daf49cb671ff835a81f5cb496b16a3af2c00 Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Wed, 4 Feb 2026 19:01:34 -0800
Subject: [PATCH 04/11] Renamed attribute from volatile to volatile_

---
 .../mlir/Dialect/MemRef/IR/MemRefOps.td       | 20 +++++++++---------
 .../mlir/Dialect/Vector/IR/VectorOps.td       | 16 +++++++-------
 .../Conversion/MemRefToLLVM/MemRefToLLVM.cpp  |  9 ++++----
 .../MemRefToSPIRV/MemRefToSPIRV.cpp           | 21 ++++++++++---------
 .../VectorToLLVM/ConvertVectorToLLVM.cpp      |  5 +++--
 .../MemRef/Transforms/EmulateWideInt.cpp      |  5 +++--
 .../Transforms/ExtractAddressComputations.cpp |  5 +++--
 .../MemRef/Transforms/FoldMemRefAliasOps.cpp  | 21 ++++++++++---------
 mlir/test/Dialect/MemRef/ops.mlir             |  8 +++----
 mlir/test/Dialect/Vector/ops.mlir             |  8 +++----
 10 files changed, 62 insertions(+), 56 deletions(-)

diff --git a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
index 5eb89ab2155f5..99617fd6599eb 100644
--- a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
+++ b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
@@ -1279,16 +1279,16 @@ def LoadOp : MemRef_Op<"load",
                            [MemRead]>:$memref,
                        Variadic<Index>:$indices,
                        DefaultValuedOptionalAttr<BoolAttr, "false">:$nontemporal,
-                       DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile,
+                       DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile_,
                        OptionalAttr<IntValidAlignment<I64Attr>>:$alignment);
 
   let builders = [
     OpBuilder<(ins "Value":$memref,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
-                   CArg<"bool", "false">:$volatile,
+                   CArg<"bool", "false">:$volatile_,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, memref, indices, nontemporal, volatile,
+      return build($_builder, $_state, memref, indices, nontemporal, volatile_,
                    alignment ? $_builder.getI64IntegerAttr(alignment->value()) :
                                nullptr);
     }]>,
@@ -1296,9 +1296,9 @@ def LoadOp : MemRef_Op<"load",
                    "Value":$memref,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
-                   CArg<"bool", "false">:$volatile,
+                   CArg<"bool", "false">:$volatile_,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, resultType, memref, indices, nontemporal, volatile,
+      return build($_builder, $_state, resultType, memref, indices, nontemporal, volatile_,
                    alignment ? $_builder.getI64IntegerAttr(alignment->value()) :
                                nullptr);
     }]>,
@@ -1306,9 +1306,9 @@ def LoadOp : MemRef_Op<"load",
                    "Value":$memref,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
-                   CArg<"bool", "false">:$volatile,
+                   CArg<"bool", "false">:$volatile_,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, resultTypes, memref, indices, nontemporal, volatile,
+      return build($_builder, $_state, resultTypes, memref, indices, nontemporal, volatile_,
                    alignment ? $_builder.getI64IntegerAttr(alignment->value()) :
                                nullptr);
     }]>
@@ -2058,7 +2058,7 @@ def MemRef_StoreOp : MemRef_Op<"store",
                            [MemWrite]>:$memref,
                        Variadic<Index>:$indices,
                        DefaultValuedOptionalAttr<BoolAttr, "false">:$nontemporal,
-                       DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile,
+                       DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile_,
                        OptionalAttr<IntValidAlignment<I64Attr>>:$alignment);
 
   let builders = [
@@ -2066,9 +2066,9 @@ def MemRef_StoreOp : MemRef_Op<"store",
                    "Value":$memref,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
-                   CArg<"bool", "false">:$volatile,
+                   CArg<"bool", "false">:$volatile_,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, valueToStore, memref, indices, nontemporal, volatile,
+      return build($_builder, $_state, valueToStore, memref, indices, nontemporal, volatile_,
                    alignment ? $_builder.getI64IntegerAttr(alignment->value()) :
                                nullptr);
     }]>,
diff --git a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
index 4784ce925638a..4d7e73b4f131d 100644
--- a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
+++ b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
@@ -1715,7 +1715,7 @@ def Vector_LoadOp : Vector_Op<"load", [
       [MemRead]>:$base,
       Variadic<Index>:$indices,
       DefaultValuedOptionalAttr<BoolAttr, "false">:$nontemporal,
-      DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile,
+      DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile_,
       OptionalAttr<IntValidAlignment<I64Attr>>: $alignment);
 
   let builders = [
@@ -1723,9 +1723,9 @@ def Vector_LoadOp : Vector_Op<"load", [
                    "Value":$base,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
-                   CArg<"bool", "false">:$volatile,
+                   CArg<"bool", "false">:$volatile_,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, resultType, base, indices, nontemporal, volatile,
+      return build($_builder, $_state, resultType, base, indices, nontemporal, volatile_,
                    alignment.has_value() ? $_builder.getI64IntegerAttr(alignment->value()) :
                                     nullptr);
     }]>,
@@ -1733,9 +1733,9 @@ def Vector_LoadOp : Vector_Op<"load", [
                    "Value":$base,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
-                   CArg<"bool", "false">:$volatile,
+                   CArg<"bool", "false">:$volatile_,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, resultTypes, base, indices, nontemporal, volatile,
+      return build($_builder, $_state, resultTypes, base, indices, nontemporal, volatile_,
                    alignment.has_value() ? $_builder.getI64IntegerAttr(alignment->value()) :
                                     nullptr);
     }]>
@@ -1836,7 +1836,7 @@ def Vector_StoreOp : Vector_Op<"store", [
       [MemWrite]>:$base,
       Variadic<Index>:$indices,
       DefaultValuedOptionalAttr<BoolAttr, "false">:$nontemporal,
-      DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile,
+      DefaultValuedOptionalAttr<BoolAttr, "false">:$volatile_,
       OptionalAttr<IntValidAlignment<I64Attr>>: $alignment);
 
   let builders = [
@@ -1844,9 +1844,9 @@ def Vector_StoreOp : Vector_Op<"store", [
                    "Value":$base,
                    "ValueRange":$indices,
                    CArg<"bool", "false">:$nontemporal,
-                   CArg<"bool", "false">:$volatile,
+                   CArg<"bool", "false">:$volatile_,
                    CArg<"llvm::MaybeAlign", "llvm::MaybeAlign()">:$alignment), [{
-      return build($_builder, $_state, valueToStore, base, indices, nontemporal, volatile,
+      return build($_builder, $_state, valueToStore, base, indices, nontemporal, volatile_,
                    alignment.has_value() ? $_builder.getI64IntegerAttr(alignment->value()) :
                                     nullptr);
     }]>
diff --git a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
index 6914473d01cc1..53f4f6021f48c 100644
--- a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
+++ b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
@@ -938,8 +938,8 @@ struct LoadOpLowering : public LoadStoreOpLowering<memref::LoadOp> {
                   ConversionPatternRewriter &rewriter) const override {
     auto type = loadOp.getMemRefType();
 
-    // Bail out if volatile flag is set
-    if (loadOp.getVolatile())
+    // Bail out if volatile flag is set.
+    if (loadOp.getVolatile_())
       return rewriter.notifyMatchFailure(loadOp, "volatile loads not supported");
 
     // Per memref.load spec, the indices must be in-bounds:
@@ -965,8 +965,8 @@ struct StoreOpLowering : public LoadStoreOpLowering<memref::StoreOp> {
                   ConversionPatternRewriter &rewriter) const override {
     auto type = op.getMemRefType();
 
-    // Bail out if volatile flag is set
-    if (op.getVolatile())
+    // Bail out if volatile flag is set.
+    if (op.getVolatile_())
       return rewriter.notifyMatchFailure(op, "volatile stores not supported");
 
     // Per memref.store spec, the indices must be in-bounds:
@@ -2144,3 +2144,4 @@ void mlir::registerConvertMemRefToLLVMInterface(DialectRegistry &registry) {
     dialect->addInterfaces<MemRefToLLVMDialectInterface>();
   });
 }
+
diff --git a/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp b/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp
index b3916ea811360..e83950fa4bd85 100644
--- a/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp
+++ b/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp
@@ -539,8 +539,8 @@ calculateMemoryRequirements(Value accessedPtr, LoadOrStoreOp loadOrStoreOp) {
 LogicalResult
 IntLoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
                                   ConversionPatternRewriter &rewriter) const {
-  // Bail out if volatile flag is set
-  if (loadOp.getVolatile())
+  // Bail out if volatile flag is set.
+  if (loadOp.getVolatile_())
     return rewriter.notifyMatchFailure(loadOp, "volatile loads not yet supported");
 
   auto loc = loadOp.getLoc();
@@ -672,8 +672,8 @@ IntLoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
 LogicalResult
 LoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
                                ConversionPatternRewriter &rewriter) const {
-  // Bail out if volatile flag is set
-  if (loadOp.getVolatile())
+  // Bail out if volatile flag is set.
+  if (loadOp.getVolatile_())
     return rewriter.notifyMatchFailure(loadOp, "volatile loads not yet supported");
 
   auto memrefType = cast<MemRefType>(loadOp.getMemref().getType());
@@ -741,8 +741,8 @@ extractLoadCoordsForComposite(memref::LoadOp loadOp, OpAdaptor adaptor,
 LogicalResult
 ImageLoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
                                     ConversionPatternRewriter &rewriter) const {
-  // Bail out if volatile flag is set
-  if (loadOp.getVolatile())
+  // Bail out if volatile flag is set.
+  if (loadOp.getVolatile_())
     return rewriter.notifyMatchFailure(loadOp, "volatile loads not yet supported");
 
   auto memrefType = cast<MemRefType>(loadOp.getMemref().getType());
@@ -830,8 +830,8 @@ ImageLoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
 LogicalResult
 IntStoreOpPattern::matchAndRewrite(memref::StoreOp storeOp, OpAdaptor adaptor,
                                    ConversionPatternRewriter &rewriter) const {
-  // Bail out if volatile flag is set
-  if (storeOp.getVolatile())
+  // Bail out if volatile flag is set.
+  if (storeOp.getVolatile_())
     return rewriter.notifyMatchFailure(storeOp, "volatile stores not yet supported");
 
   auto memrefType = cast<MemRefType>(storeOp.getMemref().getType());
@@ -1034,8 +1034,8 @@ LogicalResult MemorySpaceCastOpPattern::matchAndRewrite(
 LogicalResult
 StoreOpPattern::matchAndRewrite(memref::StoreOp storeOp, OpAdaptor adaptor,
                                 ConversionPatternRewriter &rewriter) const {
-  // Bail out if volatile flag is set
-  if (storeOp.getVolatile())
+  // Bail out if volatile flag is set.
+  if (storeOp.getVolatile_())
     return rewriter.notifyMatchFailure(storeOp, "volatile stores not yet supported");
 
   auto memrefType = cast<MemRefType>(storeOp.getMemref().getType());
@@ -1134,3 +1134,4 @@ void populateMemRefToSPIRVPatterns(const SPIRVTypeConverter &typeConverter,
                                                       patterns.getContext());
 }
 } // namespace mlir
+
diff --git a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
index 78e855fb593a5..da126e6e4b1a3 100644
--- a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
+++ b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
@@ -194,7 +194,7 @@ static void replaceLoadOrStoreOp(vector::LoadOp loadOp,
                                  VectorType vectorTy, Value ptr, unsigned align,
                                  ConversionPatternRewriter &rewriter) {
   rewriter.replaceOpWithNewOp<LLVM::LoadOp>(loadOp, vectorTy, ptr, align,
-                                            loadOp.getVolatile(),
+                                            loadOp.getVolatile_(),
                                             loadOp.getNontemporal());
 }
 
@@ -211,7 +211,7 @@ static void replaceLoadOrStoreOp(vector::StoreOp storeOp,
                                  VectorType vectorTy, Value ptr, unsigned align,
                                  ConversionPatternRewriter &rewriter) {
   rewriter.replaceOpWithNewOp<LLVM::StoreOp>(storeOp, adaptor.getValueToStore(),
-                                             ptr, align, storeOp.getVolatile(),
+                                             ptr, align, storeOp.getVolatile_(),
                                              storeOp.getNontemporal());
 }
 
@@ -2247,3 +2247,4 @@ void mlir::vector::registerConvertVectorToLLVMInterface(
     dialect->addInterfaces<VectorToLLVMDialectInterface>();
   });
 }
+
diff --git a/mlir/lib/Dialect/MemRef/Transforms/EmulateWideInt.cpp b/mlir/lib/Dialect/MemRef/Transforms/EmulateWideInt.cpp
index aec26a7123bbb..bae83f0dcda9a 100644
--- a/mlir/lib/Dialect/MemRef/Transforms/EmulateWideInt.cpp
+++ b/mlir/lib/Dialect/MemRef/Transforms/EmulateWideInt.cpp
@@ -68,7 +68,7 @@ struct ConvertMemRefLoad final : OpConversionPattern<memref::LoadOp> {
 
     rewriter.replaceOpWithNewOp<memref::LoadOp>(
         op, newResTy, adaptor.getMemref(), adaptor.getIndices(),
-        op.getNontemporal(), op.getVolatile());
+        op.getNontemporal(), op.getVolatile_());
     return success();
   }
 };
@@ -91,7 +91,7 @@ struct ConvertMemRefStore final : OpConversionPattern<memref::StoreOp> {
 
     rewriter.replaceOpWithNewOp<memref::StoreOp>(
         op, adaptor.getValue(), adaptor.getMemref(), adaptor.getIndices(),
-        op.getNontemporal(), op.getVolatile());
+        op.getNontemporal(), op.getVolatile_());
     return success();
   }
 };
@@ -164,3 +164,4 @@ void memref::populateMemRefWideIntEmulationConversions(
         return ty.cloneWith(std::nullopt, newElemTy);
       });
 }
+
diff --git a/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp b/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp
index 2acccbc9a90cb..08c67ad9085e1 100644
--- a/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp
+++ b/mlir/lib/Dialect/MemRef/Transforms/ExtractAddressComputations.cpp
@@ -43,7 +43,7 @@ static memref::LoadOp rebuildLoadOp(RewriterBase &rewriter,
                                     ArrayRef<Value> indices) {
   Location loc = loadOp.getLoc();
   return memref::LoadOp::create(rewriter, loc, srcMemRef, indices,
-                                loadOp.getNontemporal(), loadOp.getVolatile());
+                                loadOp.getNontemporal(), loadOp.getVolatile_());
 }
 
 // Matches getViewSizeForEachDim specs for LoadOp.
@@ -74,7 +74,7 @@ static memref::StoreOp rebuildStoreOp(RewriterBase &rewriter,
   Location loc = storeOp.getLoc();
   return memref::StoreOp::create(rewriter, loc, storeOp.getValueToStore(),
                                  srcMemRef, indices, storeOp.getNontemporal(),
-                                 storeOp.getVolatile());
+                                 storeOp.getVolatile_());
 }
 
 // Matches getViewSizeForEachDim specs for StoreOp.
@@ -307,3 +307,4 @@ void memref::populateExtractAddressComputationsPatterns(
           /*rebuildOpFromAddressAndIndices=*/rebuildTransferWriteOp>>(
       patterns.getContext());
 }
+
diff --git a/mlir/lib/Dialect/MemRef/Transforms/FoldMemRefAliasOps.cpp b/mlir/lib/Dialect/MemRef/Transforms/FoldMemRefAliasOps.cpp
index 457a3c97a9832..489963ae52a9a 100644
--- a/mlir/lib/Dialect/MemRef/Transforms/FoldMemRefAliasOps.cpp
+++ b/mlir/lib/Dialect/MemRef/Transforms/FoldMemRefAliasOps.cpp
@@ -255,7 +255,7 @@ LogicalResult LoadOpOfSubViewOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::LoadOp op) {
         rewriter.replaceOpWithNewOp<memref::LoadOp>(
             loadOp, subViewOp.getSource(), sourceIndices, op.getNontemporal(),
-            op.getVolatile());
+            op.getVolatile_());
       })
       .Case([&](vector::LoadOp op) {
         rewriter.replaceOpWithNewOp<vector::LoadOp>(
@@ -308,13 +308,13 @@ LogicalResult LoadOpOfExpandShapeOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::LoadOp op) {
         rewriter.replaceOpWithNewOp<memref::LoadOp>(
             loadOp, expandShapeOp.getViewSource(), sourceIndices,
-            op.getNontemporal(), op.getVolatile());
+            op.getNontemporal(), op.getVolatile_());
         return success();
       })
       .Case([&](vector::LoadOp op) {
         rewriter.replaceOpWithNewOp<vector::LoadOp>(
             op, op.getType(), expandShapeOp.getViewSource(), sourceIndices,
-            op.getNontemporal(), op.getVolatile());
+            op.getNontemporal(), op.getVolatile_());
         return success();
       })
       .Case([&](vector::MaskedLoadOp op) {
@@ -382,12 +382,12 @@ LogicalResult LoadOpOfCollapseShapeOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::LoadOp op) {
         rewriter.replaceOpWithNewOp<memref::LoadOp>(
             loadOp, collapseShapeOp.getViewSource(), sourceIndices,
-            op.getNontemporal(), op.getVolatile());
+            op.getNontemporal(), op.getVolatile_());
       })
       .Case([&](vector::LoadOp op) {
         rewriter.replaceOpWithNewOp<vector::LoadOp>(
             op, op.getType(), collapseShapeOp.getViewSource(), sourceIndices,
-            op.getNontemporal(), op.getVolatile());
+            op.getNontemporal(), op.getVolatile_());
       })
       .Case([&](vector::MaskedLoadOp op) {
         rewriter.replaceOpWithNewOp<vector::MaskedLoadOp>(
@@ -422,7 +422,7 @@ LogicalResult StoreOpOfSubViewOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::StoreOp op) {
         rewriter.replaceOpWithNewOp<memref::StoreOp>(
             op, op.getValue(), subViewOp.getSource(), sourceIndices,
-            op.getNontemporal(), op.getVolatile());
+            op.getNontemporal(), op.getVolatile_());
       })
       .Case([&](vector::TransferWriteOp op) {
         rewriter.replaceOpWithNewOp<vector::TransferWriteOp>(
@@ -469,12 +469,12 @@ LogicalResult StoreOpOfExpandShapeOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::StoreOp op) {
         rewriter.replaceOpWithNewOp<memref::StoreOp>(
             storeOp, op.getValueToStore(), expandShapeOp.getViewSource(),
-            sourceIndices, op.getNontemporal(), op.getVolatile());
+            sourceIndices, op.getNontemporal(), op.getVolatile_());
       })
       .Case([&](vector::StoreOp op) {
         rewriter.replaceOpWithNewOp<vector::StoreOp>(
             op, op.getValueToStore(), expandShapeOp.getViewSource(),
-            sourceIndices, op.getNontemporal(), op.getVolatile());
+            sourceIndices, op.getNontemporal(), op.getVolatile_());
       })
       .Case([&](vector::MaskedStoreOp op) {
         rewriter.replaceOpWithNewOp<vector::MaskedStoreOp>(
@@ -501,12 +501,12 @@ LogicalResult StoreOpOfCollapseShapeOpFolder<OpTy>::matchAndRewrite(
       .Case([&](memref::StoreOp op) {
         rewriter.replaceOpWithNewOp<memref::StoreOp>(
             storeOp, op.getValueToStore(), collapseShapeOp.getViewSource(),
-            sourceIndices, op.getNontemporal(), op.getVolatile());
+            sourceIndices, op.getNontemporal(), op.getVolatile_());
       })
       .Case([&](vector::StoreOp op) {
         rewriter.replaceOpWithNewOp<vector::StoreOp>(
             op, op.getValueToStore(), collapseShapeOp.getViewSource(),
-            sourceIndices, op.getNontemporal(), op.getVolatile());
+            sourceIndices, op.getNontemporal(), op.getVolatile_());
       })
       .Case([&](vector::MaskedStoreOp op) {
         rewriter.replaceOpWithNewOp<vector::MaskedStoreOp>(
@@ -615,3 +615,4 @@ void FoldMemRefAliasOpsPass::runOnOperation() {
   memref::populateFoldMemRefAliasOpPatterns(patterns);
   (void)applyPatternsGreedily(getOperation(), std::move(patterns));
 }
+
diff --git a/mlir/test/Dialect/MemRef/ops.mlir b/mlir/test/Dialect/MemRef/ops.mlir
index f80501028c38f..c96f5420494d4 100644
--- a/mlir/test/Dialect/MemRef/ops.mlir
+++ b/mlir/test/Dialect/MemRef/ops.mlir
@@ -279,10 +279,10 @@ func.func @load_store_alignment(%memref: memref<4xi32>) {
 // CHECK-LABEL: func @load_store_volatile
 func.func @load_store_volatile(%memref: memref<4xi32>) {
   %c0 = arith.constant 0 : index
-  // CHECK: memref.load {{.*}} {volatile} : memref<4xi32>
-  %val = memref.load %memref[%c0] { volatile } : memref<4xi32>
-  // CHECK: memref.store {{.*}} {volatile} : memref<4xi32>
-  memref.store %val, %memref[%c0] { volatile } : memref<4xi32>
+  // CHECK: memref.load {{.*}} {volatile_} : memref<4xi32>
+  %val = memref.load %memref[%c0] { volatile_ } : memref<4xi32>
+  // CHECK: memref.store {{.*}} {volatile_} : memref<4xi32>
+  memref.store %val, %memref[%c0] { volatile_ } : memref<4xi32>
   return
 }
 
diff --git a/mlir/test/Dialect/Vector/ops.mlir b/mlir/test/Dialect/Vector/ops.mlir
index 9768474e2aac8..86a7642fa67a1 100644
--- a/mlir/test/Dialect/Vector/ops.mlir
+++ b/mlir/test/Dialect/Vector/ops.mlir
@@ -820,10 +820,10 @@ func.func @load_store_alignment(%memref: memref<4xi32>) {
 // CHECK-LABEL: func @load_store_volatile
 func.func @load_store_volatile(%memref: memref<4xi32>) {
   %c0 = arith.constant 0 : index
-  // CHECK: vector.load {{.*}} {volatile} : memref<4xi32>, vector<4xi32>
-  %val = vector.load %memref[%c0] { volatile } : memref<4xi32>, vector<4xi32>
-  // CHECK: vector.store {{.*}} {volatile} : memref<4xi32>, vector<4xi32>
-  vector.store %val, %memref[%c0] { volatile } : memref<4xi32>, vector<4xi32>
+  // CHECK: vector.load {{.*}} {volatile_} : memref<4xi32>, vector<4xi32>
+  %val = vector.load %memref[%c0] { volatile_ } : memref<4xi32>, vector<4xi32>
+  // CHECK: vector.store {{.*}} {volatile_} : memref<4xi32>, vector<4xi32>
+  vector.store %val, %memref[%c0] { volatile_ } : memref<4xi32>, vector<4xi32>
   return
 }
 

>From 607e154af84ae253bbbab09e463518ae866a3c3d Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Wed, 4 Feb 2026 19:09:50 -0800
Subject: [PATCH 05/11] Fixed clang-format issues

---
 mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp |  6 ++++--
 .../Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp    | 15 ++++++++++-----
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
index 53f4f6021f48c..67b37fa7ba8c1 100644
--- a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
+++ b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
@@ -940,7 +940,8 @@ struct LoadOpLowering : public LoadStoreOpLowering<memref::LoadOp> {
 
     // Bail out if volatile flag is set.
     if (loadOp.getVolatile_())
-      return rewriter.notifyMatchFailure(loadOp, "volatile loads not supported");
+      return rewriter.notifyMatchFailure(loadOp,
+                                         "volatile loads not supported");
 
     // Per memref.load spec, the indices must be in-bounds:
     // 0 <= idx < dim_size, and additionally all offsets are non-negative,
@@ -967,7 +968,8 @@ struct StoreOpLowering : public LoadStoreOpLowering<memref::StoreOp> {
 
     // Bail out if volatile flag is set.
     if (op.getVolatile_())
-      return rewriter.notifyMatchFailure(op, "volatile stores not supported");
+      return rewriter.notifyMatchFailure(op,
+                                         "volatile stores not supported");
 
     // Per memref.store spec, the indices must be in-bounds:
     // 0 <= idx < dim_size, and additionally all offsets are non-negative,
diff --git a/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp b/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp
index e83950fa4bd85..9341900c5002f 100644
--- a/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp
+++ b/mlir/lib/Conversion/MemRefToSPIRV/MemRefToSPIRV.cpp
@@ -541,7 +541,8 @@ IntLoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
                                   ConversionPatternRewriter &rewriter) const {
   // Bail out if volatile flag is set.
   if (loadOp.getVolatile_())
-    return rewriter.notifyMatchFailure(loadOp, "volatile loads not yet supported");
+    return rewriter.notifyMatchFailure(loadOp,
+                                       "volatile loads not supported");
 
   auto loc = loadOp.getLoc();
   auto memrefType = cast<MemRefType>(loadOp.getMemref().getType());
@@ -674,7 +675,8 @@ LoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
                                ConversionPatternRewriter &rewriter) const {
   // Bail out if volatile flag is set.
   if (loadOp.getVolatile_())
-    return rewriter.notifyMatchFailure(loadOp, "volatile loads not yet supported");
+    return rewriter.notifyMatchFailure(loadOp,
+                                       "volatile loads not supported");
 
   auto memrefType = cast<MemRefType>(loadOp.getMemref().getType());
   if (memrefType.getElementType().isSignlessInteger())
@@ -743,7 +745,8 @@ ImageLoadOpPattern::matchAndRewrite(memref::LoadOp loadOp, OpAdaptor adaptor,
                                     ConversionPatternRewriter &rewriter) const {
   // Bail out if volatile flag is set.
   if (loadOp.getVolatile_())
-    return rewriter.notifyMatchFailure(loadOp, "volatile loads not yet supported");
+    return rewriter.notifyMatchFailure(loadOp,
+                                       "volatile loads not supported");
 
   auto memrefType = cast<MemRefType>(loadOp.getMemref().getType());
 
@@ -832,7 +835,8 @@ IntStoreOpPattern::matchAndRewrite(memref::StoreOp storeOp, OpAdaptor adaptor,
                                    ConversionPatternRewriter &rewriter) const {
   // Bail out if volatile flag is set.
   if (storeOp.getVolatile_())
-    return rewriter.notifyMatchFailure(storeOp, "volatile stores not yet supported");
+    return rewriter.notifyMatchFailure(storeOp,
+                                       "volatile stores not supported");
 
   auto memrefType = cast<MemRefType>(storeOp.getMemref().getType());
   if (!memrefType.getElementType().isSignlessInteger())
@@ -1036,7 +1040,8 @@ StoreOpPattern::matchAndRewrite(memref::StoreOp storeOp, OpAdaptor adaptor,
                                 ConversionPatternRewriter &rewriter) const {
   // Bail out if volatile flag is set.
   if (storeOp.getVolatile_())
-    return rewriter.notifyMatchFailure(storeOp, "volatile stores not yet supported");
+    return rewriter.notifyMatchFailure(storeOp,
+                                       "volatile stores not supported");
 
   auto memrefType = cast<MemRefType>(storeOp.getMemref().getType());
   if (memrefType.getElementType().isSignlessInteger())

>From 2c1af890ed3ceae11d4a14221c02a1036d4e586e Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Thu, 5 Feb 2026 08:41:15 -0800
Subject: [PATCH 06/11] Fixed bugs

---
 mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp        | 4 ++--
 mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp | 8 ++++----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
index 67b37fa7ba8c1..56f5fc5e075f9 100644
--- a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
+++ b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
@@ -1157,7 +1157,7 @@ class MemRefCopyOpLowering : public ConvertOpToLLVMPattern<memref::CopyOp> {
         LLVM::GEPOp::create(rewriter, loc, targetBasePtr.getType(), elementType,
                             targetBasePtr, targetOffset);
     LLVM::MemcpyOp::create(rewriter, loc, targetPtr, srcPtr, totalSize,
-                           /*isVolatile=*/false);
+                           op.getVolatile_());
     rewriter.eraseOp(op);
 
     return success();
@@ -1351,7 +1351,7 @@ struct MemorySpaceCastOpLowering
           LLVM::SubOp::create(rewriter, loc, getIndexType(),
                               resultUnderlyingSize, bytesToSkipConst);
       LLVM::MemcpyOp::create(rewriter, loc, resultIndexVals, sourceIndexVals,
-                             copySize, /*isVolatile=*/false);
+                             copySize, op.getVolatile_());
 
       rewriter.replaceOp(op, ValueRange{result});
       return success();
diff --git a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
index da126e6e4b1a3..9835a9a04d9af 100644
--- a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
+++ b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
@@ -194,8 +194,8 @@ static void replaceLoadOrStoreOp(vector::LoadOp loadOp,
                                  VectorType vectorTy, Value ptr, unsigned align,
                                  ConversionPatternRewriter &rewriter) {
   rewriter.replaceOpWithNewOp<LLVM::LoadOp>(loadOp, vectorTy, ptr, align,
-                                            loadOp.getVolatile_(),
-                                            loadOp.getNontemporal());
+                                            loadOp.getNontemporal(),
+                                            loadOp.getVolatile_());
 }
 
 static void replaceLoadOrStoreOp(vector::MaskedLoadOp loadOp,
@@ -211,8 +211,8 @@ static void replaceLoadOrStoreOp(vector::StoreOp storeOp,
                                  VectorType vectorTy, Value ptr, unsigned align,
                                  ConversionPatternRewriter &rewriter) {
   rewriter.replaceOpWithNewOp<LLVM::StoreOp>(storeOp, adaptor.getValueToStore(),
-                                             ptr, align, storeOp.getVolatile_(),
-                                             storeOp.getNontemporal());
+                                             ptr, align, storeOp.getNontemporal(),
+                                             storeOp.getVolatile_());
 }
 
 static void replaceLoadOrStoreOp(vector::MaskedStoreOp storeOp,

>From 2698ac09c203a04c639fca6ed8d523b52ff251df Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Thu, 5 Feb 2026 08:48:01 -0800
Subject: [PATCH 07/11] Fixed load op in LowerVectorGather

---
 mlir/lib/Dialect/Vector/Transforms/LowerVectorGather.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/mlir/lib/Dialect/Vector/Transforms/LowerVectorGather.cpp b/mlir/lib/Dialect/Vector/Transforms/LowerVectorGather.cpp
index 6bc8347bc6f76..444bdadcd6d43 100644
--- a/mlir/lib/Dialect/Vector/Transforms/LowerVectorGather.cpp
+++ b/mlir/lib/Dialect/Vector/Transforms/LowerVectorGather.cpp
@@ -202,6 +202,7 @@ struct Gather1DToConditionalLoads : OpRewritePattern<vector::GatherOp> {
 
     Value result = op.getPassThru();
     BoolAttr nontemporalAttr = nullptr;
+    BoolAttr volatileAttr = nullptr;
     IntegerAttr alignmentAttr = op.getAlignmentAttr();
 
     // Emit a conditional access for each vector element.
@@ -220,7 +221,7 @@ struct Gather1DToConditionalLoads : OpRewritePattern<vector::GatherOp> {
           // and extract the single result instead.
           Value load =
               vector::LoadOp::create(b, loc, elemVecTy, base, baseOffsets,
-                                     nontemporalAttr, alignmentAttr);
+                                     nontemporalAttr, volatileAttr, alignmentAttr);
           int64_t zeroIdx[1] = {0};
           extracted = vector::ExtractOp::create(b, loc, load, zeroIdx);
         } else {

>From 8080507c63f7df8b2181dcb1679930c3624a3685 Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Thu, 5 Feb 2026 09:03:46 -0800
Subject: [PATCH 08/11] Fixed load/store op in vector masked loap/store op
 converter

---
 .../Vector/Transforms/VectorEmulateMaskedLoadStore.cpp       | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/mlir/lib/Dialect/Vector/Transforms/VectorEmulateMaskedLoadStore.cpp b/mlir/lib/Dialect/Vector/Transforms/VectorEmulateMaskedLoadStore.cpp
index 3ca08f3099bd3..c416369f86a5c 100644
--- a/mlir/lib/Dialect/Vector/Transforms/VectorEmulateMaskedLoadStore.cpp
+++ b/mlir/lib/Dialect/Vector/Transforms/VectorEmulateMaskedLoadStore.cpp
@@ -75,6 +75,7 @@ struct VectorMaskedLoadOpConverter final
           [&](OpBuilder &builder, Location loc) {
             auto loadedValue = memref::LoadOp::create(
                 builder, loc, base, indices, /*nontemporal=*/false,
+                /*volatile_=*/false,
                 llvm::MaybeAlign(maskedLoadOp.getAlignment().value_or(0)));
             auto combinedValue =
                 vector::InsertOp::create(builder, loc, loadedValue, iValue, i);
@@ -133,7 +134,8 @@ struct VectorMaskedStoreOpConverter final
     Value mask = maskedStoreOp.getMask();
     Value base = maskedStoreOp.getBase();
     Value value = maskedStoreOp.getValueToStore();
-    bool nontemporal = false;
+    bool nontemporal = false;\
+    bool volatile_ = false;
     auto indices = llvm::to_vector_of<Value>(maskedStoreOp.getIndices());
     Value one = arith::ConstantOp::create(rewriter, loc, indexType,
                                           IntegerAttr::get(indexType, 1));
@@ -145,6 +147,7 @@ struct VectorMaskedStoreOpConverter final
       auto extractedValue = vector::ExtractOp::create(rewriter, loc, value, i);
       memref::StoreOp::create(
           rewriter, loc, extractedValue, base, indices, nontemporal,
+          volatile_,
           llvm::MaybeAlign(maskedStoreOp.getAlignment().value_or(0)));
 
       rewriter.setInsertionPointAfter(ifOp);

>From 86babd7f4f06e5ead19e6e154e6b038850dc8704 Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Thu, 5 Feb 2026 10:03:38 -0800
Subject: [PATCH 09/11] Fixed bug in VectorEmulateMaskedLoadStore

---
 mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp           | 4 ++--
 mlir/lib/Dialect/Vector/Transforms/LowerVectorGather.cpp    | 6 +++---
 .../Vector/Transforms/VectorEmulateMaskedLoadStore.cpp      | 5 ++---
 3 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
index 56f5fc5e075f9..67b37fa7ba8c1 100644
--- a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
+++ b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
@@ -1157,7 +1157,7 @@ class MemRefCopyOpLowering : public ConvertOpToLLVMPattern<memref::CopyOp> {
         LLVM::GEPOp::create(rewriter, loc, targetBasePtr.getType(), elementType,
                             targetBasePtr, targetOffset);
     LLVM::MemcpyOp::create(rewriter, loc, targetPtr, srcPtr, totalSize,
-                           op.getVolatile_());
+                           /*isVolatile=*/false);
     rewriter.eraseOp(op);
 
     return success();
@@ -1351,7 +1351,7 @@ struct MemorySpaceCastOpLowering
           LLVM::SubOp::create(rewriter, loc, getIndexType(),
                               resultUnderlyingSize, bytesToSkipConst);
       LLVM::MemcpyOp::create(rewriter, loc, resultIndexVals, sourceIndexVals,
-                             copySize, op.getVolatile_());
+                             copySize, /*isVolatile=*/false);
 
       rewriter.replaceOp(op, ValueRange{result});
       return success();
diff --git a/mlir/lib/Dialect/Vector/Transforms/LowerVectorGather.cpp b/mlir/lib/Dialect/Vector/Transforms/LowerVectorGather.cpp
index 444bdadcd6d43..77e072e00f6a9 100644
--- a/mlir/lib/Dialect/Vector/Transforms/LowerVectorGather.cpp
+++ b/mlir/lib/Dialect/Vector/Transforms/LowerVectorGather.cpp
@@ -201,8 +201,8 @@ struct Gather1DToConditionalLoads : OpRewritePattern<vector::GatherOp> {
     Value lastBaseOffset = baseOffsets.back();
 
     Value result = op.getPassThru();
-    BoolAttr nontemporalAttr = nullptr;
-    BoolAttr volatileAttr = nullptr;
+    bool nontemporal = false;
+    bool volatile_ = false;
     IntegerAttr alignmentAttr = op.getAlignmentAttr();
 
     // Emit a conditional access for each vector element.
@@ -221,7 +221,7 @@ struct Gather1DToConditionalLoads : OpRewritePattern<vector::GatherOp> {
           // and extract the single result instead.
           Value load =
               vector::LoadOp::create(b, loc, elemVecTy, base, baseOffsets,
-                                     nontemporalAttr, volatileAttr, alignmentAttr);
+                                     nontemporal, volatile_, alignmentAttr);
           int64_t zeroIdx[1] = {0};
           extracted = vector::ExtractOp::create(b, loc, load, zeroIdx);
         } else {
diff --git a/mlir/lib/Dialect/Vector/Transforms/VectorEmulateMaskedLoadStore.cpp b/mlir/lib/Dialect/Vector/Transforms/VectorEmulateMaskedLoadStore.cpp
index c416369f86a5c..13ddf866ad748 100644
--- a/mlir/lib/Dialect/Vector/Transforms/VectorEmulateMaskedLoadStore.cpp
+++ b/mlir/lib/Dialect/Vector/Transforms/VectorEmulateMaskedLoadStore.cpp
@@ -134,7 +134,7 @@ struct VectorMaskedStoreOpConverter final
     Value mask = maskedStoreOp.getMask();
     Value base = maskedStoreOp.getBase();
     Value value = maskedStoreOp.getValueToStore();
-    bool nontemporal = false;\
+    bool nontemporal = false;
     bool volatile_ = false;
     auto indices = llvm::to_vector_of<Value>(maskedStoreOp.getIndices());
     Value one = arith::ConstantOp::create(rewriter, loc, indexType,
@@ -146,8 +146,7 @@ struct VectorMaskedStoreOpConverter final
       rewriter.setInsertionPointToStart(&ifOp.getThenRegion().front());
       auto extractedValue = vector::ExtractOp::create(rewriter, loc, value, i);
       memref::StoreOp::create(
-          rewriter, loc, extractedValue, base, indices, nontemporal,
-          volatile_,
+          rewriter, loc, extractedValue, base, indices, nontemporal, volatile_,
           llvm::MaybeAlign(maskedStoreOp.getAlignment().value_or(0)));
 
       rewriter.setInsertionPointAfter(ifOp);

>From 7ac274beab74e4db185df2b1486452ddfdfdb108 Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Thu, 5 Feb 2026 11:35:34 -0800
Subject: [PATCH 10/11] Using explicit syntax for volatile_ in ops.mlir

---
 .../Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp   | 11 ++++++-----
 mlir/test/Dialect/MemRef/ops.mlir                     |  8 ++++----
 mlir/test/Dialect/Vector/ops.mlir                     |  8 ++++----
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
index 9835a9a04d9af..ba31de80dd0fb 100644
--- a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
+++ b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVM.cpp
@@ -194,8 +194,8 @@ static void replaceLoadOrStoreOp(vector::LoadOp loadOp,
                                  VectorType vectorTy, Value ptr, unsigned align,
                                  ConversionPatternRewriter &rewriter) {
   rewriter.replaceOpWithNewOp<LLVM::LoadOp>(loadOp, vectorTy, ptr, align,
-                                            loadOp.getNontemporal(),
-                                            loadOp.getVolatile_());
+                                            loadOp.getVolatile_(),
+                                            loadOp.getNontemporal());
 }
 
 static void replaceLoadOrStoreOp(vector::MaskedLoadOp loadOp,
@@ -203,7 +203,8 @@ static void replaceLoadOrStoreOp(vector::MaskedLoadOp loadOp,
                                  VectorType vectorTy, Value ptr, unsigned align,
                                  ConversionPatternRewriter &rewriter) {
   rewriter.replaceOpWithNewOp<LLVM::MaskedLoadOp>(
-      loadOp, vectorTy, ptr, adaptor.getMask(), adaptor.getPassThru(), align);
+      loadOp, vectorTy, ptr, adaptor.getMask(), adaptor.getPassThru(), align,
+      loadOp.getNontemporal());
 }
 
 static void replaceLoadOrStoreOp(vector::StoreOp storeOp,
@@ -211,8 +212,8 @@ static void replaceLoadOrStoreOp(vector::StoreOp storeOp,
                                  VectorType vectorTy, Value ptr, unsigned align,
                                  ConversionPatternRewriter &rewriter) {
   rewriter.replaceOpWithNewOp<LLVM::StoreOp>(storeOp, adaptor.getValueToStore(),
-                                             ptr, align, storeOp.getNontemporal(),
-                                             storeOp.getVolatile_());
+                                             ptr, align, storeOp.getVolatile_(),
+                                             storeOp.getNontemporal());
 }
 
 static void replaceLoadOrStoreOp(vector::MaskedStoreOp storeOp,
diff --git a/mlir/test/Dialect/MemRef/ops.mlir b/mlir/test/Dialect/MemRef/ops.mlir
index c96f5420494d4..cdcb732e8cba9 100644
--- a/mlir/test/Dialect/MemRef/ops.mlir
+++ b/mlir/test/Dialect/MemRef/ops.mlir
@@ -279,10 +279,10 @@ func.func @load_store_alignment(%memref: memref<4xi32>) {
 // CHECK-LABEL: func @load_store_volatile
 func.func @load_store_volatile(%memref: memref<4xi32>) {
   %c0 = arith.constant 0 : index
-  // CHECK: memref.load {{.*}} {volatile_} : memref<4xi32>
-  %val = memref.load %memref[%c0] { volatile_ } : memref<4xi32>
-  // CHECK: memref.store {{.*}} {volatile_} : memref<4xi32>
-  memref.store %val, %memref[%c0] { volatile_ } : memref<4xi32>
+  // CHECK: memref.load {{.*}} {volatile_ = true} : memref<4xi32>
+  %val = memref.load %memref[%c0] { volatile_ = true } : memref<4xi32>
+  // CHECK: memref.store {{.*}} {volatile_ = true} : memref<4xi32>
+  memref.store %val, %memref[%c0] { volatile_ = true } : memref<4xi32>
   return
 }
 
diff --git a/mlir/test/Dialect/Vector/ops.mlir b/mlir/test/Dialect/Vector/ops.mlir
index 86a7642fa67a1..7cd57f505daa0 100644
--- a/mlir/test/Dialect/Vector/ops.mlir
+++ b/mlir/test/Dialect/Vector/ops.mlir
@@ -820,10 +820,10 @@ func.func @load_store_alignment(%memref: memref<4xi32>) {
 // CHECK-LABEL: func @load_store_volatile
 func.func @load_store_volatile(%memref: memref<4xi32>) {
   %c0 = arith.constant 0 : index
-  // CHECK: vector.load {{.*}} {volatile_} : memref<4xi32>, vector<4xi32>
-  %val = vector.load %memref[%c0] { volatile_ } : memref<4xi32>, vector<4xi32>
-  // CHECK: vector.store {{.*}} {volatile_} : memref<4xi32>, vector<4xi32>
-  vector.store %val, %memref[%c0] { volatile_ } : memref<4xi32>, vector<4xi32>
+  // CHECK: vector.load {{.*}} {volatile_ = true} : memref<4xi32>, vector<4xi32>
+  %val = vector.load %memref[%c0] { volatile_ = true } : memref<4xi32>, vector<4xi32>
+  // CHECK: vector.store {{.*}} {volatile_ = true} : memref<4xi32>, vector<4xi32>
+  vector.store %val, %memref[%c0] { volatile_ = true } : memref<4xi32>, vector<4xi32>
   return
 }
 

>From a48c6f02faadbe0ed7d2812f191f58bda690a120 Mon Sep 17 00:00:00 2001
From: Aditya Kankariya <adkankar at amd.com>
Date: Thu, 5 Feb 2026 11:51:59 -0800
Subject: [PATCH 11/11] Updated op docs

---
 .../mlir/Dialect/MemRef/IR/MemRefOps.td        | 10 ++++++++++
 .../mlir/Dialect/Vector/IR/VectorOps.td        | 18 ++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
index 99617fd6599eb..15aca876bce9f 100644
--- a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
+++ b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td
@@ -1263,6 +1263,11 @@ def LoadOp : MemRef_Op<"load",
     be reused in the cache. For details, refer to the
     [LLVM load instruction](https://llvm.org/docs/LangRef.html#load-instruction).
 
+    A set `volatile` attribute indicates that this load must not be optimized
+    away or reordered with other volatile operations. Volatile accesses are
+    guaranteed to be executed in the order they appear. For details, refer to the
+    [LLVM load instruction](https://llvm.org/docs/LangRef.html#load-instruction).
+
     An optional `alignment` attribute allows to specify the byte alignment of the
     load operation. It must be a positive power of 2. The operation must access
     memory at an address aligned to this boundary. Violations may lead to
@@ -2041,6 +2046,11 @@ def MemRef_StoreOp : MemRef_Op<"store",
     be reused in the cache. For details, refer to the
     [LLVM store instruction](https://llvm.org/docs/LangRef.html#store-instruction).
 
+    A set `volatile` attribute indicates that this store must not be optimized
+    away or reordered with other volatile operations. Volatile accesses are
+    guaranteed to be executed in the order they appear. For details, refer to the
+    [LLVM store instruction](https://llvm.org/docs/LangRef.html#store-instruction).
+
     An optional `alignment` attribute allows to specify the byte alignment of the
     store operation. It must be a positive power of 2. The operation must access
     memory at an address aligned to this boundary. Violations may lead to
diff --git a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
index 4d7e73b4f131d..37bb7c7ec3786 100644
--- a/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
+++ b/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td
@@ -1705,6 +1705,15 @@ def Vector_LoadOp : Vector_Op<"load", [
     %result = vector.load %memref[%c0] : memref<7xf32>, vector<8xf32>
     ```
 
+    A set `nontemporal` attribute indicates that this load is not expected to
+    be reused in the cache. For details, refer to the
+    [LLVM load instruction](https://llvm.org/docs/LangRef.html#load-instruction).
+
+    A set `volatile` attribute indicates that this load must not be optimized
+    away or reordered with other volatile operations. Volatile accesses are
+    guaranteed to be executed in the order they appear. For details, refer to the
+    [LLVM load instruction](https://llvm.org/docs/LangRef.html#load-instruction).
+
     An optional `alignment` attribute allows to specify the byte alignment of the
     load operation. It must be a positive power of 2. The operation must access
     memory at an address aligned to this boundary. Violating this requirement
@@ -1824,6 +1833,15 @@ def Vector_StoreOp : Vector_Op<"store", [
     vector.store %valueToStore, %memref[%c0] : memref<7xf32>, vector<8xf32>
     ```
 
+    A set `nontemporal` attribute indicates that this store is not expected to
+    be reused in the cache. For details, refer to the
+    [LLVM store instruction](https://llvm.org/docs/LangRef.html#store-instruction).
+
+    A set `volatile` attribute indicates that this store must not be optimized
+    away or reordered with other volatile operations. Volatile accesses are
+    guaranteed to be executed in the order they appear. For details, refer to the
+    [LLVM store instruction](https://llvm.org/docs/LangRef.html#store-instruction).
+
     An optional `alignment` attribute allows to specify the byte alignment of the
     store operation. It must be a positive power of 2. The operation must access
     memory at an address aligned to this boundary. Violating this requirement



More information about the Mlir-commits mailing list