Skip to content

Commit e85cdb9

Browse files
authored
[flang][openacc] Support allocatable and pointer array in private recipe (#68422)
Add support for pointer and allocatable arrays in private clause.
1 parent a942f7c commit e85cdb9

File tree

3 files changed

+73
-16
lines changed

3 files changed

+73
-16
lines changed

flang/lib/Lower/OpenACC.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,19 @@ fir::ShapeOp genShapeOp(mlir::OpBuilder &builder, fir::SequenceType seqTy,
356356
return builder.create<fir::ShapeOp>(loc, extents);
357357
}
358358

359+
/// Return the nested sequence type if any.
360+
static mlir::Type extractSequenceType(mlir::Type ty) {
361+
if (mlir::isa<fir::SequenceType>(ty))
362+
return ty;
363+
if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(ty))
364+
return extractSequenceType(boxTy.getEleTy());
365+
if (auto heapTy = mlir::dyn_cast<fir::HeapType>(ty))
366+
return extractSequenceType(heapTy.getEleTy());
367+
if (auto ptrTy = mlir::dyn_cast<fir::PointerType>(ty))
368+
return extractSequenceType(ptrTy.getEleTy());
369+
return mlir::Type{};
370+
}
371+
359372
template <typename RecipeOp>
360373
static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
361374
mlir::Type ty, mlir::Location loc) {
@@ -381,7 +394,8 @@ static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
381394
}
382395
}
383396
} else if (auto boxTy = mlir::dyn_cast_or_null<fir::BaseBoxType>(ty)) {
384-
if (!mlir::isa<fir::SequenceType>(boxTy.getEleTy()))
397+
mlir::Type innerTy = extractSequenceType(boxTy);
398+
if (!innerTy)
385399
TODO(loc, "Unsupported boxed type in OpenACC privatization");
386400
fir::FirOpBuilder firBuilder{builder, recipe.getOperation()};
387401
hlfir::Entity source = hlfir::Entity{retVal};
@@ -751,19 +765,6 @@ static mlir::Value getReductionInitValue(fir::FirOpBuilder &builder,
751765
llvm::report_fatal_error("Unsupported OpenACC reduction type");
752766
}
753767

754-
/// Return the nested sequence type if any.
755-
static mlir::Type extractSequenceType(mlir::Type ty) {
756-
if (mlir::isa<fir::SequenceType>(ty))
757-
return ty;
758-
if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(ty))
759-
return extractSequenceType(boxTy.getEleTy());
760-
if (auto heapTy = mlir::dyn_cast<fir::HeapType>(ty))
761-
return extractSequenceType(heapTy.getEleTy());
762-
if (auto ptrTy = mlir::dyn_cast<fir::PointerType>(ty))
763-
return extractSequenceType(ptrTy.getEleTy());
764-
return mlir::Type{};
765-
}
766-
767768
static mlir::Value genReductionInitRegion(fir::FirOpBuilder &builder,
768769
mlir::Location loc, mlir::Type ty,
769770
mlir::acc::ReductionOperator op) {

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

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,26 @@
33
! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s --check-prefixes=CHECK,FIR
44
! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s --check-prefixes=CHECK,HLFIR
55

6+
! CHECK-LABEL: acc.private.recipe @privatization_box_ptr_Uxi32 : !fir.box<!fir.ptr<!fir.array<?xi32>>> init {
7+
! CHECK: ^bb0(%[[ARG0:.*]]: !fir.box<!fir.ptr<!fir.array<?xi32>>>):
8+
! HLFIR: %[[C0:.*]] = arith.constant 0 : index
9+
! HLFIR: %[[BOX_DIMS:.*]]:3 = fir.box_dims %arg0, %c0 : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)
10+
! HLFIR: %[[SHAPE:.*]] = fir.shape %[[BOX_DIMS]]#1 : (index) -> !fir.shape<1>
11+
! HLFIR: %[[TEMP:.*]] = fir.allocmem !fir.array<?xi32>, %0#1 {bindc_name = ".tmp", uniq_name = ""}
12+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[TEMP]](%[[SHAPE]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> (!fir.box<!fir.array<?xi32>>, !fir.heap<!fir.array<?xi32>>)
13+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.box<!fir.array<?xi32>>
14+
! CHECK: }
15+
16+
! CHECK-LABEL: acc.private.recipe @privatization_box_heap_Uxi32 : !fir.box<!fir.heap<!fir.array<?xi32>>> init {
17+
! CHECK: ^bb0(%[[ARG0:.*]]: !fir.box<!fir.heap<!fir.array<?xi32>>>):
18+
! HLFIR: %[[C0:.*]] = arith.constant 0 : index
19+
! HLFIR: %[[BOX_DIMS:.*]]:3 = fir.box_dims %[[ARG0]], %[[C0]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)
20+
! HLFIR: %[[SHAPE:.*]] = fir.shape %[[BOX_DIMS]]#1 : (index) -> !fir.shape<1>
21+
! HLFIR: %[[TEMP:.*]] = fir.allocmem !fir.array<?xi32>, %[[BOX_DIMS]]#1 {bindc_name = ".tmp", uniq_name = ""}
22+
! HLFIR: %[[DECLARE:.*]]:2 = hlfir.declare %[[TEMP]](%[[SHAPE]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> (!fir.box<!fir.array<?xi32>>, !fir.heap<!fir.array<?xi32>>)
23+
! HLFIR: acc.yield %[[DECLARE]]#0 : !fir.box<!fir.array<?xi32>>
24+
! CHECK: }
25+
626
! CHECK-LABEL: acc.private.recipe @privatization_box_Uxi32 : !fir.box<!fir.array<?xi32>> init {
727
! CHECK: ^bb0(%[[ARG0:.*]]: !fir.box<!fir.array<?xi32>>):
828
! HLFIR: %[[C0:.*]] = arith.constant 0 : index
@@ -191,7 +211,43 @@ subroutine acc_private_assumed_shape(a, n)
191211

192212
! CHECK-LABEL: func.func @_QPacc_private_assumed_shape(
193213
! CHECK-SAME: %[[ARG0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"}
194-
! HLFIR: %[[DECL_A:.*]]:2 = hlfir.declare %arg0 {uniq_name = "_QFacc_private_assumed_shapeEa"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
214+
! HLFIR: %[[DECL_A:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_QFacc_private_assumed_shapeEa"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
195215
! HLFIR: %[[ADDR:.*]] = fir.box_addr %[[DECL_A]]#1 : (!fir.box<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>>
196216
! HLFIR: %[[PRIVATE:.*]] = acc.private varPtr(%[[ADDR]] : !fir.ref<!fir.array<?xi32>>) bounds(%{{.*}}) -> !fir.ref<!fir.array<?xi32>> {name = "a"}
197217
! HLFIR: acc.parallel private(@privatization_box_Uxi32 -> %[[PRIVATE]] : !fir.ref<!fir.array<?xi32>>) {
218+
219+
subroutine acc_private_allocatable_array(a, n)
220+
integer, allocatable :: a(:)
221+
integer :: i, n
222+
223+
!$acc parallel loop private(a)
224+
do i = 1, n
225+
a(i) = i
226+
end do
227+
end subroutine
228+
229+
! CHECK-LABEL: func.func @_QPacc_private_allocatable_array(
230+
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> {fir.bindc_name = "a"}
231+
! HLFIR: %[[DECLA_A:.*]]:2 = hlfir.declare %[[ARG0]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFacc_private_allocatable_arrayEa"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
232+
! HLFIR: %[[BOX:.*]] = fir.load %[[DECLA_A]]#1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
233+
! HLFIR: %[[BOX_ADDR:.*]] = fir.box_addr %[[BOX]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
234+
! HLFIR: %[[PRIVATE:.*]] = acc.private varPtr(%[[BOX_ADDR]] : !fir.heap<!fir.array<?xi32>>) bounds(%{{.*}}) -> !fir.heap<!fir.array<?xi32>> {name = "a"}
235+
! HLFIR: acc.parallel private(@privatization_box_heap_Uxi32 -> %[[PRIVATE]] : !fir.heap<!fir.array<?xi32>>) {
236+
237+
subroutine acc_private_pointer_array(a, n)
238+
integer, pointer :: a(:)
239+
integer :: i, n
240+
241+
!$acc parallel loop private(a)
242+
do i = 1, n
243+
a(i) = i
244+
end do
245+
end subroutine
246+
247+
! CHECK-LABEL: func.func @_QPacc_private_pointer_array(
248+
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "a"}, %arg1: !fir.ref<i32> {fir.bindc_name = "n"}) {
249+
! HLFIR: %[[DECL_A:.*]]:2 = hlfir.declare %arg0 {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFacc_private_pointer_arrayEa"} : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>)
250+
! HLFIR: %[[BOX:.*]] = fir.load %[[DECLA_A]]#1 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
251+
! HLFIR: %[[BOX_ADDR:.*]] = fir.box_addr %[[BOX]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.ptr<!fir.array<?xi32>>
252+
! HLFIR: %[[PRIVATE:.*]] = acc.private varPtr(%[[BOX_ADDR]] : !fir.ptr<!fir.array<?xi32>>) bounds(%{{.*}}) -> !fir.ptr<!fir.array<?xi32>> {name = "a"}
253+
! HLFIR: acc.parallel private(@privatization_box_ptr_Uxi32 -> %[[PRIVATE]] : !fir.ptr<!fir.array<?xi32>>)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ static LogicalResult verifyInitLikeSingleArgRegion(
435435
LogicalResult acc::PrivateRecipeOp::verifyRegions() {
436436
if (failed(verifyInitLikeSingleArgRegion(*this, getInitRegion(),
437437
"privatization", "init", getType(),
438-
/*verifyYield=*/true)))
438+
/*verifyYield=*/false)))
439439
return failure();
440440
if (failed(verifyInitLikeSingleArgRegion(
441441
*this, getDestroyRegion(), "privatization", "destroy", getType(),

0 commit comments

Comments
 (0)