[Mlir-commits] [flang] [mlir] [mlir][acc] Replicate privatized storage across active parallel dims (PR #235974)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Oct 26 18:05:25 PDT 2026
https://github.com/yebinchon updated https://github.com/llvm/llvm-project/pull/235974
>From b0ecd6aa11a8bb5ed6b1e877f25e61fe7aaf3b52 Mon Sep 17 00:00:00 2001
From: Yebin Chon <ychon at nvidia.com>
Date: Mon, 26 Oct 2026 17:50:50 -0700
Subject: [PATCH 1/2] Replicate privatized storage across active parallel dims
---
.../acc-fir-map-info-prep-privatize.mlir | 33 +++++++++++++++++++
.../Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp | 22 +++++++++----
2 files changed, 48 insertions(+), 7 deletions(-)
diff --git a/flang/test/Fir/OpenACC/acc-fir-map-info-prep-privatize.mlir b/flang/test/Fir/OpenACC/acc-fir-map-info-prep-privatize.mlir
index 9c0395f01d6ef0..3e24175984626d 100644
--- a/flang/test/Fir/OpenACC/acc-fir-map-info-prep-privatize.mlir
+++ b/flang/test/Fir/OpenACC/acc-fir-map-info-prep-privatize.mlir
@@ -35,6 +35,39 @@ func.func @private_parallel_levels() {
// -----
+// Ownership par_dims can be narrower than the active dimensions the kernel
+// indexes the storage by, e.g. a vector reduction temporary allocated inside a
+// gang loop. The storage is replicated across both.
+
+// CHECK-LABEL: func.func @private_active_wider_than_par_dims
+// CHECK: %[[PRIV:.*]] = acc.privatize
+// CHECK: acc.map_info varPtr(%[[PRIV]] : !acc.private_type<memref<8xi32>>)
+// CHECK-SAME: mapFlags(private,gang_private,vector_private)
+func.func @private_active_wider_than_par_dims() {
+ %priv = acc.privatize par_dims(#acc<par_dims[thread_x]>)
+ {acc.active_par_dims = #acc<active_par_dims[block_x, thread_x]>}
+ : () -> !acc.private_type<memref<8xi32>>
+ return
+}
+
+// -----
+
+// Without par_dims the storage is not replicated per level, even when the op
+// has active dimensions.
+
+// CHECK-LABEL: func.func @private_active_without_par_dims
+// CHECK: %[[PRIV:.*]] = acc.privatize
+// CHECK: acc.map_info varPtr(%[[PRIV]] : !acc.private_type<memref<8xi32>>)
+// CHECK-SAME: mapFlags(private)
+func.func @private_active_without_par_dims() {
+ %priv = acc.privatize
+ {acc.active_par_dims = #acc<active_par_dims[block_x, thread_x]>}
+ : () -> !acc.private_type<memref<8xi32>>
+ return
+}
+
+// -----
+
// Privatized storage need not name any parallel dimension - storage promoted to
// shared memory is private without being replicated per level. Such a
// privatization carries no par_dims at all, not an empty one.
diff --git a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
index 7c90f09e4b37b0..59e50240e03015 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
+++ b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
@@ -631,13 +631,21 @@ MapFlags computePrivatizeMapFlags(PrivatizeOp privatizeOp,
if (!parDims)
return flags;
- for (GPUParallelDimAttr parDim : parDims.getArray()) {
- if (policy.isGang(parDim))
- flags = flags | MapFlags::gang_private;
- else if (policy.isWorker(parDim))
- flags = flags | MapFlags::worker_private;
- else if (policy.isVector(parDim))
- flags = flags | MapFlags::vector_private;
+ auto addLevelFlags = [&](ArrayRef<GPUParallelDimAttr> dims) {
+ for (GPUParallelDimAttr parDim : dims) {
+ if (policy.isGang(parDim))
+ flags = flags | MapFlags::gang_private;
+ else if (policy.isWorker(parDim))
+ flags = flags | MapFlags::worker_private;
+ else if (policy.isVector(parDim))
+ flags = flags | MapFlags::vector_private;
+ }
+ };
+ addLevelFlags(parDims.getArray());
+ // Ownership par_dims may be narrower than the dimensions the kernel indexes
+ // the storage by, so replicate across the active dimensions as well.
+ if(ActiveParDimsAttr activeParDims = getActiveParDimsAttr(privatizeOp)) {
+ addLevelFlags(activeParDims.getArray());
}
return flags;
}
>From 6968bf91f16d0adb5b3ace869eaca0920b48588a Mon Sep 17 00:00:00 2001
From: Yebin Chon <ychon at nvidia.com>
Date: Mon, 26 Oct 2026 18:05:14 -0700
Subject: [PATCH 2/2] format
---
mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
index 59e50240e03015..0b6dc7a166dbb6 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
+++ b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
@@ -644,7 +644,7 @@ MapFlags computePrivatizeMapFlags(PrivatizeOp privatizeOp,
addLevelFlags(parDims.getArray());
// Ownership par_dims may be narrower than the dimensions the kernel indexes
// the storage by, so replicate across the active dimensions as well.
- if(ActiveParDimsAttr activeParDims = getActiveParDimsAttr(privatizeOp)) {
+ if (ActiveParDimsAttr activeParDims = getActiveParDimsAttr(privatizeOp)) {
addLevelFlags(activeParDims.getArray());
}
return flags;
More information about the Mlir-commits
mailing list