Skip to content

Commit b581bd3

Browse files
authored
[flang][OpenACC] use correct type when create private box init recipe (#135698)
The recipe for initializing private box types was incorrect because hlfir::createTempFromMold() is not a suitable utility function when the box element type is a trivial type.
1 parent 9a1ece2 commit b581bd3

File tree

2 files changed

+46
-8
lines changed

2 files changed

+46
-8
lines changed

flang/lib/Lower/OpenACC.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -522,13 +522,17 @@ static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
522522
mlir::Type ty, mlir::Location loc) {
523523
mlir::Value retVal = recipe.getInitRegion().front().getArgument(0);
524524
ty = fir::unwrapRefType(ty);
525-
if (fir::isa_trivial(ty)) {
525+
526+
auto getDeclareOpForType = [&](mlir::Type ty) -> hlfir::DeclareOp {
526527
auto alloca = builder.create<fir::AllocaOp>(loc, ty);
527-
auto declareOp = builder.create<hlfir::DeclareOp>(
528+
return builder.create<hlfir::DeclareOp>(
528529
loc, alloca, accPrivateInitName, /*shape=*/nullptr,
529530
llvm::ArrayRef<mlir::Value>{}, /*dummy_scope=*/nullptr,
530531
fir::FortranVariableFlagsAttr{});
531-
retVal = declareOp.getBase();
532+
};
533+
534+
if (fir::isa_trivial(ty)) {
535+
retVal = getDeclareOpForType(ty).getBase();
532536
} else if (auto seqTy = mlir::dyn_cast_or_null<fir::SequenceType>(ty)) {
533537
if (fir::isa_trivial(seqTy.getEleTy())) {
534538
mlir::Value shape;
@@ -552,12 +556,16 @@ static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
552556
}
553557
} else if (auto boxTy = mlir::dyn_cast_or_null<fir::BaseBoxType>(ty)) {
554558
mlir::Type innerTy = fir::unwrapRefType(boxTy.getEleTy());
555-
if (!fir::isa_trivial(innerTy) && !mlir::isa<fir::SequenceType>(innerTy))
559+
if (fir::isa_trivial(innerTy)) {
560+
retVal = getDeclareOpForType(ty).getBase();
561+
} else if (mlir::isa<fir::SequenceType>(innerTy)) {
562+
fir::FirOpBuilder firBuilder{builder, recipe.getOperation()};
563+
hlfir::Entity source = hlfir::Entity{retVal};
564+
auto [temp, cleanup] = hlfir::createTempFromMold(loc, firBuilder, source);
565+
retVal = temp;
566+
} else {
556567
TODO(loc, "Unsupported boxed type in OpenACC privatization");
557-
fir::FirOpBuilder firBuilder{builder, recipe.getOperation()};
558-
hlfir::Entity source = hlfir::Entity{retVal};
559-
auto [temp, cleanup] = hlfir::createTempFromMold(loc, firBuilder, source);
560-
retVal = temp;
568+
}
561569
}
562570
builder.create<mlir::acc::YieldOp>(loc, retVal);
563571
}

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,13 @@
8787
! CHECK: acc.yield %[[DECLARE]]#0 : !fir.box<!fir.array<?xi32>>
8888
! CHECK: }
8989

90+
! CHECK-LABEL: @privatization_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> init {
91+
! CHECK: ^bb0(%arg0: !fir.ref<!fir.box<!fir.heap<i32>>>):
92+
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.box<!fir.heap<i32>>
93+
! CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]] {uniq_name = "acc.private.init"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
94+
! CHECK: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
95+
! CHECK: }
96+
9097
! CHECK-LABEL: acc.private.recipe @privatization_ref_box_heap_Uxi32 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> init {
9198
! CHECK: ^bb0(%[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>):
9299
! CHECK: %[[LOADBOX:.*]] = fir.load %[[ARG0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
@@ -292,6 +299,29 @@ subroutine acc_private_allocatable_array(a, n)
292299
! CHECK: acc.loop {{.*}} private({{.*}}@privatization_ref_box_heap_Uxi32 -> %[[PRIVATE]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
293300
! CHECK: acc.serial private(@privatization_ref_box_heap_Uxi32 -> %{{.*}} : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
294301

302+
subroutine acc_private_allocatable_scalar(b, a, n)
303+
integer :: a(n)
304+
integer, allocatable :: b
305+
integer :: i, n
306+
307+
!$acc parallel loop private(b)
308+
do i = 1, n
309+
a(i) = b
310+
end do
311+
312+
!$acc serial private(b)
313+
a(i) = b
314+
!$acc end serial
315+
end subroutine
316+
317+
! CHECK-LABEL: func.func @_QPacc_private_allocatable_scalar(
318+
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<i32>>> {fir.bindc_name = "b"}
319+
! CHECK: %[[DECLA_B:.*]]:2 = hlfir.declare %arg0 dummy_scope %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFacc_private_allocatable_scalarEb"} : (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.dscope) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
320+
! CHECK: acc.parallel {{.*}} {
321+
! CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[DECLA_B]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>) -> !fir.ref<!fir.box<!fir.heap<i32>>> {name = "b"}
322+
! CHECK: acc.loop {{.*}} private({{.*}}@privatization_ref_box_heap_i32 -> %[[PRIVATE]] : !fir.ref<!fir.box<!fir.heap<i32>>>)
323+
! CHECK: acc.serial private(@privatization_ref_box_heap_i32 -> %{{.*}} : !fir.ref<!fir.box<!fir.heap<i32>>>) {
324+
295325
subroutine acc_private_pointer_array(a, n)
296326
integer, pointer :: a(:)
297327
integer :: i, n

0 commit comments

Comments
 (0)