[Mlir-commits] [mlir] [mlir][acc] Update par_dims format for reduction combine (PR #217678)

Razvan Lupusoru llvmlistbot at llvm.org
Thu Aug 20 09:05:11 PDT 2026


https://github.com/razvanlupusoru created https://github.com/llvm/llvm-project/pull/217678

For consistency after https://github.com/llvm/llvm-project/pull/217643 this MR adds par_dims as inherent attribute to reduction_combine as was intended. And thus ensures consistency in IR printing of this attribute.

>From c84ceb5cbc4e876dcd40e6e5c5c2acb695c1971f Mon Sep 17 00:00:00 2001
From: Razvan Lupusoru <rlupusoru at nvidia.com>
Date: Thu, 20 Aug 2026 09:04:00 -0700
Subject: [PATCH] [mlir][acc] Update par_dims format for reduction combine

For consistency after https://github.com/llvm/llvm-project/pull/217643
this MR adds par_dims as inherent attribute to reduction_combine
as was intended. And thus ensures consistency in IR printing of
this attribute.
---
 .../mlir/Dialect/OpenACC/OpenACCCGOps.td      | 28 +++++++++++++++----
 .../Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp  |  3 +-
 ...gpu-reduction-block-combine-no-reload.mlir |  2 +-
 ...-worker-reduction-combine-mixed-scope.mlir | 12 +++-----
 ...cc-cg-to-gpu-worker-reduction-combine.mlir | 12 +++-----
 mlir/test/Dialect/OpenACC/ops-cg.mlir         |  5 ++--
 6 files changed, 36 insertions(+), 26 deletions(-)

diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td
index 7aaac28ee09ba..b9c374d8b0e1b 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td
@@ -118,7 +118,8 @@ def OpenACC_ReductionCombineOp: OpenACC_Op<"reduction_combine",
     decisions (such as generate an atomic update). E.g.
 
     ```
-      acc.reduction_combine %src into %dest <addi> : memref<i32>
+      acc.reduction_combine %src into %dest <addi>
+          par_dims(#acc<par_dims[thread_x]>) : memref<i32>
     ```
 
     Might lower to something similar to
@@ -140,11 +141,28 @@ def OpenACC_ReductionCombineOp: OpenACC_Op<"reduction_combine",
 
   let arguments = (ins OpenACC_AnyPointerOrMappableType:$destMemref,
                        OpenACC_AnyPointerOrMappableType:$srcMemref,
-                       OpenACC_ReductionOperatorAttr:$reductionOperator);
+                       OpenACC_ReductionOperatorAttr:$reductionOperator,
+                       OptionalAttr<OpenACC_GPUParallelDimsAttr>:$par_dims);
   
   let assemblyFormat = [{
-    $srcMemref `into` $destMemref $reductionOperator `:` type($destMemref) attr-dict
+    $srcMemref `into` $destMemref $reductionOperator
+    (`par_dims` `(` qualified($par_dims)^ `)`)?
+    `:` type($destMemref) attr-dict
   }];
+  let builders = [
+    OpBuilder<(ins "::mlir::Value":$destMemref,
+                   "::mlir::Value":$srcMemref,
+                   "::mlir::acc::ReductionOperatorAttr":$reductionOperator), [{
+      build($_builder, $_state, destMemref, srcMemref, reductionOperator,
+            nullptr);
+    }]>,
+    OpBuilder<(ins "::mlir::Value":$destMemref,
+                   "::mlir::Value":$srcMemref,
+                   "::mlir::acc::ReductionOperator":$reductionOperator), [{
+      build($_builder, $_state, destMemref, srcMemref, reductionOperator,
+            nullptr);
+    }]>,
+  ];
 }
 
 //===----------------------------------------------------------------------===//
@@ -171,8 +189,8 @@ def OpenACC_ReductionAccumulateOp
     } {acc.par_dims = #acc<par_dims[thread_x]>}
     acc.reduction_accumulate %partial to %private <add>
         par_dims(#acc<par_dims[thread_x]>) : i32 -> memref<i32>
-    acc.reduction_combine %private into %shared <add> : memref<i32>
-        {acc.par_dims = #acc<par_dims[thread_x]>}
+    acc.reduction_combine %private into %shared <add>
+        par_dims(#acc<par_dims[thread_x]>) : memref<i32>
     ```
   }];
   let arguments = (ins AnyTypeOf<[AnyInteger, AnyFloat, AnyComplex]>:$value,
diff --git a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
index e97699414fb36..e49233d424789 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
+++ b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
@@ -164,7 +164,8 @@ void removeParDim(SmallVector<GPUParallelDimAttr> &parDims,
 }
 
 #define ACC_OP_WITH_PAR_DIMS_LIST                                              \
-  PrivatizeOp, ReductionAccumulateOp, ReductionAccumulateArrayOp
+  PrivatizeOp, ReductionAccumulateOp, ReductionAccumulateArrayOp,              \
+      ReductionCombineOp
 
 GPUParallelDimsAttr getParDimsAttr(Operation *op) {
   return llvm::TypeSwitch<Operation *, GPUParallelDimsAttr>(op)
diff --git a/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-reduction-block-combine-no-reload.mlir b/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-reduction-block-combine-no-reload.mlir
index 1fbb5a89ef456..3f95d8c54f273 100644
--- a/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-reduction-block-combine-no-reload.mlir
+++ b/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-reduction-block-combine-no-reload.mlir
@@ -53,7 +53,7 @@ module attributes {gpu.container_module} {
         scf.reduce
       } {acc.par_dims = #acc<par_dims[block_x]>}
       acc.predicate_region {
-        acc.reduction_combine %a_slot into %a_res <add> : memref<i32> {acc.par_dims = #acc<par_dims[block_x, thread_x]>}
+        acc.reduction_combine %a_slot into %a_res <add> par_dims(#acc<par_dims[block_x, thread_x]>) : memref<i32>
       }
       acc.yield
     } {kernel_func_name = @test_block_combine_no_reload_kernel, kernel_module_name = @cuda_device_mod, origin = "acc.parallel"}
diff --git a/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-worker-reduction-combine-mixed-scope.mlir b/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-worker-reduction-combine-mixed-scope.mlir
index 377d78b8f9a33..3590a9d43b88f 100644
--- a/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-worker-reduction-combine-mixed-scope.mlir
+++ b/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-worker-reduction-combine-mixed-scope.mlir
@@ -28,11 +28,9 @@ func.func @mixed_scope_worker_reduction_combine(
           scf.reduce
         } {acc.par_dims = #acc<par_dims[thread_y]>}
         acc.predicate_region {
-          acc.reduction_combine %local into %result_arg <add> : memref<i32>
-              {acc.par_dims = #acc<par_dims[block_y, thread_y]>}
+          acc.reduction_combine %local into %result_arg <add> par_dims(#acc<par_dims[block_y, thread_y]>) : memref<i32>
           // expected-error at +1 {{operations in the same predicate region require incompatible ThreadY predication}}
-          acc.reduction_combine %other_arg into %result_arg <add> : memref<i32>
-              {acc.par_dims = #acc<par_dims[block_y, thread_x]>}
+          acc.reduction_combine %other_arg into %result_arg <add> par_dims(#acc<par_dims[block_y, thread_x]>) : memref<i32>
         }
         scf.reduce
       } {acc.par_dims = #acc<par_dims[block_y]>}
@@ -71,8 +69,7 @@ func.func @worker_combine_with_single_store(%result: memref<i32>) {
         acc.predicate_region {
           // expected-error at +1 {{operations in the same predicate region require incompatible ThreadY predication}}
           memref.store %c7_i32, %selected[] : memref<i32>
-          acc.reduction_combine %local into %result_arg <add> : memref<i32>
-              {acc.par_dims = #acc<par_dims[block_y, thread_y]>}
+          acc.reduction_combine %local into %result_arg <add> par_dims(#acc<par_dims[block_y, thread_y]>) : memref<i32>
         }
         scf.reduce
       } {acc.par_dims = #acc<par_dims[block_y]>}
@@ -109,8 +106,7 @@ func.func @worker_combine_with_atomic_update(%result: memref<i32>) {
             %next = arith.addi %current, %c1_i32 : i32
             acc.yield %next : i32
           }
-          acc.reduction_combine %local into %result_arg <add> : memref<i32>
-              {acc.par_dims = #acc<par_dims[block_y, thread_y]>}
+          acc.reduction_combine %local into %result_arg <add> par_dims(#acc<par_dims[block_y, thread_y]>) : memref<i32>
         }
         scf.reduce
       } {acc.par_dims = #acc<par_dims[block_y]>}
diff --git a/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-worker-reduction-combine.mlir b/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-worker-reduction-combine.mlir
index 051d65fee8643..8088beacd90ba 100644
--- a/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-worker-reduction-combine.mlir
+++ b/mlir/test/Dialect/OpenACC/acc-cg-to-gpu-worker-reduction-combine.mlir
@@ -36,8 +36,7 @@ func.func @worker_reduction_combine(%result: memref<i32>) {
         } {acc.par_dims = #acc<par_dims[thread_y]>}
         acc.predicate_region {
           %unused = memref.load %result_arg[] : memref<i32>
-          acc.reduction_combine %local into %result_arg <add> : memref<i32>
-              {acc.par_dims = #acc<par_dims[block_y, thread_y]>}
+          acc.reduction_combine %local into %result_arg <add> par_dims(#acc<par_dims[block_y, thread_y]>) : memref<i32>
         }
         scf.reduce
       } {acc.par_dims = #acc<par_dims[block_y]>}
@@ -131,12 +130,10 @@ func.func @nested_worker_reduction_combines(
         } {acc.par_dims = #acc<par_dims[thread_y]>}
         acc.predicate_region {
           acc.predicate_region {
-            acc.reduction_combine %local into %result_arg <add> : memref<i32>
-                {acc.par_dims = #acc<par_dims[block_y, thread_y]>}
+            acc.reduction_combine %local into %result_arg <add> par_dims(#acc<par_dims[block_y, thread_y]>) : memref<i32>
           }
           acc.predicate_region {
-            acc.reduction_combine %other_arg into %result_arg <add> : memref<i32>
-                {acc.par_dims = #acc<par_dims[block_y, thread_y]>}
+            acc.reduction_combine %other_arg into %result_arg <add> par_dims(#acc<par_dims[block_y, thread_y]>) : memref<i32>
           }
         }
         scf.reduce
@@ -174,8 +171,7 @@ func.func @worker_combine_in_scf_if(%result: memref<i32>) {
             : (!acc.private_type<memref<i32>>) -> memref<i32>
         acc.predicate_region {
           scf.if %true {
-            acc.reduction_combine %local into %result_arg <add> : memref<i32>
-                {acc.par_dims = #acc<par_dims[block_y, thread_y]>}
+            acc.reduction_combine %local into %result_arg <add> par_dims(#acc<par_dims[block_y, thread_y]>) : memref<i32>
           }
         }
         scf.reduce
diff --git a/mlir/test/Dialect/OpenACC/ops-cg.mlir b/mlir/test/Dialect/OpenACC/ops-cg.mlir
index 958457ea26dd9..adbd921af102e 100644
--- a/mlir/test/Dialect/OpenACC/ops-cg.mlir
+++ b/mlir/test/Dialect/OpenACC/ops-cg.mlir
@@ -315,15 +315,14 @@ func.func @parallel_reduction_pattern(%data: memref<8xi32>, %shared: memref<i32>
   } {acc.par_dims = #acc<par_dims[thread_x]>}
   acc.reduction_accumulate %partial to %private <add>
       par_dims(#acc<par_dims[thread_x]>) : i32 -> memref<i32>
-  acc.reduction_combine %private into %shared <add> : memref<i32>
-      {acc.par_dims = #acc<par_dims[thread_x]>}
+  acc.reduction_combine %private into %shared <add> par_dims(#acc<par_dims[thread_x]>) : memref<i32>
   return
 }
 // CHECK: memref.alloca() {acc.par_dims = #acc<par_dims[thread_x]>}
 // CHECK: scf.parallel
 // CHECK: scf.reduce
 // CHECK: acc.reduction_accumulate %{{.*}} to %{{.*}} <add> par_dims(#acc<par_dims[thread_x]>) : i32 -> memref<i32>
-// CHECK: acc.reduction_combine %{{.*}} into %{{.*}} <add> : memref<i32> {acc.par_dims = #acc<par_dims[thread_x]>}
+// CHECK: acc.reduction_combine %{{.*}} into %{{.*}} <add> par_dims(#acc<par_dims[thread_x]>) : memref<i32>
 
 // -----
 



More information about the Mlir-commits mailing list