[Mlir-commits] [mlir] e6d8598 - [mlir][flang][openacc] Use new firstprivate representation for compute construct
Valentin Clement
llvmlistbot at llvm.org
Tue Jun 13 20:32:31 PDT 2023
Author: Valentin Clement
Date: 2023-06-13T20:32:23-07:00
New Revision: e6d8598e13daea56406f25ab640626da3b7e1f59
URL: https://github.com/llvm/llvm-project/commit/e6d8598e13daea56406f25ab640626da3b7e1f59
DIFF: https://github.com/llvm/llvm-project/commit/e6d8598e13daea56406f25ab640626da3b7e1f59.diff
LOG: [mlir][flang][openacc] Use new firstprivate representation for compute construct
Use the new firstprivate representation on the comupte construct.
Reviewed By: razvanlupusoru, jeanPerier
Differential Revision: https://reviews.llvm.org/D151975
Added:
Modified:
flang/include/flang/Lower/OpenACC.h
flang/lib/Lower/OpenACC.cpp
flang/test/Lower/OpenACC/acc-parallel-loop.f90
flang/test/Lower/OpenACC/acc-parallel.f90
flang/test/Lower/OpenACC/acc-serial-loop.f90
flang/test/Lower/OpenACC/acc-serial.f90
mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
mlir/test/Dialect/OpenACC/ops.mlir
Removed:
################################################################################
diff --git a/flang/include/flang/Lower/OpenACC.h b/flang/include/flang/Lower/OpenACC.h
index 7546e842787f0..5119e10a99832 100644
--- a/flang/include/flang/Lower/OpenACC.h
+++ b/flang/include/flang/Lower/OpenACC.h
@@ -62,6 +62,13 @@ mlir::acc::ReductionRecipeOp
createOrGetReductionRecipe(mlir::OpBuilder &, llvm::StringRef, mlir::Location,
mlir::Type, mlir::acc::ReductionOperator);
+/// Get a acc.firstprivate.recipe op for the given type or create it if it does
+/// not exist yet.
+mlir::acc::FirstprivateRecipeOp createOrGetFirstprivateRecipe(mlir::OpBuilder &,
+ llvm::StringRef,
+ mlir::Location,
+ mlir::Type);
+
} // namespace lower
} // namespace Fortran
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index 4d58096938336..22211e464d396 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -499,6 +499,36 @@ Fortran::lower::createOrGetPrivateRecipe(mlir::OpBuilder &builder,
return recipe;
}
+mlir::acc::FirstprivateRecipeOp Fortran::lower::createOrGetFirstprivateRecipe(
+ mlir::OpBuilder &builder, llvm::StringRef recipeName, mlir::Location loc,
+ mlir::Type ty) {
+ mlir::ModuleOp mod =
+ builder.getBlock()->getParent()->getParentOfType<mlir::ModuleOp>();
+ if (auto recipe =
+ mod.lookupSymbol<mlir::acc::FirstprivateRecipeOp>(recipeName))
+ return recipe;
+
+ auto crtPos = builder.saveInsertionPoint();
+ mlir::OpBuilder modBuilder(mod.getBodyRegion());
+ auto recipe =
+ modBuilder.create<mlir::acc::FirstprivateRecipeOp>(loc, recipeName, ty);
+ builder.createBlock(&recipe.getInitRegion(), recipe.getInitRegion().end(),
+ {ty}, {loc});
+ builder.setInsertionPointToEnd(&recipe.getInitRegion().back());
+ builder.create<mlir::acc::YieldOp>(
+ loc, recipe.getInitRegion().front().getArgument(0));
+
+ // Add empty copy region for firstprivate. TODO add copy sequence.
+ builder.createBlock(&recipe.getCopyRegion(), recipe.getCopyRegion().end(),
+ {ty, ty}, {loc, loc});
+ builder.setInsertionPointToEnd(&recipe.getCopyRegion().back());
+ builder.create<mlir::acc::TerminatorOp>(loc);
+
+ builder.restoreInsertionPoint(crtPos);
+ return recipe;
+}
+
+template <typename Op>
static void
genPrivatizations(const Fortran::parser::AccObjectList &objectList,
Fortran::lower::AbstractConverter &converter,
@@ -514,11 +544,18 @@ genPrivatizations(const Fortran::parser::AccObjectList &objectList,
mlir::Value baseAddr = gatherDataOperandAddrAndBounds(
converter, builder, semanticsContext, stmtCtx, accObject,
operandLocation, asFortran, bounds);
- std::string recipeName = fir::getTypeAsString(
- baseAddr.getType(), converter.getKindMap(), "privatization");
- mlir::acc::PrivateRecipeOp recipe =
- Fortran::lower::createOrGetPrivateRecipe(
- builder, recipeName, operandLocation, baseAddr.getType());
+ Op recipe;
+ if constexpr (std::is_same_v<Op, mlir::acc::PrivateRecipeOp>) {
+ std::string recipeName = fir::getTypeAsString(
+ baseAddr.getType(), converter.getKindMap(), "privatization");
+ recipe = Fortran::lower::createOrGetPrivateRecipe(
+ builder, recipeName, operandLocation, baseAddr.getType());
+ } else {
+ std::string recipeName = fir::getTypeAsString(
+ baseAddr.getType(), converter.getKindMap(), "firstprivatization");
+ recipe = Fortran::lower::createOrGetFirstprivateRecipe(
+ builder, recipeName, operandLocation, baseAddr.getType());
+ }
privatizations.push_back(mlir::SymbolRefAttr::get(
builder.getContext(), recipe.getSymName().str()));
dataOperands.push_back(baseAddr);
@@ -870,8 +907,9 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
} else if (const auto *privateClause =
std::get_if<Fortran::parser::AccClause::Private>(
&clause.u)) {
- genPrivatizations(privateClause->v, converter, semanticsContext, stmtCtx,
- privateOperands, privatizations);
+ genPrivatizations<mlir::acc::PrivateRecipeOp>(
+ privateClause->v, converter, semanticsContext, stmtCtx,
+ privateOperands, privatizations);
} else if (const auto *reductionClause =
std::get_if<Fortran::parser::AccClause::Reduction>(
&clause.u)) {
@@ -1006,7 +1044,8 @@ createComputeOp(Fortran::lower::AbstractConverter &converter,
llvm::SmallVector<mlir::Value> reductionOperands, privateOperands,
firstprivateOperands;
- llvm::SmallVector<mlir::Attribute> privatizations, reductionRecipes;
+ llvm::SmallVector<mlir::Attribute> privatizations, firstPrivatizations,
+ reductionRecipes;
// Async, wait and self clause have optional values but can be present with
// no value as well. When there is no value, the op has an attribute to
@@ -1153,13 +1192,15 @@ createComputeOp(Fortran::lower::AbstractConverter &converter,
} else if (const auto *privateClause =
std::get_if<Fortran::parser::AccClause::Private>(
&clause.u)) {
- genPrivatizations(privateClause->v, converter, semanticsContext, stmtCtx,
- privateOperands, privatizations);
+ genPrivatizations<mlir::acc::PrivateRecipeOp>(
+ privateClause->v, converter, semanticsContext, stmtCtx,
+ privateOperands, privatizations);
} else if (const auto *firstprivateClause =
std::get_if<Fortran::parser::AccClause::Firstprivate>(
&clause.u)) {
- genObjectList(firstprivateClause->v, converter, semanticsContext, stmtCtx,
- firstprivateOperands);
+ genPrivatizations<mlir::acc::FirstprivateRecipeOp>(
+ firstprivateClause->v, converter, semanticsContext, stmtCtx,
+ firstprivateOperands, firstPrivatizations);
} else if (const auto *reductionClause =
std::get_if<Fortran::parser::AccClause::Reduction>(
&clause.u)) {
@@ -1209,6 +1250,9 @@ createComputeOp(Fortran::lower::AbstractConverter &converter,
if (!reductionRecipes.empty())
computeOp.setReductionRecipesAttr(
mlir::ArrayAttr::get(builder.getContext(), reductionRecipes));
+ if (!firstPrivatizations.empty())
+ computeOp.setFirstprivatizationsAttr(
+ mlir::ArrayAttr::get(builder.getContext(), firstPrivatizations));
}
auto insPt = builder.saveInsertionPoint();
diff --git a/flang/test/Lower/OpenACC/acc-parallel-loop.f90 b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
index b295a905bfd85..8bf3fd5781230 100644
--- a/flang/test/Lower/OpenACC/acc-parallel-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
@@ -2,6 +2,14 @@
! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s
+! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_10xf32 : !fir.ref<!fir.array<10xf32>> init {
+! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10xf32>>):
+! CHECK: acc.yield %arg0 : !fir.ref<!fir.array<10xf32>>
+! CHECK: } copy {
+! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10xf32>>, %arg1: !fir.ref<!fir.array<10xf32>>):
+! CHECK: acc.terminator
+! CHECK: }
+
! CHECK-LABEL: acc.private.recipe @privatization_ref_10xf32 : !fir.ref<!fir.array<10xf32>> init {
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10xf32>>):
! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10xf32>>
@@ -456,7 +464,7 @@ subroutine acc_parallel_loop
a(i) = b(i)
END DO
-! CHECK: acc.parallel firstprivate(%[[B]] : !fir.ref<!fir.array<10xf32>>) private(@privatization_ref_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
+! CHECK: acc.parallel firstprivate(@firstprivatization_ref_10xf32 -> %[[B]] : !fir.ref<!fir.array<10xf32>>) private(@privatization_ref_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
! CHECK: acc.loop private(@privatization_ref_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
! CHECK: fir.do_loop
! CHECK: acc.yield
diff --git a/flang/test/Lower/OpenACC/acc-parallel.f90 b/flang/test/Lower/OpenACC/acc-parallel.f90
index acfab91f46710..b8c4cb94c53f4 100644
--- a/flang/test/Lower/OpenACC/acc-parallel.f90
+++ b/flang/test/Lower/OpenACC/acc-parallel.f90
@@ -2,6 +2,14 @@
! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s
+! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
+! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10x10xf32>>):
+! CHECK: acc.yield %arg0 : !fir.ref<!fir.array<10x10xf32>>
+! CHECK: } copy {
+! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10x10xf32>>, %arg1: !fir.ref<!fir.array<10x10xf32>>):
+! CHECK: acc.terminator
+! CHECK: }
+
! CHECK-LABEL: acc.private.recipe @privatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):
! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10x10xf32>>
@@ -300,7 +308,7 @@ subroutine acc_parallel
!$acc parallel private(a) firstprivate(b) private(c)
!$acc end parallel
-! CHECK: acc.parallel firstprivate(%[[B]] : !fir.ref<!fir.array<10x10xf32>>) private(@privatization_ref_10x10xf32 -> %[[A]] : !fir.ref<!fir.array<10x10xf32>>, @privatization_ref_10x10xf32 -> %[[C]] : !fir.ref<!fir.array<10x10xf32>>) {
+! CHECK: acc.parallel firstprivate(@firstprivatization_ref_10x10xf32 -> %[[B]] : !fir.ref<!fir.array<10x10xf32>>) private(@privatization_ref_10x10xf32 -> %[[A]] : !fir.ref<!fir.array<10x10xf32>>, @privatization_ref_10x10xf32 -> %[[C]] : !fir.ref<!fir.array<10x10xf32>>) {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/flang/test/Lower/OpenACC/acc-serial-loop.f90 b/flang/test/Lower/OpenACC/acc-serial-loop.f90
index bf83af8bf55fd..7108464c1f7ff 100644
--- a/flang/test/Lower/OpenACC/acc-serial-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-serial-loop.f90
@@ -2,6 +2,14 @@
! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s
+! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_10xf32 : !fir.ref<!fir.array<10xf32>> init {
+! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10xf32>>):
+! CHECK: acc.yield %arg0 : !fir.ref<!fir.array<10xf32>>
+! CHECK: } copy {
+! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10xf32>>, %arg1: !fir.ref<!fir.array<10xf32>>):
+! CHECK: acc.terminator
+! CHECK: }
+
! CHECK-LABEL: acc.private.recipe @privatization_ref_10xf32 : !fir.ref<!fir.array<10xf32>> init {
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10xf32>>):
! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10xf32>>
@@ -372,7 +380,7 @@ subroutine acc_serial_loop
a(i) = b(i)
END DO
-! CHECK: acc.serial firstprivate(%[[B]] : !fir.ref<!fir.array<10xf32>>) private(@privatization_ref_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
+! CHECK: acc.serial firstprivate(@firstprivatization_ref_10xf32 -> %[[B]] : !fir.ref<!fir.array<10xf32>>) private(@privatization_ref_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
! CHECK: acc.loop private(@privatization_ref_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
! CHECK: fir.do_loop
! CHECK: acc.yield
diff --git a/flang/test/Lower/OpenACC/acc-serial.f90 b/flang/test/Lower/OpenACC/acc-serial.f90
index 4d17d58c24100..fcc7d0e504318 100644
--- a/flang/test/Lower/OpenACC/acc-serial.f90
+++ b/flang/test/Lower/OpenACC/acc-serial.f90
@@ -2,6 +2,14 @@
! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s
+! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
+! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10x10xf32>>):
+! CHECK: acc.yield %arg0 : !fir.ref<!fir.array<10x10xf32>>
+! CHECK: } copy {
+! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10x10xf32>>, %arg1: !fir.ref<!fir.array<10x10xf32>>):
+! CHECK: acc.terminator
+! CHECK: }
+
! CHECK-LABEL: acc.private.recipe @privatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):
! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10x10xf32>>
@@ -243,7 +251,7 @@ subroutine acc_serial
!$acc serial private(a) firstprivate(b) private(c)
!$acc end serial
-! CHECK: acc.serial firstprivate(%[[B]] : !fir.ref<!fir.array<10x10xf32>>) private(@privatization_ref_10x10xf32 -> %[[A]] : !fir.ref<!fir.array<10x10xf32>>, @privatization_ref_10x10xf32 -> %[[C]] : !fir.ref<!fir.array<10x10xf32>>) {
+! CHECK: acc.serial firstprivate(@firstprivatization_ref_10x10xf32 -> %[[B]] : !fir.ref<!fir.array<10x10xf32>>) private(@privatization_ref_10x10xf32 -> %[[A]] : !fir.ref<!fir.array<10x10xf32>>, @privatization_ref_10x10xf32 -> %[[C]] : !fir.ref<!fir.array<10x10xf32>>) {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
index 85ffc39586390..92797f99aaa68 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
@@ -639,7 +639,8 @@ def OpenACC_ParallelOp : OpenACC_Op<"parallel",
OptionalAttr<SymbolRefArrayAttr>:$reductionRecipes,
Variadic<OpenACC_PointerLikeTypeInterface>:$gangPrivateOperands,
OptionalAttr<SymbolRefArrayAttr>:$privatizations,
- Variadic<AnyType>:$gangFirstPrivateOperands,
+ Variadic<OpenACC_PointerLikeTypeInterface>:$gangFirstPrivateOperands,
+ OptionalAttr<SymbolRefArrayAttr>:$firstprivatizations,
Variadic<OpenACC_PointerLikeTypeInterface>:$dataClauseOperands,
OptionalAttr<DefaultValueAttr>:$defaultAttr);
@@ -657,8 +658,9 @@ def OpenACC_ParallelOp : OpenACC_Op<"parallel",
oilist(
`dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
| `async` `(` $async `:` type($async) `)`
- | `firstprivate` `(` $gangFirstPrivateOperands `:`
- type($gangFirstPrivateOperands) `)`
+ | `firstprivate` `(` custom<SymOperandList>($gangFirstPrivateOperands,
+ type($gangFirstPrivateOperands), $firstprivatizations)
+ `)`
| `num_gangs` `(` $numGangs `:` type($numGangs) `)`
| `num_workers` `(` $numWorkers `:` type($numWorkers) `)`
| `private` `(` custom<SymOperandList>(
@@ -709,7 +711,8 @@ def OpenACC_SerialOp : OpenACC_Op<"serial",
OptionalAttr<SymbolRefArrayAttr>:$reductionRecipes,
Variadic<OpenACC_PointerLikeTypeInterface>:$gangPrivateOperands,
OptionalAttr<SymbolRefArrayAttr>:$privatizations,
- Variadic<AnyType>:$gangFirstPrivateOperands,
+ Variadic<OpenACC_PointerLikeTypeInterface>:$gangFirstPrivateOperands,
+ OptionalAttr<SymbolRefArrayAttr>:$firstprivatizations,
Variadic<OpenACC_PointerLikeTypeInterface>:$dataClauseOperands,
OptionalAttr<DefaultValueAttr>:$defaultAttr);
@@ -727,8 +730,9 @@ def OpenACC_SerialOp : OpenACC_Op<"serial",
oilist(
`dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
| `async` `(` $async `:` type($async) `)`
- | `firstprivate` `(` $gangFirstPrivateOperands `:`
- type($gangFirstPrivateOperands) `)`
+ | `firstprivate` `(` custom<SymOperandList>($gangFirstPrivateOperands,
+ type($gangFirstPrivateOperands), $firstprivatizations)
+ `)`
| `private` `(` custom<SymOperandList>(
$gangPrivateOperands, type($gangPrivateOperands), $privatizations)
`)`
diff --git a/mlir/test/Dialect/OpenACC/ops.mlir b/mlir/test/Dialect/OpenACC/ops.mlir
index aa2f95a136205..ef83d93bc87c0 100644
--- a/mlir/test/Dialect/OpenACC/ops.mlir
+++ b/mlir/test/Dialect/OpenACC/ops.mlir
@@ -404,6 +404,19 @@ acc.private.recipe @privatization_memref_10_10_f32 : memref<10x10xf32> init {
acc.terminator
}
+acc.firstprivate.recipe @privatization_memref_10xf32 : memref<10xf32> init {
+^bb0(%arg0: memref<10xf32>):
+ %0 = memref.alloc() : memref<10xf32>
+ acc.yield %0 : memref<10xf32>
+} copy {
+^bb0(%arg0: memref<10xf32>, %arg1: memref<10xf32>):
+ acc.terminator
+} destroy {
+^bb0(%arg0: memref<10xf32>):
+ memref.dealloc %arg0 : memref<10xf32>
+ acc.terminator
+}
+
func.func @testparallelop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10xf32>) -> () {
%i64value = arith.constant 1 : i64
%i32value = arith.constant 1 : i32
@@ -440,7 +453,7 @@ func.func @testparallelop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x
}
acc.parallel vector_length(%idxValue: index) {
}
- acc.parallel private(@privatization_memref_10_f32 -> %a : memref<10xf32>, @privatization_memref_10_10_f32 -> %c : memref<10x10xf32>) firstprivate(%b: memref<10xf32>) {
+ acc.parallel private(@privatization_memref_10_f32 -> %a : memref<10xf32>, @privatization_memref_10_10_f32 -> %c : memref<10x10xf32>) firstprivate(@privatization_memref_10xf32 -> %b: memref<10xf32>) {
}
acc.parallel {
} attributes {defaultAttr = #acc<defaultvalue none>}
@@ -491,7 +504,7 @@ func.func @testparallelop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x
// CHECK-NEXT: }
// CHECK: acc.parallel vector_length([[IDXVALUE]] : index) {
// CHECK-NEXT: }
-// CHECK: acc.parallel firstprivate([[ARGB]] : memref<10xf32>) private(@privatization_memref_10_f32 -> [[ARGA]] : memref<10xf32>, @privatization_memref_10_10_f32 -> [[ARGC]] : memref<10x10xf32>) {
+// CHECK: acc.parallel firstprivate(@privatization_memref_10xf32 -> [[ARGB]] : memref<10xf32>) private(@privatization_memref_10_f32 -> [[ARGA]] : memref<10xf32>, @privatization_memref_10_10_f32 -> [[ARGC]] : memref<10x10xf32>) {
// CHECK-NEXT: }
// CHECK: acc.parallel {
// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
@@ -526,7 +539,19 @@ acc.private.recipe @privatization_memref_10_10_f32 : memref<10x10xf32> init {
acc.terminator
}
-acc.firstprivate.recipe @privatization_memref_10xf32 : memref<10xf32> init {
+// Test optional destroy region
+acc.firstprivate.recipe @firstprivatization_memref_20xf32 : memref<20xf32> init {
+^bb0(%arg0: memref<20xf32>):
+ %0 = memref.alloc() : memref<20xf32>
+ acc.yield %0 : memref<20xf32>
+} copy {
+^bb0(%arg0: memref<20xf32>, %arg1: memref<20xf32>):
+ acc.terminator
+}
+
+// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_memref_20xf32 : memref<20xf32> init
+
+acc.firstprivate.recipe @firstprivatization_memref_10xf32 : memref<10xf32> init {
^bb0(%arg0: memref<10xf32>):
%0 = memref.alloc() : memref<10xf32>
acc.yield %0 : memref<10xf32>
@@ -539,18 +564,6 @@ acc.firstprivate.recipe @privatization_memref_10xf32 : memref<10xf32> init {
acc.terminator
}
-// Test optional destroy region
-acc.firstprivate.recipe @privatization_memref_20xf32 : memref<20xf32> init {
-^bb0(%arg0: memref<20xf32>):
- %0 = memref.alloc() : memref<20xf32>
- acc.yield %0 : memref<20xf32>
-} copy {
-^bb0(%arg0: memref<20xf32>, %arg1: memref<20xf32>):
- acc.terminator
-}
-
-// CHECK-LABEL: acc.firstprivate.recipe @privatization_memref_20xf32 : memref<20xf32> init
-
func.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10xf32>) -> () {
%i64value = arith.constant 1 : i64
%i32value = arith.constant 1 : i32
@@ -569,7 +582,7 @@ func.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10
}
acc.serial wait(%i64value, %i32value, %idxValue : i64, i32, index) {
}
- acc.serial private(@privatization_memref_10_f32 -> %a : memref<10xf32>, @privatization_memref_10_10_f32 -> %c : memref<10x10xf32>) firstprivate(%b: memref<10xf32>) {
+ acc.serial private(@privatization_memref_10_f32 -> %a : memref<10xf32>, @privatization_memref_10_10_f32 -> %c : memref<10x10xf32>) firstprivate(@firstprivatization_memref_10xf32 -> %b: memref<10xf32>) {
}
acc.serial {
} attributes {defaultAttr = #acc<defaultvalue none>}
@@ -605,7 +618,7 @@ func.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10
// CHECK-NEXT: }
// CHECK: acc.serial wait([[I64VALUE]], [[I32VALUE]], [[IDXVALUE]] : i64, i32, index) {
// CHECK-NEXT: }
-// CHECK: acc.serial firstprivate([[ARGB]] : memref<10xf32>) private(@privatization_memref_10_f32 -> [[ARGA]] : memref<10xf32>, @privatization_memref_10_10_f32 -> [[ARGC]] : memref<10x10xf32>) {
+// CHECK: acc.serial firstprivate(@firstprivatization_memref_10xf32 -> [[ARGB]] : memref<10xf32>) private(@privatization_memref_10_f32 -> [[ARGA]] : memref<10xf32>, @privatization_memref_10_10_f32 -> [[ARGC]] : memref<10x10xf32>) {
// CHECK-NEXT: }
// CHECK: acc.serial {
// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
More information about the Mlir-commits
mailing list