Skip to content

Commit 3856bb6

Browse files
authored
[flang] [acc] Adding allocation to the recipe of scalar allocatables (#154643)
Currently the privatization recipe of a scalar allocatable is as follow: ``` acc.private.recipe @privatization_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> init { ^bb0(%arg0: !fir.ref<!fir.box<!fir.heap<i32>>>): %0 = fir.alloca !fir.box<!fir.heap<i32>> %1:2 = hlfir.declare %0 {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>>>) acc.yield %1#0 : !fir.ref<!fir.box<!fir.heap<i32>>> } ``` This change adds the allocation for the scalar.
1 parent 62b29d9 commit 3856bb6

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

flang/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,11 @@ mlir::Value OpenACCMappableModel<Ty>::generatePrivateInit(
614614
mlir::Type innerTy = fir::unwrapRefType(boxTy.getEleTy());
615615
if (fir::isa_trivial(innerTy)) {
616616
retVal = getDeclareOpForType(unwrappedTy).getBase();
617+
mlir::Value allocatedScalar =
618+
fir::AllocMemOp::create(builder, loc, innerTy);
619+
mlir::Value firClass =
620+
fir::EmboxOp::create(builder, loc, boxTy, allocatedScalar);
621+
fir::StoreOp::create(builder, loc, firClass, retVal);
617622
} else if (mlir::isa<fir::SequenceType>(innerTy)) {
618623
hlfir::Entity source = hlfir::Entity{var};
619624
auto [temp, cleanup] = hlfir::createTempFromMold(loc, firBuilder, source);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@
9595
! CHECK: ^bb0(%arg0: !fir.ref<!fir.box<!fir.heap<i32>>>):
9696
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.box<!fir.heap<i32>>
9797
! 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>>>)
98+
! CHECK: %[[ALLOCMEM:.*]] = fir.allocmem i32
99+
! CHECK: %[[BOX:.*]] = fir.embox %[[ALLOCMEM]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
100+
! CHECK: fir.store %[[BOX]] to %[[DECLARE]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
98101
! CHECK: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
99102
! CHECK: }
100103

0 commit comments

Comments
 (0)