[flang-commits] [flang] d2fddae - [mlir][flang][openacc] Use new private representation for acc.loop
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Mon May 22 09:52:53 PDT 2023
Author: Valentin Clement
Date: 2023-05-22T09:52:43-07:00
New Revision: d2fddaef5333144d02b2f21a7d27771ecdb420b6
URL: https://github.com/llvm/llvm-project/commit/d2fddaef5333144d02b2f21a7d27771ecdb420b6
DIFF: https://github.com/llvm/llvm-project/commit/d2fddaef5333144d02b2f21a7d27771ecdb420b6.diff
LOG: [mlir][flang][openacc] Use new private representation for acc.loop
Update acc.loop private operands list to use the new design
introduced in D150622.
Depends on D150975
Reviewed By: razvanlupusoru
Differential Revision: https://reviews.llvm.org/D150984
Added:
Modified:
flang/lib/Lower/OpenACC.cpp
flang/test/Lower/OpenACC/acc-loop.f90
flang/test/Lower/OpenACC/acc-parallel-loop.f90
flang/test/Lower/OpenACC/acc-serial-loop.f90
mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
Removed:
################################################################################
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index 8c98fe70446c5..2f74f083159c2 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -684,7 +684,7 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
Fortran::semantics::SemanticsContext &semanticsContext,
Fortran::lower::StatementContext &stmtCtx,
const Fortran::parser::AccClauseList &accClauseList) {
- fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
+ fir::FirOpBuilder &builder = converter.getFirOpBuilder();
mlir::Value workerNum;
mlir::Value vectorNum;
@@ -692,6 +692,7 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
mlir::Value gangStatic;
llvm::SmallVector<mlir::Value, 2> tileOperands, privateOperands,
reductionOperands;
+ llvm::SmallVector<mlir::Attribute> privatizations;
bool hasGang = false, hasVector = false, hasWorker = false;
for (const Fortran::parser::AccClause &clause : accClauseList.v) {
@@ -716,8 +717,8 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
} else {
// * was passed as value and will be represented as a special
// constant.
- gangStatic = firOpBuilder.createIntegerConstant(
- clauseLocation, firOpBuilder.getIndexType(), starCst);
+ gangStatic = builder.createIntegerConstant(
+ clauseLocation, builder.getIndexType(), starCst);
}
}
}
@@ -749,8 +750,8 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
} else {
// * was passed as value and will be represented as a -1 constant
// integer.
- mlir::Value tileStar = firOpBuilder.createIntegerConstant(
- clauseLocation, firOpBuilder.getIntegerType(32),
+ mlir::Value tileStar = builder.createIntegerConstant(
+ clauseLocation, builder.getIntegerType(32),
/* STAR */ -1);
tileOperands.push_back(tileStar);
}
@@ -758,8 +759,8 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
} else if (const auto *privateClause =
std::get_if<Fortran::parser::AccClause::Private>(
&clause.u)) {
- genObjectList(privateClause->v, converter, semanticsContext, stmtCtx,
- privateOperands);
+ genPrivatizations(privateClause->v, converter, semanticsContext, stmtCtx,
+ privateOperands, privatizations);
} else if (std::get_if<Fortran::parser::AccClause::Reduction>(&clause.u)) {
// Reduction clause is left out for the moment as the clause will probably
// end up having its own operation.
@@ -779,14 +780,18 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
addOperands(operands, operandSegments, reductionOperands);
auto loopOp = createRegionOp<mlir::acc::LoopOp, mlir::acc::YieldOp>(
- firOpBuilder, currentLocation, operands, operandSegments);
+ builder, currentLocation, operands, operandSegments);
if (hasGang)
- loopOp.setHasGangAttr(firOpBuilder.getUnitAttr());
+ loopOp.setHasGangAttr(builder.getUnitAttr());
if (hasWorker)
- loopOp.setHasWorkerAttr(firOpBuilder.getUnitAttr());
+ loopOp.setHasWorkerAttr(builder.getUnitAttr());
if (hasVector)
- loopOp.setHasVectorAttr(firOpBuilder.getUnitAttr());
+ loopOp.setHasVectorAttr(builder.getUnitAttr());
+
+ if (!privatizations.empty())
+ loopOp.setPrivatizationsAttr(
+ mlir::ArrayAttr::get(builder.getContext(), privatizations));
// Lower clauses mapped to attributes
for (const Fortran::parser::AccClause &clause : accClauseList.v) {
@@ -796,16 +801,16 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
const std::optional<int64_t> collapseValue =
Fortran::evaluate::ToInt64(*expr);
if (collapseValue) {
- loopOp.setCollapseAttr(firOpBuilder.getI64IntegerAttr(*collapseValue));
+ loopOp.setCollapseAttr(builder.getI64IntegerAttr(*collapseValue));
}
} else if (std::get_if<Fortran::parser::AccClause::Seq>(&clause.u)) {
- loopOp.setSeqAttr(firOpBuilder.getUnitAttr());
+ loopOp.setSeqAttr(builder.getUnitAttr());
} else if (std::get_if<Fortran::parser::AccClause::Independent>(
&clause.u)) {
- loopOp.setIndependentAttr(firOpBuilder.getUnitAttr());
+ loopOp.setIndependentAttr(builder.getUnitAttr());
} else if (std::get_if<Fortran::parser::AccClause::Auto>(&clause.u)) {
loopOp->setAttr(mlir::acc::LoopOp::getAutoAttrStrName(),
- firOpBuilder.getUnitAttr());
+ builder.getUnitAttr());
}
}
return loopOp;
diff --git a/flang/test/Lower/OpenACC/acc-loop.f90 b/flang/test/Lower/OpenACC/acc-loop.f90
index 00b295a0899dd..30684f36a3f13 100644
--- a/flang/test/Lower/OpenACC/acc-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-loop.f90
@@ -2,6 +2,11 @@
! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s
+! CHECK-LABEL: acc.private.recipe @privatization_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
+! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):
+! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10x10xf32>>
+! CHECK: }
+
program acc_loop
integer :: i, j
@@ -154,7 +159,7 @@ program acc_loop
a(i) = b(i)
END DO
-!CHECK: acc.loop private(%{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
+!CHECK: acc.loop private(@privatization_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
!CHECK: fir.do_loop
!CHECK: acc.yield
!CHECK-NEXT: }{{$}}
@@ -164,7 +169,7 @@ program acc_loop
a(i) = b(i)
END DO
-!CHECK: acc.loop private(%{{.*}}, %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
+!CHECK: acc.loop private(@privatization_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, @privatization_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
!CHECK: fir.do_loop
!CHECK: acc.yield
!CHECK-NEXT: }{{$}}
@@ -174,7 +179,7 @@ program acc_loop
a(i) = b(i)
END DO
-!CHECK: acc.loop private(%{{.*}}, %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
+!CHECK: acc.loop private(@privatization_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, @privatization_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
!CHECK: fir.do_loop
!CHECK: acc.yield
!CHECK-NEXT: }{{$}}
diff --git a/flang/test/Lower/OpenACC/acc-parallel-loop.f90 b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
index 353081465e8e1..94fe5a89c9b3c 100644
--- a/flang/test/Lower/OpenACC/acc-parallel-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
@@ -455,7 +455,7 @@ subroutine acc_parallel_loop
END DO
! CHECK: acc.parallel firstprivate(%[[B]] : !fir.ref<!fir.array<10xf32>>) private(@privatization_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
-! CHECK: acc.loop private(%[[A]] : !fir.ref<!fir.array<10xf32>>) {
+! CHECK: acc.loop private(@privatization_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
! CHECK: fir.do_loop
! 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 44c5f1cb71bb1..16d94f766d402 100644
--- a/flang/test/Lower/OpenACC/acc-serial-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-serial-loop.f90
@@ -371,7 +371,7 @@ subroutine acc_serial_loop
END DO
! CHECK: acc.serial firstprivate(%[[B]] : !fir.ref<!fir.array<10xf32>>) private(@privatization_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
-! CHECK: acc.loop private(%[[A]] : !fir.ref<!fir.array<10xf32>>) {
+! CHECK: acc.loop private(@privatization_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
! CHECK: fir.do_loop
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
index 6d1ea0fc43cc7..315b945ce5fde 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
@@ -1039,7 +1039,8 @@ def OpenACC_LoopOp : OpenACC_Op<"loop",
UnitAttr:$hasWorker,
UnitAttr:$hasVector,
Variadic<IntOrIndex>:$tileOperands,
- Variadic<AnyType>:$privateOperands,
+ Variadic<OpenACC_PointerLikeTypeInterface>:$privateOperands,
+ OptionalAttr<SymbolRefArrayAttr>:$privatizations,
OptionalAttr<OpenACC_ReductionOperatorAttr>:$reductionOp,
Variadic<AnyType>:$reductionOperands);
@@ -1059,7 +1060,9 @@ def OpenACC_LoopOp : OpenACC_Op<"loop",
`gang` `` custom<GangClause>($gangNum, type($gangNum), $gangStatic, type($gangStatic), $hasGang)
| `worker` `` custom<WorkerClause>($workerNum, type($workerNum), $hasWorker)
| `vector` `` custom<VectorClause>($vectorLength, type($vectorLength), $hasVector)
- | `private` `(` $privateOperands `:` type($privateOperands) `)`
+ | `private` `(` custom<PrivatizationList>(
+ $privateOperands, type($privateOperands), $privatizations)
+ `)`
| `tile` `(` $tileOperands `:` type($tileOperands) `)`
| `reduction` `(` $reductionOperands `:` type($reductionOperands) `)`
)
diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
index 89f97e08d3ba4..992317628d87f 100644
--- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
+++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
@@ -726,6 +726,10 @@ LogicalResult acc::LoopOp::verify() {
if (getSeq() && (getHasGang() || getHasWorker() || getHasVector()))
return emitError("gang, worker or vector cannot appear with the seq attr");
+ if (failed(checkPrivatizationList(*this, getPrivatizations(),
+ getPrivateOperands())))
+ return failure();
+
// Check non-empty body().
if (getRegion().empty())
return emitError("expected non-empty body.");
More information about the flang-commits
mailing list