[Mlir-commits] [mlir] [mlir][acc] Handle OpenACC host_data in LegalizeDataValues (PR #134767)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Apr 11 16:41:34 PDT 2025
https://github.com/nvptm updated https://github.com/llvm/llvm-project/pull/134767
>From e95f2811278c5690595b1fc133459ea801892725 Mon Sep 17 00:00:00 2001
From: nvpm <pmathew at nvidia.com>
Date: Mon, 7 Apr 2025 13:48:08 -0700
Subject: [PATCH 1/9] Handle OpenACC host_data in LegalizeDataValues
---
mlir/include/mlir/Dialect/OpenACC/OpenACC.h | 5 ++---
.../OpenACC/Transforms/LegalizeDataValues.cpp | 5 ++++-
mlir/test/Dialect/OpenACC/legalize-data.mlir | 20 +++++++++++++++++++
3 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACC.h b/mlir/include/mlir/Dialect/OpenACC/OpenACC.h
index 748cb7f28fc8c..ff5845343313c 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACC.h
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACC.h
@@ -58,11 +58,10 @@
#define ACC_COMPUTE_CONSTRUCT_AND_LOOP_OPS \
ACC_COMPUTE_CONSTRUCT_OPS, mlir::acc::LoopOp
#define ACC_DATA_CONSTRUCT_STRUCTURED_OPS \
- mlir::acc::DataOp, mlir::acc::DeclareOp
+ mlir::acc::DataOp, mlir::acc::DeclareOp, mlir::acc::HostDataOp
#define ACC_DATA_CONSTRUCT_UNSTRUCTURED_OPS \
mlir::acc::EnterDataOp, mlir::acc::ExitDataOp, mlir::acc::UpdateOp, \
- mlir::acc::HostDataOp, mlir::acc::DeclareEnterOp, \
- mlir::acc::DeclareExitOp
+ mlir::acc::DeclareEnterOp, mlir::acc::DeclareExitOp
#define ACC_DATA_CONSTRUCT_OPS \
ACC_DATA_CONSTRUCT_STRUCTURED_OPS, ACC_DATA_CONSTRUCT_UNSTRUCTURED_OPS
#define ACC_COMPUTE_AND_DATA_CONSTRUCT_OPS \
diff --git a/mlir/lib/Dialect/OpenACC/Transforms/LegalizeDataValues.cpp b/mlir/lib/Dialect/OpenACC/Transforms/LegalizeDataValues.cpp
index a553653c73479..f2abeab744d17 100644
--- a/mlir/lib/Dialect/OpenACC/Transforms/LegalizeDataValues.cpp
+++ b/mlir/lib/Dialect/OpenACC/Transforms/LegalizeDataValues.cpp
@@ -81,7 +81,8 @@ static void collectAndReplaceInRegion(Op &op, bool hostToDevice) {
collectVars(op.getDataClauseOperands(), values, hostToDevice);
if constexpr (!std::is_same_v<Op, acc::KernelsOp> &&
!std::is_same_v<Op, acc::DataOp> &&
- !std::is_same_v<Op, acc::DeclareOp>) {
+ !std::is_same_v<Op, acc::DeclareOp> &&
+ !std::is_same_v<Op, acc::HostDataOp>) {
collectVars(op.getReductionOperands(), values, hostToDevice);
collectVars(op.getPrivateOperands(), values, hostToDevice);
collectVars(op.getFirstprivateOperands(), values, hostToDevice);
@@ -122,6 +123,8 @@ class LegalizeDataValuesInRegion
collectAndReplaceInRegion(dataOp, replaceHostVsDevice);
} else if (auto declareOp = dyn_cast<acc::DeclareOp>(*op)) {
collectAndReplaceInRegion(declareOp, replaceHostVsDevice);
+ } else if (auto hostDataOp = dyn_cast<acc::HostDataOp>(*op)) {
+ collectAndReplaceInRegion(hostDataOp, replaceHostVsDevice);
} else {
llvm_unreachable("unsupported acc region op");
}
diff --git a/mlir/test/Dialect/OpenACC/legalize-data.mlir b/mlir/test/Dialect/OpenACC/legalize-data.mlir
index baa72ae416c92..e192c0c55e599 100644
--- a/mlir/test/Dialect/OpenACC/legalize-data.mlir
+++ b/mlir/test/Dialect/OpenACC/legalize-data.mlir
@@ -226,3 +226,23 @@ func.func @test(%a: memref<10xf32>) {
// CHECK: }
// CHECK: acc.yield
// CHECK: }
+
+// -----
+
+func.func @test(%a: memref<10xf32>) {
+ %devptr = acc.use_device varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
+ acc.host_data dataOperands(%devptr : memref<10xf32>) {
+ fir.call @foo(%a) fastmath<contract> : (memref<10xf32>) -> ()
+ acc.terminator
+ }
+ return
+}
+func.func private @foo(memref<10xf32>)
+
+// CHECK-LABEL: func.func @test
+// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
+// CHECK: %[[USE_DEVICE:.*]] = acc.use_device varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
+// CHECK: acc.host_data dataOperands(%[[USE_DEVICE]] : memref<10xf32>) {
+// DEVICE: func.call @foo(%[[USE_DEVICE]]) : (memref<10xf32>) -> ()
+// CHECK: acc.terminator
+// CHECK: }
>From 378ebb0d4f207254fdd3bff8e740e874eaa5d06c Mon Sep 17 00:00:00 2001
From: nvpm <pmathew at nvidia.com>
Date: Thu, 10 Apr 2025 13:26:37 -0700
Subject: [PATCH 2/9] Fix test to use FUNC dialect instead of FIR which is
outside of the MLIR tree
---
mlir/test/Dialect/OpenACC/legalize-data.mlir | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/test/Dialect/OpenACC/legalize-data.mlir b/mlir/test/Dialect/OpenACC/legalize-data.mlir
index e192c0c55e599..ae854a42adb3f 100644
--- a/mlir/test/Dialect/OpenACC/legalize-data.mlir
+++ b/mlir/test/Dialect/OpenACC/legalize-data.mlir
@@ -232,7 +232,7 @@ func.func @test(%a: memref<10xf32>) {
func.func @test(%a: memref<10xf32>) {
%devptr = acc.use_device varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
acc.host_data dataOperands(%devptr : memref<10xf32>) {
- fir.call @foo(%a) fastmath<contract> : (memref<10xf32>) -> ()
+ func.call @foo(%a) fastmath<contract> : (memref<10xf32>) -> ()
acc.terminator
}
return
>From 40da6557d70d0ca30bb9f106daad41a7072446a2 Mon Sep 17 00:00:00 2001
From: nvpm <pmathew at nvidia.com>
Date: Thu, 10 Apr 2025 13:38:32 -0700
Subject: [PATCH 3/9] Add HOST check
---
mlir/test/Dialect/OpenACC/legalize-data.mlir | 1 +
1 file changed, 1 insertion(+)
diff --git a/mlir/test/Dialect/OpenACC/legalize-data.mlir b/mlir/test/Dialect/OpenACC/legalize-data.mlir
index ae854a42adb3f..e1cc8ba808f74 100644
--- a/mlir/test/Dialect/OpenACC/legalize-data.mlir
+++ b/mlir/test/Dialect/OpenACC/legalize-data.mlir
@@ -244,5 +244,6 @@ func.func private @foo(memref<10xf32>)
// CHECK: %[[USE_DEVICE:.*]] = acc.use_device varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.host_data dataOperands(%[[USE_DEVICE]] : memref<10xf32>) {
// DEVICE: func.call @foo(%[[USE_DEVICE]]) : (memref<10xf32>) -> ()
+// HOST: func.call @foo(%[[A]]): (memref<10xf32>) -> ()
// CHECK: acc.terminator
// CHECK: }
>From c766b08791d290051fd3473b69e3e722b353704e Mon Sep 17 00:00:00 2001
From: nvpm <pmathew at nvidia.com>
Date: Thu, 10 Apr 2025 14:03:59 -0700
Subject: [PATCH 4/9] Simplify test as 'fastmath' causes error.
---
mlir/test/Dialect/OpenACC/legalize-data.mlir | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/test/Dialect/OpenACC/legalize-data.mlir b/mlir/test/Dialect/OpenACC/legalize-data.mlir
index e1cc8ba808f74..9a00f467fa0b4 100644
--- a/mlir/test/Dialect/OpenACC/legalize-data.mlir
+++ b/mlir/test/Dialect/OpenACC/legalize-data.mlir
@@ -232,7 +232,7 @@ func.func @test(%a: memref<10xf32>) {
func.func @test(%a: memref<10xf32>) {
%devptr = acc.use_device varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
acc.host_data dataOperands(%devptr : memref<10xf32>) {
- func.call @foo(%a) fastmath<contract> : (memref<10xf32>) -> ()
+ func.call @foo(%a) : (memref<10xf32>) -> ()
acc.terminator
}
return
>From e4beee4d9fb512ada47646ca3f11d69b1a3e66e7 Mon Sep 17 00:00:00 2001
From: nvpm <pmathew at nvidia.com>
Date: Fri, 11 Apr 2025 15:53:47 -0700
Subject: [PATCH 5/9] Move host_data test to separate file
---
.../Dialect/OpenACC/legalize-host-data.mlir | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 mlir/test/Dialect/OpenACC/legalize-host-data.mlir
diff --git a/mlir/test/Dialect/OpenACC/legalize-host-data.mlir b/mlir/test/Dialect/OpenACC/legalize-host-data.mlir
new file mode 100644
index 0000000000000..24bcba46328b8
--- /dev/null
+++ b/mlir/test/Dialect/OpenACC/legalize-host-data.mlir
@@ -0,0 +1,21 @@
+// RUN: mlir-opt -split-input-file --openacc-legalize-data-values %s | FileCheck %s --check-prefixes=CHECK,DEVICE
+// RUN: mlir-opt -split-input-file --openacc-legalize-data-values=host-to-device=false %s | FileCheck %s --check-prefixes=CHECK,HOST
+
+func.func @test(%a: memref<10xf32>) {
+ %devptr = acc.use_device varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
+ acc.host_data dataOperands(%devptr : memref<10xf32>) {
+ func.call @foo(%a) : (memref<10xf32>) -> ()
+ acc.terminator
+ }
+ return
+}
+func.func private @foo(memref<10xf32>)
+
+// CHECK-LABEL: func.func @test
+// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
+// CHECK: %[[USE_DEVICE:.*]] = acc.use_device varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
+// CHECK: acc.host_data dataOperands(%[[USE_DEVICE]] : memref<10xf32>) {
+// DEVICE: func.call @foo(%[[USE_DEVICE]]) : (memref<10xf32>) -> ()
+// HOST: func.call @foo(%[[A]]): (memref<10xf32>) -> ()
+// CHECK: acc.terminator
+// CHECK: }
\ No newline at end of file
>From 4847826ec06d1a83fec9c90fb2799c0e482228bb Mon Sep 17 00:00:00 2001
From: nvpm <pmathew at nvidia.com>
Date: Fri, 11 Apr 2025 15:55:37 -0700
Subject: [PATCH 6/9] Move host_data test to separate file
---
mlir/test/Dialect/OpenACC/legalize-data.mlir | 21 --------------------
1 file changed, 21 deletions(-)
diff --git a/mlir/test/Dialect/OpenACC/legalize-data.mlir b/mlir/test/Dialect/OpenACC/legalize-data.mlir
index 9a00f467fa0b4..baa72ae416c92 100644
--- a/mlir/test/Dialect/OpenACC/legalize-data.mlir
+++ b/mlir/test/Dialect/OpenACC/legalize-data.mlir
@@ -226,24 +226,3 @@ func.func @test(%a: memref<10xf32>) {
// CHECK: }
// CHECK: acc.yield
// CHECK: }
-
-// -----
-
-func.func @test(%a: memref<10xf32>) {
- %devptr = acc.use_device varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
- acc.host_data dataOperands(%devptr : memref<10xf32>) {
- func.call @foo(%a) : (memref<10xf32>) -> ()
- acc.terminator
- }
- return
-}
-func.func private @foo(memref<10xf32>)
-
-// CHECK-LABEL: func.func @test
-// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
-// CHECK: %[[USE_DEVICE:.*]] = acc.use_device varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
-// CHECK: acc.host_data dataOperands(%[[USE_DEVICE]] : memref<10xf32>) {
-// DEVICE: func.call @foo(%[[USE_DEVICE]]) : (memref<10xf32>) -> ()
-// HOST: func.call @foo(%[[A]]): (memref<10xf32>) -> ()
-// CHECK: acc.terminator
-// CHECK: }
>From 1aa4bf896d72c8384014888a76b40f06aa87ca15 Mon Sep 17 00:00:00 2001
From: nvpm <pmathew at nvidia.com>
Date: Fri, 11 Apr 2025 16:11:10 -0700
Subject: [PATCH 7/9] Remove HOST check for now
---
mlir/test/Dialect/OpenACC/legalize-host-data.mlir | 1 -
1 file changed, 1 deletion(-)
diff --git a/mlir/test/Dialect/OpenACC/legalize-host-data.mlir b/mlir/test/Dialect/OpenACC/legalize-host-data.mlir
index 24bcba46328b8..e265819516ad4 100644
--- a/mlir/test/Dialect/OpenACC/legalize-host-data.mlir
+++ b/mlir/test/Dialect/OpenACC/legalize-host-data.mlir
@@ -16,6 +16,5 @@ func.func private @foo(memref<10xf32>)
// CHECK: %[[USE_DEVICE:.*]] = acc.use_device varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.host_data dataOperands(%[[USE_DEVICE]] : memref<10xf32>) {
// DEVICE: func.call @foo(%[[USE_DEVICE]]) : (memref<10xf32>) -> ()
-// HOST: func.call @foo(%[[A]]): (memref<10xf32>) -> ()
// CHECK: acc.terminator
// CHECK: }
\ No newline at end of file
>From f34202095058a5f01bc6e5563936f81ff8f8e125 Mon Sep 17 00:00:00 2001
From: nvpm <pmathew at nvidia.com>
Date: Fri, 11 Apr 2025 16:21:50 -0700
Subject: [PATCH 8/9] Remove RUN command that uses HOST check
---
mlir/test/Dialect/OpenACC/legalize-host-data.mlir | 1 -
1 file changed, 1 deletion(-)
diff --git a/mlir/test/Dialect/OpenACC/legalize-host-data.mlir b/mlir/test/Dialect/OpenACC/legalize-host-data.mlir
index e265819516ad4..e19c99efa3863 100644
--- a/mlir/test/Dialect/OpenACC/legalize-host-data.mlir
+++ b/mlir/test/Dialect/OpenACC/legalize-host-data.mlir
@@ -1,5 +1,4 @@
// RUN: mlir-opt -split-input-file --openacc-legalize-data-values %s | FileCheck %s --check-prefixes=CHECK,DEVICE
-// RUN: mlir-opt -split-input-file --openacc-legalize-data-values=host-to-device=false %s | FileCheck %s --check-prefixes=CHECK,HOST
func.func @test(%a: memref<10xf32>) {
%devptr = acc.use_device varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
>From fca994f2e57e130614f70e2aa56a9b2902f56a3b Mon Sep 17 00:00:00 2001
From: nvpm <pmathew at nvidia.com>
Date: Fri, 11 Apr 2025 16:41:14 -0700
Subject: [PATCH 9/9] Place updated passing test back with other tests
---
mlir/test/Dialect/OpenACC/legalize-data.mlir | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/mlir/test/Dialect/OpenACC/legalize-data.mlir b/mlir/test/Dialect/OpenACC/legalize-data.mlir
index baa72ae416c92..26395d72e6fb1 100644
--- a/mlir/test/Dialect/OpenACC/legalize-data.mlir
+++ b/mlir/test/Dialect/OpenACC/legalize-data.mlir
@@ -226,3 +226,23 @@ func.func @test(%a: memref<10xf32>) {
// CHECK: }
// CHECK: acc.yield
// CHECK: }
+
+// -----
+
+func.func @test(%a: memref<10xf32>) {
+ %devptr = acc.use_device varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
+ acc.host_data dataOperands(%devptr : memref<10xf32>) {
+ func.call @foo(%a) : (memref<10xf32>) -> ()
+ acc.terminator
+ }
+ return
+}
+func.func private @foo(memref<10xf32>)
+
+// CHECK-LABEL: func.func @test
+// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
+// CHECK: %[[USE_DEVICE:.*]] = acc.use_device varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
+// CHECK: acc.host_data dataOperands(%[[USE_DEVICE]] : memref<10xf32>) {
+// DEVICE: func.call @foo(%[[USE_DEVICE]]) : (memref<10xf32>) -> ()
+// CHECK: acc.terminator
+// CHECK: }
\ No newline at end of file
More information about the Mlir-commits
mailing list