[Mlir-commits] [mlir] [mlir][OpenMP] Model recursive memory effects of omp.master (PR #230190)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Thu Oct 15 02:26:17 PDT 2026


https://github.com/JRP-arm updated https://github.com/llvm/llvm-project/pull/230190

>From 66cf51e387c1ed761a4368f4a833dcf232447b9e Mon Sep 17 00:00:00 2001
From: "Jamie.Rowlinson-Patel at arm.com"
 <jamrow01 at ip-10-252-16-38.eu-west-1.compute.internal>
Date: Fri, 2 Oct 2026 10:16:31 +0000
Subject: [PATCH 1/2] [mlir][OpenMP] Model recursive memory effects of
 omp.master

Remove effect-free master regions while preserving nested memory effects.
---
 mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td |  2 +-
 mlir/test/Dialect/OpenMP/canonicalize.mlir    | 31 +++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
index 6bc99cf7656992..b9cec77e4139b7 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
@@ -1746,7 +1746,7 @@ def TargetOp : OpenMP_Op<"target", traits = [
 // 2.16 master Construct
 //===----------------------------------------------------------------------===//
 def MasterOp : OpenMP_Op<"master", traits = [
-    DeclareOpInterfaceMethods<ComposableOpInterface>
+    DeclareOpInterfaceMethods<ComposableOpInterface>, RecursiveMemoryEffects
   ], singleRegion = true> {
   let summary = "master construct";
   let description = [{
diff --git a/mlir/test/Dialect/OpenMP/canonicalize.mlir b/mlir/test/Dialect/OpenMP/canonicalize.mlir
index cc42f2ed8618c7..08ee66f98f2ee4 100644
--- a/mlir/test/Dialect/OpenMP/canonicalize.mlir
+++ b/mlir/test/Dialect/OpenMP/canonicalize.mlir
@@ -143,3 +143,34 @@ func.func @constant_hoisting_target(%x : !llvm.ptr) {
 // CHECK-NOT: arith.constant
 // CHECK: omp.target
 // CHECK: arith.constant
+
+// -----
+
+// Master has no implicit barrier, so a body without side effects can be removed.
+// CHECK-LABEL: func.func @master_no_side_effects
+// CHECK-NEXT: return
+func.func @master_no_side_effects(%a: i32, %b: i32) {
+  omp.master {
+    %unused = arith.addi %a, %b : i32
+    omp.terminator
+  }
+  return
+}
+
+// -----
+
+// Master must consider recursive side effects.
+// CHECK-LABEL: func.func @master_store
+// CHECK-SAME: (%[[X:.*]]: memref<i32>, %[[VALUE:.*]]: i32)
+// CHECK-NEXT: omp.master {
+// CHECK-NEXT: memref.store %[[VALUE]], %[[X]][] : memref<i32>
+// CHECK-NEXT: omp.terminator
+// CHECK-NEXT: }
+// CHECK-NEXT: return
+func.func @master_store(%x: memref<i32>, %value: i32) {
+  omp.master {
+    memref.store %value, %x[] : memref<i32>
+    omp.terminator
+  }
+  return
+}

>From 66aa30aa58dcea47fe0fd954289b7ef0ce682f98 Mon Sep 17 00:00:00 2001
From: "Jamie.Rowlinson-Patel at arm.com" <jamie.rowlinson-patel at arm.com>
Date: Thu, 15 Oct 2026 09:19:46 +0000
Subject: [PATCH 2/2] Update master memory effect tests. Remove canonicalise
 test

---
 mlir/test/Dialect/OpenMP/canonicalize.mlir   | 31 --------------------
 mlir/test/Dialect/OpenMP/memory-effects.mlir | 11 ++++++-
 2 files changed, 10 insertions(+), 32 deletions(-)

diff --git a/mlir/test/Dialect/OpenMP/canonicalize.mlir b/mlir/test/Dialect/OpenMP/canonicalize.mlir
index 08ee66f98f2ee4..cc42f2ed8618c7 100644
--- a/mlir/test/Dialect/OpenMP/canonicalize.mlir
+++ b/mlir/test/Dialect/OpenMP/canonicalize.mlir
@@ -143,34 +143,3 @@ func.func @constant_hoisting_target(%x : !llvm.ptr) {
 // CHECK-NOT: arith.constant
 // CHECK: omp.target
 // CHECK: arith.constant
-
-// -----
-
-// Master has no implicit barrier, so a body without side effects can be removed.
-// CHECK-LABEL: func.func @master_no_side_effects
-// CHECK-NEXT: return
-func.func @master_no_side_effects(%a: i32, %b: i32) {
-  omp.master {
-    %unused = arith.addi %a, %b : i32
-    omp.terminator
-  }
-  return
-}
-
-// -----
-
-// Master must consider recursive side effects.
-// CHECK-LABEL: func.func @master_store
-// CHECK-SAME: (%[[X:.*]]: memref<i32>, %[[VALUE:.*]]: i32)
-// CHECK-NEXT: omp.master {
-// CHECK-NEXT: memref.store %[[VALUE]], %[[X]][] : memref<i32>
-// CHECK-NEXT: omp.terminator
-// CHECK-NEXT: }
-// CHECK-NEXT: return
-func.func @master_store(%x: memref<i32>, %value: i32) {
-  omp.master {
-    memref.store %value, %x[] : memref<i32>
-    omp.terminator
-  }
-  return
-}
diff --git a/mlir/test/Dialect/OpenMP/memory-effects.mlir b/mlir/test/Dialect/OpenMP/memory-effects.mlir
index bf65703e87544f..1efa0acd23da0e 100644
--- a/mlir/test/Dialect/OpenMP/memory-effects.mlir
+++ b/mlir/test/Dialect/OpenMP/memory-effects.mlir
@@ -5,6 +5,15 @@ func.func @masked_recursive_memory_effects() {
   // expected-remark at +1 {{recursive memory effects}}
   omp.masked {
     omp.terminator
-  } {test_recursive_memory_effects}
+  }
+  return
+}
+
+// Check the trait on omp.master itself, independently of its body.
+func.func @master_recursive_memory_effects() {
+  // expected-remark at +1 {{recursive memory effects}}
+  omp.master {
+    omp.terminator
+  }
   return
 }
\ No newline at end of file



More information about the Mlir-commits mailing list