[Mlir-commits] [mlir] 5b46a5d - [mlir][SPIR-V] Verify memory semantics for AtomicLoad/Store/Exchange/CompareExchange ops (#212990)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Oct 1 03:34:17 PDT 2026
Author: Arseniy Obolenskiy
Date: 2026-10-01T12:34:05+02:00
New Revision: 5b46a5d578269aca9e1f74b79f23bddc7af9a2b5
URL: https://github.com/llvm/llvm-project/commit/5b46a5d578269aca9e1f74b79f23bddc7af9a2b5
DIFF: https://github.com/llvm/llvm-project/commit/5b46a5d578269aca9e1f74b79f23bddc7af9a2b5.diff
LOG: [mlir][SPIR-V] Verify memory semantics for AtomicLoad/Store/Exchange/CompareExchange ops (#212990)
Added:
Modified:
mlir/include/mlir/Dialect/SPIRV/IR/SPIRVAtomicOps.td
mlir/lib/Dialect/SPIRV/IR/AtomicOps.cpp
mlir/test/Dialect/SPIRV/IR/atomic-ops.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVAtomicOps.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVAtomicOps.td
index d756a923b744f..c706e39c4eb0c 100644
--- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVAtomicOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVAtomicOps.td
@@ -172,7 +172,6 @@ def SPIRV_AtomicCompareExchangeOp : SPIRV_Op<"AtomicCompareExchange", [
}];
let hasCustomAssemblyFormat = 0;
- let hasVerifier = 0;
}
// -----
@@ -226,7 +225,6 @@ def SPIRV_AtomicCompareExchangeWeakOp : SPIRV_Op<"AtomicCompareExchangeWeak", [
}];
let hasCustomAssemblyFormat = 0;
- let hasVerifier = 0;
}
// -----
@@ -272,7 +270,6 @@ def SPIRV_AtomicLoadOp : SPIRV_Op<"AtomicLoad", [
}];
let hasCustomAssemblyFormat = 0;
- let hasVerifier = 0;
}
// -----
@@ -315,7 +312,6 @@ def SPIRV_AtomicStoreOp : SPIRV_Op<"AtomicStore", [
}];
let hasCustomAssemblyFormat = 0;
- let hasVerifier = 0;
}
// -----
@@ -371,7 +367,6 @@ def SPIRV_AtomicExchangeOp : SPIRV_Op<"AtomicExchange", [
}];
let hasCustomAssemblyFormat = 0;
- let hasVerifier = 0;
}
// -----
diff --git a/mlir/lib/Dialect/SPIRV/IR/AtomicOps.cpp b/mlir/lib/Dialect/SPIRV/IR/AtomicOps.cpp
index a7600833c3a2d..21a7e1dd99fe6 100644
--- a/mlir/lib/Dialect/SPIRV/IR/AtomicOps.cpp
+++ b/mlir/lib/Dialect/SPIRV/IR/AtomicOps.cpp
@@ -57,6 +57,50 @@ LogicalResult AtomicAndOp::verify() {
return verifyAtomicUpdateOp<AtomicAndOp, IntegerType>(getOperation());
}
+//===----------------------------------------------------------------------===//
+// spirv.AtomicCompareExchangeOp
+//===----------------------------------------------------------------------===//
+
+LogicalResult AtomicCompareExchangeOp::verify() {
+ if (failed(verifyMemorySemantics(getOperation(), getEqualSemantics())))
+ return failure();
+ return verifyMemorySemantics(getOperation(), getUnequalSemantics());
+}
+
+//===----------------------------------------------------------------------===//
+// spirv.AtomicCompareExchangeWeakOp
+//===----------------------------------------------------------------------===//
+
+LogicalResult AtomicCompareExchangeWeakOp::verify() {
+ if (failed(verifyMemorySemantics(getOperation(), getEqualSemantics())))
+ return failure();
+ return verifyMemorySemantics(getOperation(), getUnequalSemantics());
+}
+
+//===----------------------------------------------------------------------===//
+// spirv.AtomicExchangeOp
+//===----------------------------------------------------------------------===//
+
+LogicalResult AtomicExchangeOp::verify() {
+ return verifyMemorySemantics(getOperation(), getSemantics());
+}
+
+//===----------------------------------------------------------------------===//
+// spirv.AtomicLoadOp
+//===----------------------------------------------------------------------===//
+
+LogicalResult AtomicLoadOp::verify() {
+ return verifyMemorySemantics(getOperation(), getSemantics());
+}
+
+//===----------------------------------------------------------------------===//
+// spirv.AtomicStoreOp
+//===----------------------------------------------------------------------===//
+
+LogicalResult AtomicStoreOp::verify() {
+ return verifyMemorySemantics(getOperation(), getSemantics());
+}
+
//===----------------------------------------------------------------------===//
// spirv.AtomicIAddOp
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/Dialect/SPIRV/IR/atomic-ops.mlir b/mlir/test/Dialect/SPIRV/IR/atomic-ops.mlir
index feaa9123fd715..8fb91617aa2fe 100644
--- a/mlir/test/Dialect/SPIRV/IR/atomic-ops.mlir
+++ b/mlir/test/Dialect/SPIRV/IR/atomic-ops.mlir
@@ -73,6 +73,22 @@ func.func @atomic_compare_exchange(%ptr: !spirv.ptr<i64, Workgroup>, %value: i32
// -----
+func.func @atomic_compare_exchange(%ptr: !spirv.ptr<i32, Workgroup>, %value: i32, %comparator: i32) -> i32 {
+ // expected-error @+1 {{expected at most one of these four memory constraints to be set: `Acquire`, `Release`,`AcquireRelease` or `SequentiallyConsistent`}}
+ %0 = spirv.AtomicCompareExchange <Workgroup> <Acquire|Release> <None> %ptr, %value, %comparator: !spirv.ptr<i32, Workgroup>
+ return %0: i32
+}
+
+// -----
+
+func.func @atomic_compare_exchange_unequal(%ptr: !spirv.ptr<i32, Workgroup>, %value: i32, %comparator: i32) -> i32 {
+ // expected-error @+1 {{expected at most one of these four memory constraints to be set: `Acquire`, `Release`,`AcquireRelease` or `SequentiallyConsistent`}}
+ %0 = spirv.AtomicCompareExchange <Workgroup> <None> <Acquire|Release> %ptr, %value, %comparator: !spirv.ptr<i32, Workgroup>
+ return %0: i32
+}
+
+// -----
+
//===----------------------------------------------------------------------===//
// spirv.AtomicCompareExchangeWeak
//===----------------------------------------------------------------------===//
@@ -109,6 +125,22 @@ func.func @atomic_compare_exchange_weak(%ptr: !spirv.ptr<i64, Workgroup>, %value
// -----
+func.func @atomic_compare_exchange_weak(%ptr: !spirv.ptr<i32, Workgroup>, %value: i32, %comparator: i32) -> i32 {
+ // expected-error @+1 {{expected at most one of these four memory constraints to be set: `Acquire`, `Release`,`AcquireRelease` or `SequentiallyConsistent`}}
+ %0 = spirv.AtomicCompareExchangeWeak <Workgroup> <Acquire|Release> <None> %ptr, %value, %comparator: !spirv.ptr<i32, Workgroup>
+ return %0: i32
+}
+
+// -----
+
+func.func @atomic_compare_exchange_weak_unequal(%ptr: !spirv.ptr<i32, Workgroup>, %value: i32, %comparator: i32) -> i32 {
+ // expected-error @+1 {{expected at most one of these four memory constraints to be set: `Acquire`, `Release`,`AcquireRelease` or `SequentiallyConsistent`}}
+ %0 = spirv.AtomicCompareExchangeWeak <Workgroup> <None> <Acquire|Release> %ptr, %value, %comparator: !spirv.ptr<i32, Workgroup>
+ return %0: i32
+}
+
+// -----
+
//===----------------------------------------------------------------------===//
// spirv.AtomicExchange
//===----------------------------------------------------------------------===//
@@ -153,6 +185,14 @@ func.func @atomic_exchange(%ptr: !spirv.ptr<i64, Workgroup>, %value: i32) -> i32
// -----
+func.func @atomic_exchange(%ptr: !spirv.ptr<i32, Workgroup>, %value: i32) -> i32 {
+ // expected-error @+1 {{expected at most one of these four memory constraints to be set: `Acquire`, `Release`,`AcquireRelease` or `SequentiallyConsistent`}}
+ %0 = spirv.AtomicExchange <Workgroup> <Acquire|Release> %ptr, %value: !spirv.ptr<i32, Workgroup>
+ return %0: i32
+}
+
+// -----
+
//===----------------------------------------------------------------------===//
// spirv.AtomicIAdd
//===----------------------------------------------------------------------===//
@@ -223,6 +263,14 @@ func.func @atomic_load_mismatch(%ptr : !spirv.ptr<i32, Workgroup>) -> i64 {
// -----
+func.func @atomic_load(%ptr : !spirv.ptr<i32, Workgroup>) -> i32 {
+ // expected-error @+1 {{expected at most one of these four memory constraints to be set: `Acquire`, `Release`,`AcquireRelease` or `SequentiallyConsistent`}}
+ %0 = spirv.AtomicLoad <Workgroup> <Acquire|Release> %ptr : !spirv.ptr<i32, Workgroup>
+ return %0 : i32
+}
+
+// -----
+
//===----------------------------------------------------------------------===//
// spirv.AtomicOr
//===----------------------------------------------------------------------===//
@@ -283,6 +331,14 @@ func.func @atomic_store_mismatch(%ptr : !spirv.ptr<i32, Workgroup>, %value : i64
// -----
+func.func @atomic_store(%ptr : !spirv.ptr<i32, Workgroup>, %value : i32) {
+ // expected-error @+1 {{expected at most one of these four memory constraints to be set: `Acquire`, `Release`,`AcquireRelease` or `SequentiallyConsistent`}}
+ spirv.AtomicStore <Workgroup> <Acquire|Release> %ptr, %value : !spirv.ptr<i32, Workgroup>
+ return
+}
+
+// -----
+
//===----------------------------------------------------------------------===//
// spirv.AtomicUMax
//===----------------------------------------------------------------------===//
More information about the Mlir-commits
mailing list