Skip to content

Commit 4da01a6

Browse files
authored
[flang][openacc][hlfir] Add declare op in private recipe (#67368)
Following #66099, the generation of private (and firstprivate) recipe needs to add a declare op. This patch adds the declare op for the case currently supported. This will fix issue #66105.
1 parent af8dc86 commit 4da01a6

File tree

6 files changed

+64
-24
lines changed

6 files changed

+64
-24
lines changed

flang/lib/Lower/OpenACC.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ static constexpr std::int64_t starCst = -1;
3434

3535
static unsigned routineCounter = 0;
3636
static constexpr llvm::StringRef accRoutinePrefix = "acc_routine_";
37+
static constexpr llvm::StringRef accPrivateInitName = "acc.private.init";
3738

3839
static mlir::Location
3940
genOperandLocation(Fortran::lower::AbstractConverter &converter,
@@ -348,14 +349,29 @@ static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
348349
mlir::Type ty, mlir::Location loc) {
349350
mlir::Value retVal = recipe.getInitRegion().front().getArgument(0);
350351
if (auto refTy = mlir::dyn_cast_or_null<fir::ReferenceType>(ty)) {
351-
if (fir::isa_trivial(refTy.getEleTy()))
352-
retVal = builder.create<fir::AllocaOp>(loc, refTy.getEleTy());
353-
else if (auto seqTy =
354-
mlir::dyn_cast_or_null<fir::SequenceType>(refTy.getEleTy())) {
352+
if (fir::isa_trivial(refTy.getEleTy())) {
353+
auto alloca = builder.create<fir::AllocaOp>(loc, refTy.getEleTy());
354+
auto declareOp = builder.create<hlfir::DeclareOp>(
355+
loc, alloca, accPrivateInitName, /*shape=*/nullptr,
356+
llvm::ArrayRef<mlir::Value>{}, fir::FortranVariableFlagsAttr{});
357+
retVal = declareOp.getBase();
358+
} else if (auto seqTy = mlir::dyn_cast_or_null<fir::SequenceType>(
359+
refTy.getEleTy())) {
355360
if (seqTy.hasDynamicExtents())
356361
TODO(loc, "private recipe of array with dynamic extents");
357-
if (fir::isa_trivial(seqTy.getEleTy()))
358-
retVal = builder.create<fir::AllocaOp>(loc, seqTy);
362+
if (fir::isa_trivial(seqTy.getEleTy())) {
363+
auto alloca = builder.create<fir::AllocaOp>(loc, seqTy);
364+
llvm::SmallVector<mlir::Value> extents;
365+
mlir::Type idxTy = builder.getIndexType();
366+
for (auto extent : seqTy.getShape())
367+
extents.push_back(builder.create<mlir::arith::ConstantOp>(
368+
loc, idxTy, builder.getIntegerAttr(idxTy, extent)));
369+
auto shapeOp = builder.create<fir::ShapeOp>(loc, extents);
370+
auto declareOp = builder.create<hlfir::DeclareOp>(
371+
loc, alloca, accPrivateInitName, shapeOp,
372+
llvm::ArrayRef<mlir::Value>{}, fir::FortranVariableFlagsAttr{});
373+
retVal = declareOp.getBase();
374+
}
359375
}
360376
}
361377
builder.create<mlir::acc::YieldOp>(loc, retVal);

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_10xf32 : !fir.ref<!fir.array<10xf32>> init {
77
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10xf32>>):
88
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<10xf32>
9-
! CHECK: acc.yield %[[ALLOCA]] : !fir.ref<!fir.array<10xf32>>
9+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>
10+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
11+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10xf32>>
1012
! CHECK: } copy {
1113
! CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<!fir.array<10xf32>>, %[[DST:.*]]: !fir.ref<!fir.array<10xf32>>):
1214
! CHECK: %[[LB0:.*]] = arith.constant 0 : index
@@ -23,7 +25,9 @@
2325

2426
! CHECK-LABEL: acc.private.recipe @privatization_ref_10xf32 : !fir.ref<!fir.array<10xf32>> init {
2527
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10xf32>>):
26-
! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10xf32>>
28+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>
29+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
30+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10xf32>>
2731
! CHECK: }
2832

2933
! CHECK-LABEL: func.func @_QPacc_parallel_loop()

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@
66
! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
77
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):
88
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<10x10xf32>
9-
! CHECK: acc.yield %[[ALLOCA]] : !fir.ref<!fir.array<10x10xf32>>
9+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
10+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10x10xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>)
11+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10x10xf32>>
1012
! CHECK: } copy {
1113
! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10x10xf32>>, %arg1: !fir.ref<!fir.array<10x10xf32>>):
1214
! CHECK: acc.terminator
1315
! CHECK: }
1416

1517
! CHECK-LABEL: acc.private.recipe @privatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
1618
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):
17-
! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10x10xf32>>
19+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
20+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10x10xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>)
21+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10x10xf32>>
1822
! CHECK: }
1923

2024
! CHECK-LABEL: func.func @_QPacc_parallel()

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

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_50xf32 : !fir.ref<!fir.array<50xf32>> init {
77
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<50xf32>>):
88
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<50xf32>
9-
! FIXME: we need hlfir.declare here to satisfy the assumptions about
10-
! the HLFIR lowering, i.e. that every varible has fir/hlfir.declare.
11-
! CHECK: acc.yield %[[ALLOCA]] : !fir.ref<!fir.array<50xf32>>
9+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>
10+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<50xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<50xf32>>, !fir.ref<!fir.array<50xf32>>)
11+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<50xf32>>
1212
! CHECK: } copy {
1313
! CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<!fir.array<50xf32>>, %[[DST:.*]]: !fir.ref<!fir.array<50xf32>>):
1414
! CHECK: %[[LB0:.*]] = arith.constant 0 : index
@@ -26,7 +26,9 @@
2626
! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_100xf32 : !fir.ref<!fir.array<100xf32>> init {
2727
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<100xf32>>):
2828
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<100xf32>
29-
! CHECK: acc.yield %[[ALLOCA]] : !fir.ref<!fir.array<100xf32>>
29+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>
30+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>)
31+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<100xf32>>
3032
! CHECK: } copy {
3133
! CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<!fir.array<100xf32>>, %[[DST:.*]]: !fir.ref<!fir.array<100xf32>>):
3234
! CHECK: %[[LB0:.*]] = arith.constant 0 : index
@@ -43,8 +45,9 @@
4345

4446
! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_i32 : !fir.ref<i32> init {
4547
! CHECK: ^bb0(%{{.*}}: !fir.ref<i32>):
46-
! CHECK: %[[ALLOCA:.*]] = fir.alloca i32
47-
! CHECK: acc.yield %[[ALLOCA]] : !fir.ref<i32>
48+
! CHECK: %[[ALLOCA:.*]] = fir.alloca i32
49+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]] {uniq_name = "acc.private.init"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
50+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<i32>
4851
! CHECK: } copy {
4952
! CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<i32>, %[[DST:.*]]: !fir.ref<i32>):
5053
! CHECK: %[[VALUE:.*]] = fir.load %[[SRC]] : !fir.ref<i32>
@@ -54,20 +57,25 @@
5457

5558
! CHECK-LABEL: acc.private.recipe @privatization_ref_50xf32 : !fir.ref<!fir.array<50xf32>> init {
5659
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<50xf32>>):
57-
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<50xf32>
58-
! CHECK: acc.yield %[[ALLOCA]] : !fir.ref<!fir.array<50xf32>>
60+
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<50xf32>
61+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>
62+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<50xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<50xf32>>, !fir.ref<!fir.array<50xf32>>)
63+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<50xf32>>
5964
! CHECK: }
6065

6166
! CHECK-LABEL: acc.private.recipe @privatization_ref_100xf32 : !fir.ref<!fir.array<100xf32>> init {
6267
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<100xf32>>):
6368
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<100xf32>
64-
! CHECK: acc.yield %[[ALLOCA]] : !fir.ref<!fir.array<100xf32>>
69+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>
70+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>)
71+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<100xf32>>
6572
! CHECK: }
6673

6774
! CHECK-LABEL: acc.private.recipe @privatization_ref_i32 : !fir.ref<i32> init {
6875
! CHECK: ^bb0(%{{.*}}: !fir.ref<i32>):
6976
! CHECK: %[[ALLOCA:.*]] = fir.alloca i32
70-
! CHECK: acc.yield %[[ALLOCA]] : !fir.ref<i32>
77+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]] {uniq_name = "acc.private.init"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
78+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<i32>
7179
! CHECK: }
7280

7381
program acc_private

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@
66
! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_10xf32 : !fir.ref<!fir.array<10xf32>> init {
77
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10xf32>>):
88
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<10xf32>
9-
! CHECK: acc.yield %[[ALLOCA]] : !fir.ref<!fir.array<10xf32>>
9+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>
10+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
11+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10xf32>>
1012
! CHECK: } copy {
1113
! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10xf32>>, %arg1: !fir.ref<!fir.array<10xf32>>):
1214
! CHECK: acc.terminator
1315
! CHECK: }
1416

1517
! CHECK-LABEL: acc.private.recipe @privatization_ref_10xf32 : !fir.ref<!fir.array<10xf32>> init {
1618
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10xf32>>):
17-
! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10xf32>>
19+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>
20+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
21+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10xf32>>
1822
! CHECK: }
1923

2024
! CHECK-LABEL: func.func @_QPacc_serial_loop()

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@
66
! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
77
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):
88
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<10x10xf32>
9-
! CHECK: acc.yield %[[ALLOCA]] : !fir.ref<!fir.array<10x10xf32>>
9+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
10+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10x10xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>)
11+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10x10xf32>>
1012
! CHECK: } copy {
1113
! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10x10xf32>>, %arg1: !fir.ref<!fir.array<10x10xf32>>):
1214
! CHECK: acc.terminator
1315
! CHECK: }
1416

1517
! CHECK-LABEL: acc.private.recipe @privatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
1618
! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):
17-
! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10x10xf32>>
19+
! HLFIR: %[[SHAPE:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>
20+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10x10xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>)
21+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10x10xf32>>
1822
! CHECK: }
1923

2024
! CHECK-LABEL: func.func @_QPacc_serial()

0 commit comments

Comments
 (0)