[Mlir-commits] [mlir] [mlir][SPIRV] Add named-barrier type and OpNamedBarrierInitialize / OpMemoryNamedBarrier (PR #195664)

Krzysztof Drewniak llvmlistbot at llvm.org
Mon May 4 08:53:37 PDT 2026


https://github.com/krzysz00 updated https://github.com/llvm/llvm-project/pull/195664

>From 95e6f6ba672856403dfa3d2a8343ff11d9a29fb1 Mon Sep 17 00:00:00 2001
From: Krzysztof Drewniak <Krzysztof.Drewniak at amd.com>
Date: Fri, 1 May 2026 20:47:23 +0000
Subject: [PATCH 1/2] [mlir][SPIRV] Add named-barrier type and
 OpNamedBarrierInitialize / OpMemoryNamedBarrier

Adds the SPIR-V named-barrier object (TypeNamedBarrier) along with
NamedBarrierInitialize and MemoryNamedBarrier ops, gated on the
NamedBarrier capability and SPIR-V 1.1+.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply at anthropic.com>
---
 .../mlir/Dialect/SPIRV/IR/SPIRVBarrierOps.td  | 99 +++++++++++++++++++
 .../mlir/Dialect/SPIRV/IR/SPIRVBase.td        |  8 ++
 .../mlir/Dialect/SPIRV/IR/SPIRVTypes.h        | 11 +++
 mlir/lib/Dialect/SPIRV/IR/SPIRVDialect.cpp    | 11 ++-
 mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp        | 14 +++
 mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp      | 21 +++-
 .../SPIRV/Deserialization/DeserializeOps.cpp  |  1 +
 .../SPIRV/Deserialization/Deserializer.cpp    | 12 +++
 .../SPIRV/Deserialization/Deserializer.h      |  2 +
 .../Target/SPIRV/Serialization/Serializer.cpp |  5 +
 mlir/test/Dialect/SPIRV/IR/barrier-ops.mlir   | 34 +++++++
 11 files changed, 212 insertions(+), 6 deletions(-)

diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBarrierOps.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBarrierOps.td
index 1459330549066..10d8c9993d6e2 100644
--- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBarrierOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBarrierOps.td
@@ -108,4 +108,103 @@ def SPIRV_MemoryBarrierOp : SPIRV_Op<"MemoryBarrier", []> {
   let assemblyFormat = "$memory_scope `,` $memory_semantics attr-dict";
 }
 
+// -----
+
+def SPIRV_NamedBarrierInitializeOp
+    : SPIRV_Op<"NamedBarrierInitialize", []> {
+  let summary = "Initialize a named barrier with a subgroup count.";
+
+  let description = [{
+    Declare a new named-barrier object.
+
+    Result Type must be the type OpTypeNamedBarrier.
+
+    Subgroup Count must be a 32-bit integer type scalar representing the
+    number of subgroups that must reach the current point of execution.
+
+    Capability: NamedBarrier
+
+    Missing before version 1.1.
+
+    #### Example:
+
+    ```mlir
+    %nb = spirv.NamedBarrierInitialize %subgroup_count : i32 -> !spirv.named_barrier
+    ```
+  }];
+
+  let availability = [
+    MinVersion<SPIRV_V_1_1>,
+    MaxVersion<SPIRV_V_1_6>,
+    Extension<[]>,
+    Capability<[SPIRV_C_NamedBarrier]>
+  ];
+
+  let arguments = (ins
+    SPIRV_Int32:$subgroup_count
+  );
+
+  let results = (outs
+    SPIRV_AnyNamedBarrier:$result
+  );
+
+  let assemblyFormat = [{
+    $subgroup_count attr-dict `:` type($subgroup_count) `->` type($result)
+  }];
+}
+
+// -----
+
+def SPIRV_MemoryNamedBarrierOp
+    : SPIRV_Op<"MemoryNamedBarrier", []> {
+  let summary = [{
+    Wait on a named barrier and apply a memory barrier.
+  }];
+
+  let description = [{
+    Wait for other invocations of this module to reach the current point
+    of execution.
+
+    Named Barrier must be the type OpTypeNamedBarrier.
+
+    If Semantics is not None, this instruction also serves as an
+    OpMemoryBarrier instruction, and also performs and adheres to the
+    description and semantics of an OpMemoryBarrier instruction with the
+    same Memory and Semantics operands. This allows atomically specifying
+    both a control barrier and a memory barrier (that is, without needing
+    two instructions). If Semantics is None, Memory is ignored.
+
+    Capability: NamedBarrier
+
+    Missing before version 1.1.
+
+    #### Example:
+
+    ```mlir
+    spirv.MemoryNamedBarrier %nb, <Workgroup>, <AcquireRelease|WorkgroupMemory>
+        : !spirv.named_barrier
+    ```
+  }];
+
+  let availability = [
+    MinVersion<SPIRV_V_1_1>,
+    MaxVersion<SPIRV_V_1_6>,
+    Extension<[]>,
+    Capability<[SPIRV_C_NamedBarrier]>
+  ];
+
+  let arguments = (ins
+    SPIRV_AnyNamedBarrier:$named_barrier,
+    SPIRV_ScopeAttr:$memory_scope,
+    SPIRV_MemorySemanticsAttr:$memory_semantics
+  );
+
+  let results = (outs);
+
+  let assemblyFormat = [{
+    $named_barrier `,` $memory_scope `,` $memory_semantics attr-dict
+        `:` type($named_barrier)
+  }];
+}
+
 #endif // MLIR_DIALECT_SPIRV_IR_BARRIER_OPS
diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBase.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBase.td
index b5cc5f6ba8cb5..c13d24942a9e9 100644
--- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBase.td
+++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBase.td
@@ -4272,6 +4272,7 @@ def SPIRV_IsPtrType : CPred<"::llvm::isa<::mlir::spirv::PointerType>($_self)">;
 def SPIRV_IsRTArrayType : CPred<"::llvm::isa<::mlir::spirv::RuntimeArrayType>($_self)">;
 def SPIRV_IsSampledImageType : CPred<"::llvm::isa<::mlir::spirv::SampledImageType>($_self)">;
 def SPIRV_IsSamplerType : CPred<"::llvm::isa<::mlir::spirv::SamplerType>($_self)">;
+def SPIRV_IsNamedBarrierType : CPred<"::llvm::isa<::mlir::spirv::NamedBarrierType>($_self)">;
 def SPIRV_IsStructType : CPred<"::llvm::isa<::mlir::spirv::StructType>($_self)">;
 def SPIRV_IsTensorArmType : CPred<"::llvm::isa<::mlir::spirv::TensorArmType>($_self)">;
 
@@ -4317,6 +4318,8 @@ def SPIRV_AnySampledImage : DialectType<SPIRV_Dialect, SPIRV_IsSampledImageType,
                                 "any SPIR-V sampled image type">;
 def SPIRV_AnySampler : DialectType<SPIRV_Dialect, SPIRV_IsSamplerType,
                                 "any SPIR-V sampler type">;
+def SPIRV_AnyNamedBarrier : DialectType<SPIRV_Dialect, SPIRV_IsNamedBarrierType,
+                                "any SPIR-V named barrier type">;
 def SPIRV_AnyTensorArm : DialectType<SPIRV_Dialect, SPIRV_IsTensorArmType,
                                  "any SPIR-V tensorArm type">;
 
@@ -4605,6 +4608,9 @@ def SPIRV_OC_OpGroupFMax                      : I32EnumAttrCase<"OpGroupFMax", 2
 def SPIRV_OC_OpGroupUMax                      : I32EnumAttrCase<"OpGroupUMax", 270>;
 def SPIRV_OC_OpGroupSMax                      : I32EnumAttrCase<"OpGroupSMax", 271>;
 def SPIRV_OC_OpNoLine                         : I32EnumAttrCase<"OpNoLine", 317>;
+def SPIRV_OC_OpTypeNamedBarrier               : I32EnumAttrCase<"OpTypeNamedBarrier", 327>;
+def SPIRV_OC_OpNamedBarrierInitialize         : I32EnumAttrCase<"OpNamedBarrierInitialize", 328>;
+def SPIRV_OC_OpMemoryNamedBarrier             : I32EnumAttrCase<"OpMemoryNamedBarrier", 329>;
 def SPIRV_OC_OpModuleProcessed                : I32EnumAttrCase<"OpModuleProcessed", 330>;
 def SPIRV_OC_OpExecutionModeId                : I32EnumAttrCase<"OpExecutionModeId", 331>;
 def SPIRV_OC_OpDecorateId                     : I32EnumAttrCase<"OpDecorateId", 332>;
@@ -4757,6 +4763,8 @@ def SPIRV_OpcodeAttr :
       SPIRV_OC_OpGroupSMin, SPIRV_OC_OpGroupFMax, SPIRV_OC_OpGroupUMax,
       SPIRV_OC_OpGroupSMax, SPIRV_OC_OpNoLine, SPIRV_OC_OpModuleProcessed,
       SPIRV_OC_OpExecutionModeId, SPIRV_OC_OpDecorateId,
+      SPIRV_OC_OpTypeNamedBarrier, SPIRV_OC_OpNamedBarrierInitialize,
+      SPIRV_OC_OpMemoryNamedBarrier,
       SPIRV_OC_OpGroupNonUniformElect, SPIRV_OC_OpGroupNonUniformAll,
       SPIRV_OC_OpGroupNonUniformAny, SPIRV_OC_OpGroupNonUniformAllEqual,
       SPIRV_OC_OpGroupNonUniformBroadcast, SPIRV_OC_OpGroupNonUniformBroadcastFirst,
diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVTypes.h b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVTypes.h
index b7890ff101b2b..70060cfda5fde 100644
--- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVTypes.h
+++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVTypes.h
@@ -240,6 +240,17 @@ class SamplerType : public Type::TypeBase<SamplerType, SPIRVType, TypeStorage> {
   static SamplerType get(MLIRContext *context);
 };
 
+// SPIR-V named barrier type (OpTypeNamedBarrier)
+class NamedBarrierType
+    : public Type::TypeBase<NamedBarrierType, SPIRVType, TypeStorage> {
+public:
+  using Base::Base;
+
+  static constexpr StringLiteral name = "spirv.named_barrier";
+
+  static NamedBarrierType get(MLIRContext *context);
+};
+
 /// SPIR-V struct type. Two kinds of struct types are supported:
 /// - Literal: a literal struct type is uniqued by its fields (types + offset
 /// info + decoration info).
diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVDialect.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVDialect.cpp
index 036d48f0fd637..2b5e7a571f42d 100644
--- a/mlir/lib/Dialect/SPIRV/IR/SPIRVDialect.cpp
+++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVDialect.cpp
@@ -863,6 +863,8 @@ Type SPIRVDialect::parseType(DialectAsmParser &parser) const {
     return parseSampledImageType(*this, parser);
   if (keyword == "sampler")
     return SamplerType::get(getContext());
+  if (keyword == "named_barrier")
+    return NamedBarrierType::get(getContext());
   if (keyword == "struct")
     return parseStructType(*this, parser);
   if (keyword == "matrix")
@@ -911,6 +913,10 @@ static void print(SampledImageType type, DialectAsmPrinter &os) {
 
 static void print(SamplerType type, DialectAsmPrinter &os) { os << "sampler"; }
 
+static void print(NamedBarrierType type, DialectAsmPrinter &os) {
+  os << "named_barrier";
+}
+
 static void print(StructType type, DialectAsmPrinter &os) {
   FailureOr<AsmPrinter::CyclicPrintReset> cyclicPrint;
 
@@ -1005,8 +1011,9 @@ static void print(TensorArmType type, DialectAsmPrinter &os) {
 void SPIRVDialect::printType(Type type, DialectAsmPrinter &os) const {
   TypeSwitch<Type>(type)
       .Case<ArrayType, CooperativeMatrixType, PointerType, RuntimeArrayType,
-            ImageType, SampledImageType, SamplerType, StructType, MatrixType,
-            TensorArmType>([&](auto type) { print(type, os); })
+            ImageType, SampledImageType, SamplerType, NamedBarrierType,
+            StructType, MatrixType, TensorArmType>(
+          [&](auto type) { print(type, os); })
       .DefaultUnreachable("Unhandled SPIR-V type");
 }
 
diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp
index f8aa5bfeba452..84b30208e60dc 100644
--- a/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp
+++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp
@@ -1502,6 +1502,20 @@ LogicalResult spirv::MemoryBarrierOp::verify() {
   return verifyMemorySemantics(getOperation(), getMemorySemantics());
 }
 
+//===----------------------------------------------------------------------===//
+// spirv.MemoryNamedBarrierOp
+//===----------------------------------------------------------------------===//
+
+LogicalResult spirv::MemoryNamedBarrierOp::verify() {
+  return verifyMemorySemantics(getOperation(), getMemorySemantics());
+}
+
+//===----------------------------------------------------------------------===//
+// spirv.NamedBarrierInitializeOp
+//===----------------------------------------------------------------------===//
+
+LogicalResult spirv::NamedBarrierInitializeOp::verify() { return success(); }
+
 //===----------------------------------------------------------------------===//
 // spirv.module
 //===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp
index aafc2180761d0..2ad463674c85e 100644
--- a/mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp
+++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVTypes.cpp
@@ -57,7 +57,7 @@ class TypeExtensionVisitor {
           for (Type elementType : concreteType.getElementTypes())
             add(elementType);
         })
-        .Case<SamplerType>([](auto) { /* no extensions */ })
+        .Case<SamplerType, NamedBarrierType>([](auto) { /* no extensions */ })
         .DefaultUnreachable("Unhandled type");
   }
 
@@ -109,6 +109,11 @@ class TypeCapabilityVisitor {
             add(elementType);
         })
         .Case<SamplerType>([](auto) { /* no capabilities */ })
+        .Case<NamedBarrierType>([this](auto) {
+          static const Capability caps[] = {Capability::NamedBarrier};
+          ArrayRef<Capability> ref(caps, std::size(caps));
+          capabilities.push_back(ref);
+        })
         .DefaultUnreachable("Unhandled type");
   }
 
@@ -816,6 +821,14 @@ SamplerType SamplerType::get(MLIRContext *context) {
   return Base::get(context);
 }
 
+//===----------------------------------------------------------------------===//
+// NamedBarrierType
+//===----------------------------------------------------------------------===//
+
+NamedBarrierType NamedBarrierType::get(MLIRContext *context) {
+  return Base::get(context);
+}
+
 //===----------------------------------------------------------------------===//
 // StructType
 //===----------------------------------------------------------------------===//
@@ -1352,7 +1365,7 @@ TensorArmType::verifyInvariants(function_ref<InFlightDiagnostic()> emitError,
 //===----------------------------------------------------------------------===//
 
 void SPIRVDialect::registerTypes() {
-  addTypes<ArrayType, CooperativeMatrixType, ImageType, MatrixType, PointerType,
-           RuntimeArrayType, SampledImageType, SamplerType, StructType,
-           TensorArmType>();
+  addTypes<ArrayType, CooperativeMatrixType, ImageType, MatrixType,
+           NamedBarrierType, PointerType, RuntimeArrayType, SampledImageType,
+           SamplerType, StructType, TensorArmType>();
 }
diff --git a/mlir/lib/Target/SPIRV/Deserialization/DeserializeOps.cpp b/mlir/lib/Target/SPIRV/Deserialization/DeserializeOps.cpp
index c12647d4255aa..21a8400c8e40f 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/DeserializeOps.cpp
+++ b/mlir/lib/Target/SPIRV/Deserialization/DeserializeOps.cpp
@@ -184,6 +184,7 @@ LogicalResult spirv::Deserializer::processInstruction(
   case spirv::Opcode::OpTypeFunction:
   case spirv::Opcode::OpTypeImage:
   case spirv::Opcode::OpTypeSampler:
+  case spirv::Opcode::OpTypeNamedBarrier:
   case spirv::Opcode::OpTypeSampledImage:
   case spirv::Opcode::OpTypeRuntimeArray:
   case spirv::Opcode::OpTypeStruct:
diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
index 440ce262ac594..965af5c1bdc9a 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
+++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
@@ -1212,6 +1212,8 @@ LogicalResult spirv::Deserializer::processType(spirv::Opcode opcode,
     return processImageType(operands);
   case spirv::Opcode::OpTypeSampler:
     return processSamplerType(operands);
+  case spirv::Opcode::OpTypeNamedBarrier:
+    return processNamedBarrierType(operands);
   case spirv::Opcode::OpTypeSampledImage:
     return processSampledImageType(operands);
   case spirv::Opcode::OpTypeRuntimeArray:
@@ -1705,6 +1707,16 @@ spirv::Deserializer::processSamplerType(ArrayRef<uint32_t> operands) {
   return success();
 }
 
+LogicalResult
+spirv::Deserializer::processNamedBarrierType(ArrayRef<uint32_t> operands) {
+  if (operands.size() != 1)
+    return emitError(unknownLoc,
+                     "OpTypeNamedBarrier must have no parameters");
+
+  typeMap[operands[0]] = spirv::NamedBarrierType::get(context);
+  return success();
+}
+
 //===----------------------------------------------------------------------===//
 // Constant
 //===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.h b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.h
index 9725c63deb8c2..f3dab422ef9d9 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.h
+++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.h
@@ -324,6 +324,8 @@ class Deserializer {
 
   LogicalResult processSamplerType(ArrayRef<uint32_t> operands);
 
+  LogicalResult processNamedBarrierType(ArrayRef<uint32_t> operands);
+
   LogicalResult processRuntimeArrayType(ArrayRef<uint32_t> operands);
 
   LogicalResult processStructType(ArrayRef<uint32_t> operands);
diff --git a/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp b/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp
index e29a437cca87f..5c9e378b4b7f3 100644
--- a/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp
+++ b/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp
@@ -750,6 +750,11 @@ LogicalResult Serializer::prepareBasicType(
     return success();
   }
 
+  if (isa<spirv::NamedBarrierType>(type)) {
+    typeEnum = spirv::Opcode::OpTypeNamedBarrier;
+    return success();
+  }
+
   if (auto sampledImageType = dyn_cast<spirv::SampledImageType>(type)) {
     typeEnum = spirv::Opcode::OpTypeSampledImage;
     uint32_t imageTypeID = 0;
diff --git a/mlir/test/Dialect/SPIRV/IR/barrier-ops.mlir b/mlir/test/Dialect/SPIRV/IR/barrier-ops.mlir
index e0f935b7ce39d..5e05687887760 100644
--- a/mlir/test/Dialect/SPIRV/IR/barrier-ops.mlir
+++ b/mlir/test/Dialect/SPIRV/IR/barrier-ops.mlir
@@ -48,3 +48,37 @@ func.func @memory_barrier_2() -> () {
   return
 }
 
+// -----
+
+//===----------------------------------------------------------------------===//
+// spirv.NamedBarrierInitialize
+//===----------------------------------------------------------------------===//
+
+func.func @named_barrier_initialize(%member_count : i32) -> () {
+  // CHECK: %{{.*}} = spirv.NamedBarrierInitialize %[[MEMBER_COUNT:.*]] : i32 -> !spirv.named_barrier
+  %nb = spirv.NamedBarrierInitialize %member_count : i32 -> !spirv.named_barrier
+  return
+}
+
+// -----
+
+//===----------------------------------------------------------------------===//
+// spirv.MemoryNamedBarrier
+//===----------------------------------------------------------------------===//
+
+func.func @memory_named_barrier(%member_count : i32) -> () {
+  %nb = spirv.NamedBarrierInitialize %member_count : i32 -> !spirv.named_barrier
+  // CHECK: spirv.MemoryNamedBarrier %{{.*}}, <Workgroup>, <AcquireRelease|WorkgroupMemory> : !spirv.named_barrier
+  spirv.MemoryNamedBarrier %nb, <Workgroup>, <AcquireRelease|WorkgroupMemory> : !spirv.named_barrier
+  return
+}
+
+// -----
+
+func.func @memory_named_barrier_invalid_semantics(%member_count : i32) -> () {
+  %nb = spirv.NamedBarrierInitialize %member_count : i32 -> !spirv.named_barrier
+  // expected-error @+1 {{expected at most one of these four memory constraints to be set: `Acquire`, `Release`,`AcquireRelease` or `SequentiallyConsistent`}}
+  spirv.MemoryNamedBarrier %nb, <Workgroup>, <Acquire|Release> : !spirv.named_barrier
+  return
+}
+

>From 58e374b129d995ae7877b3ee005f70dc222acd9e Mon Sep 17 00:00:00 2001
From: Krzysztof Drewniak <Krzysztof.Drewniak at amd.com>
Date: Mon, 4 May 2026 15:52:33 +0000
Subject: [PATCH 2/2] Review comments

Add target tests

AI usage: Claude generated the test
---
 .../mlir/Dialect/SPIRV/IR/SPIRVBarrierOps.td     |  2 ++
 mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp           |  6 ------
 .../SPIRV/Deserialization/Deserializer.cpp       |  3 +--
 mlir/test/Target/SPIRV/barrier-ops.mlir          | 16 +++++++++++++++-
 4 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBarrierOps.td b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBarrierOps.td
index 10d8c9993d6e2..9b361b6b4db71 100644
--- a/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBarrierOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/IR/SPIRVBarrierOps.td
@@ -151,6 +151,8 @@ def SPIRV_NamedBarrierInitializeOp
   let assemblyFormat = [{
     $subgroup_count attr-dict `:` type($subgroup_count) `->` type($result)
   }];
+
+  let hasVerifier = 0;
 }
 
 // -----
diff --git a/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp b/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp
index 84b30208e60dc..90d0895988204 100644
--- a/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp
+++ b/mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp
@@ -1510,12 +1510,6 @@ LogicalResult spirv::MemoryNamedBarrierOp::verify() {
   return verifyMemorySemantics(getOperation(), getMemorySemantics());
 }
 
-//===----------------------------------------------------------------------===//
-// spirv.NamedBarrierInitializeOp
-//===----------------------------------------------------------------------===//
-
-LogicalResult spirv::NamedBarrierInitializeOp::verify() { return success(); }
-
 //===----------------------------------------------------------------------===//
 // spirv.module
 //===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
index 965af5c1bdc9a..cabbecc567241 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
+++ b/mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp
@@ -1710,8 +1710,7 @@ spirv::Deserializer::processSamplerType(ArrayRef<uint32_t> operands) {
 LogicalResult
 spirv::Deserializer::processNamedBarrierType(ArrayRef<uint32_t> operands) {
   if (operands.size() != 1)
-    return emitError(unknownLoc,
-                     "OpTypeNamedBarrier must have no parameters");
+    return emitError(unknownLoc, "OpTypeNamedBarrier must have no parameters");
 
   typeMap[operands[0]] = spirv::NamedBarrierType::get(context);
   return success();
diff --git a/mlir/test/Target/SPIRV/barrier-ops.mlir b/mlir/test/Target/SPIRV/barrier-ops.mlir
index a229fccebac8a..f23083032abc2 100644
--- a/mlir/test/Target/SPIRV/barrier-ops.mlir
+++ b/mlir/test/Target/SPIRV/barrier-ops.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip %s | FileCheck %s
+// RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip -split-input-file %s | FileCheck %s
 
 // RUN: %if spirv-tools %{ rm -rf %t %}
 // RUN: %if spirv-tools %{ mkdir %t %}
@@ -27,3 +27,17 @@ spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {
     spirv.Return
   }
 }
+
+// -----
+
+spirv.module Physical64 OpenCL requires #spirv.vce<v1.1, [Kernel, Addresses, NamedBarrier, Linkage], []> {
+  // CHECK-LABEL: spirv.func @named_barrier
+  // CHECK-SAME: (%[[COUNT:.*]]: i32)
+  spirv.func @named_barrier(%subgroup_count : i32) -> () "None" {
+    // CHECK-NEXT: %[[NB:.*]] = spirv.NamedBarrierInitialize %[[COUNT]] : i32 -> !spirv.named_barrier
+    %nb = spirv.NamedBarrierInitialize %subgroup_count : i32 -> !spirv.named_barrier
+    // CHECK-NEXT: spirv.MemoryNamedBarrier %[[NB]], <Workgroup>, <AcquireRelease|WorkgroupMemory> : !spirv.named_barrier
+    spirv.MemoryNamedBarrier %nb, <Workgroup>, <AcquireRelease|WorkgroupMemory> : !spirv.named_barrier
+    spirv.Return
+  }
+}



More information about the Mlir-commits mailing list