[Mlir-commits] [mlir] [mlir][vector] Adding support for volatile flags in vector loads (PR #179794)
Aditya Kankariya
llvmlistbot at llvm.org
Thu Feb 5 09:04:12 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 1/8] 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 2/8] 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 3/8] 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 4/8] 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 ®istry) {
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 5/8] 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 6/8] 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 7/8] 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 8/8] 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);
More information about the Mlir-commits
mailing list