Skip to content

Commit d2fddae

Browse files
committed
[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
1 parent 580c31f commit d2fddae

File tree

6 files changed

+39
-22
lines changed

6 files changed

+39
-22
lines changed

flang/lib/Lower/OpenACC.cpp

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -684,14 +684,15 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
684684
Fortran::semantics::SemanticsContext &semanticsContext,
685685
Fortran::lower::StatementContext &stmtCtx,
686686
const Fortran::parser::AccClauseList &accClauseList) {
687-
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
687+
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
688688

689689
mlir::Value workerNum;
690690
mlir::Value vectorNum;
691691
mlir::Value gangNum;
692692
mlir::Value gangStatic;
693693
llvm::SmallVector<mlir::Value, 2> tileOperands, privateOperands,
694694
reductionOperands;
695+
llvm::SmallVector<mlir::Attribute> privatizations;
695696
bool hasGang = false, hasVector = false, hasWorker = false;
696697

697698
for (const Fortran::parser::AccClause &clause : accClauseList.v) {
@@ -716,8 +717,8 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
716717
} else {
717718
// * was passed as value and will be represented as a special
718719
// constant.
719-
gangStatic = firOpBuilder.createIntegerConstant(
720-
clauseLocation, firOpBuilder.getIndexType(), starCst);
720+
gangStatic = builder.createIntegerConstant(
721+
clauseLocation, builder.getIndexType(), starCst);
721722
}
722723
}
723724
}
@@ -749,17 +750,17 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
749750
} else {
750751
// * was passed as value and will be represented as a -1 constant
751752
// integer.
752-
mlir::Value tileStar = firOpBuilder.createIntegerConstant(
753-
clauseLocation, firOpBuilder.getIntegerType(32),
753+
mlir::Value tileStar = builder.createIntegerConstant(
754+
clauseLocation, builder.getIntegerType(32),
754755
/* STAR */ -1);
755756
tileOperands.push_back(tileStar);
756757
}
757758
}
758759
} else if (const auto *privateClause =
759760
std::get_if<Fortran::parser::AccClause::Private>(
760761
&clause.u)) {
761-
genObjectList(privateClause->v, converter, semanticsContext, stmtCtx,
762-
privateOperands);
762+
genPrivatizations(privateClause->v, converter, semanticsContext, stmtCtx,
763+
privateOperands, privatizations);
763764
} else if (std::get_if<Fortran::parser::AccClause::Reduction>(&clause.u)) {
764765
// Reduction clause is left out for the moment as the clause will probably
765766
// end up having its own operation.
@@ -779,14 +780,18 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
779780
addOperands(operands, operandSegments, reductionOperands);
780781

781782
auto loopOp = createRegionOp<mlir::acc::LoopOp, mlir::acc::YieldOp>(
782-
firOpBuilder, currentLocation, operands, operandSegments);
783+
builder, currentLocation, operands, operandSegments);
783784

784785
if (hasGang)
785-
loopOp.setHasGangAttr(firOpBuilder.getUnitAttr());
786+
loopOp.setHasGangAttr(builder.getUnitAttr());
786787
if (hasWorker)
787-
loopOp.setHasWorkerAttr(firOpBuilder.getUnitAttr());
788+
loopOp.setHasWorkerAttr(builder.getUnitAttr());
788789
if (hasVector)
789-
loopOp.setHasVectorAttr(firOpBuilder.getUnitAttr());
790+
loopOp.setHasVectorAttr(builder.getUnitAttr());
791+
792+
if (!privatizations.empty())
793+
loopOp.setPrivatizationsAttr(
794+
mlir::ArrayAttr::get(builder.getContext(), privatizations));
790795

791796
// Lower clauses mapped to attributes
792797
for (const Fortran::parser::AccClause &clause : accClauseList.v) {
@@ -796,16 +801,16 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
796801
const std::optional<int64_t> collapseValue =
797802
Fortran::evaluate::ToInt64(*expr);
798803
if (collapseValue) {
799-
loopOp.setCollapseAttr(firOpBuilder.getI64IntegerAttr(*collapseValue));
804+
loopOp.setCollapseAttr(builder.getI64IntegerAttr(*collapseValue));
800805
}
801806
} else if (std::get_if<Fortran::parser::AccClause::Seq>(&clause.u)) {
802-
loopOp.setSeqAttr(firOpBuilder.getUnitAttr());
807+
loopOp.setSeqAttr(builder.getUnitAttr());
803808
} else if (std::get_if<Fortran::parser::AccClause::Independent>(
804809
&clause.u)) {
805-
loopOp.setIndependentAttr(firOpBuilder.getUnitAttr());
810+
loopOp.setIndependentAttr(builder.getUnitAttr());
806811
} else if (std::get_if<Fortran::parser::AccClause::Auto>(&clause.u)) {
807812
loopOp->setAttr(mlir::acc::LoopOp::getAutoAttrStrName(),
808-
firOpBuilder.getUnitAttr());
813+
builder.getUnitAttr());
809814
}
810815
}
811816
return loopOp;

flang/test/Lower/OpenACC/acc-loop.f90

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s
44

5+
! CHECK-LABEL: acc.private.recipe @privatization_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
6+
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):
7+
! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10x10xf32>>
8+
! CHECK: }
9+
510
program acc_loop
611

712
integer :: i, j
@@ -154,7 +159,7 @@ program acc_loop
154159
a(i) = b(i)
155160
END DO
156161

157-
!CHECK: acc.loop private(%{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
162+
!CHECK: acc.loop private(@privatization_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
158163
!CHECK: fir.do_loop
159164
!CHECK: acc.yield
160165
!CHECK-NEXT: }{{$}}
@@ -164,7 +169,7 @@ program acc_loop
164169
a(i) = b(i)
165170
END DO
166171

167-
!CHECK: acc.loop private(%{{.*}}, %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
172+
!CHECK: acc.loop private(@privatization_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, @privatization_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
168173
!CHECK: fir.do_loop
169174
!CHECK: acc.yield
170175
!CHECK-NEXT: }{{$}}
@@ -174,7 +179,7 @@ program acc_loop
174179
a(i) = b(i)
175180
END DO
176181

177-
!CHECK: acc.loop private(%{{.*}}, %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
182+
!CHECK: acc.loop private(@privatization_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, @privatization_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
178183
!CHECK: fir.do_loop
179184
!CHECK: acc.yield
180185
!CHECK-NEXT: }{{$}}

flang/test/Lower/OpenACC/acc-parallel-loop.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ subroutine acc_parallel_loop
455455
END DO
456456

457457
! CHECK: acc.parallel firstprivate(%[[B]] : !fir.ref<!fir.array<10xf32>>) private(@privatization_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
458-
! CHECK: acc.loop private(%[[A]] : !fir.ref<!fir.array<10xf32>>) {
458+
! CHECK: acc.loop private(@privatization_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
459459
! CHECK: fir.do_loop
460460
! CHECK: acc.yield
461461
! CHECK-NEXT: }{{$}}

flang/test/Lower/OpenACC/acc-serial-loop.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ subroutine acc_serial_loop
371371
END DO
372372

373373
! CHECK: acc.serial firstprivate(%[[B]] : !fir.ref<!fir.array<10xf32>>) private(@privatization_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
374-
! CHECK: acc.loop private(%[[A]] : !fir.ref<!fir.array<10xf32>>) {
374+
! CHECK: acc.loop private(@privatization_10xf32 -> %[[A]] : !fir.ref<!fir.array<10xf32>>) {
375375
! CHECK: fir.do_loop
376376
! CHECK: acc.yield
377377
! CHECK-NEXT: }{{$}}

mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,7 +1039,8 @@ def OpenACC_LoopOp : OpenACC_Op<"loop",
10391039
UnitAttr:$hasWorker,
10401040
UnitAttr:$hasVector,
10411041
Variadic<IntOrIndex>:$tileOperands,
1042-
Variadic<AnyType>:$privateOperands,
1042+
Variadic<OpenACC_PointerLikeTypeInterface>:$privateOperands,
1043+
OptionalAttr<SymbolRefArrayAttr>:$privatizations,
10431044
OptionalAttr<OpenACC_ReductionOperatorAttr>:$reductionOp,
10441045
Variadic<AnyType>:$reductionOperands);
10451046

@@ -1059,7 +1060,9 @@ def OpenACC_LoopOp : OpenACC_Op<"loop",
10591060
`gang` `` custom<GangClause>($gangNum, type($gangNum), $gangStatic, type($gangStatic), $hasGang)
10601061
| `worker` `` custom<WorkerClause>($workerNum, type($workerNum), $hasWorker)
10611062
| `vector` `` custom<VectorClause>($vectorLength, type($vectorLength), $hasVector)
1062-
| `private` `(` $privateOperands `:` type($privateOperands) `)`
1063+
| `private` `(` custom<PrivatizationList>(
1064+
$privateOperands, type($privateOperands), $privatizations)
1065+
`)`
10631066
| `tile` `(` $tileOperands `:` type($tileOperands) `)`
10641067
| `reduction` `(` $reductionOperands `:` type($reductionOperands) `)`
10651068
)

mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,10 @@ LogicalResult acc::LoopOp::verify() {
726726
if (getSeq() && (getHasGang() || getHasWorker() || getHasVector()))
727727
return emitError("gang, worker or vector cannot appear with the seq attr");
728728

729+
if (failed(checkPrivatizationList(*this, getPrivatizations(),
730+
getPrivateOperands())))
731+
return failure();
732+
729733
// Check non-empty body().
730734
if (getRegion().empty())
731735
return emitError("expected non-empty body.");

0 commit comments

Comments
 (0)