[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.
GitOrigin-RevId: 3856bb6bbf40a019c2f5a62e4a518ffa773efd7e
diff --git a/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp b/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
index e5fd19d..8fefda5 100644
--- a/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
+++ b/lib/Optimizer/OpenACC/Support/FIROpenACCTypeInterfaces.cpp
@@ -614,6 +614,11 @@
mlir::Type innerTy = fir::unwrapRefType(boxTy.getEleTy());
if (fir::isa_trivial(innerTy)) {
retVal = getDeclareOpForType(unwrappedTy).getBase();
+ mlir::Value allocatedScalar =
+ fir::AllocMemOp::create(builder, loc, innerTy);
+ mlir::Value firClass =
+ fir::EmboxOp::create(builder, loc, boxTy, allocatedScalar);
+ fir::StoreOp::create(builder, loc, firClass, retVal);
} else if (mlir::isa<fir::SequenceType>(innerTy)) {
hlfir::Entity source = hlfir::Entity{var};
auto [temp, cleanup] = hlfir::createTempFromMold(loc, firBuilder, source);
diff --git a/test/Lower/OpenACC/acc-private.f90 b/test/Lower/OpenACC/acc-private.f90
index b1bfb02..5ca08a3 100644
--- a/test/Lower/OpenACC/acc-private.f90
+++ b/test/Lower/OpenACC/acc-private.f90
@@ -95,6 +95,9 @@
! CHECK: ^bb0(%arg0: !fir.ref<!fir.box<!fir.heap<i32>>>):
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.box<!fir.heap<i32>>
! 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>>>)
+! CHECK: %[[ALLOCMEM:.*]] = fir.allocmem i32
+! CHECK: %[[BOX:.*]] = fir.embox %[[ALLOCMEM]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
+! CHECK: fir.store %[[BOX]] to %[[DECLARE]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
! CHECK: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
! CHECK: }