[flang-commits] [flang] [flang][openacc] Place post allocate/deallocate attribute correctly (PR #79883)
via flang-commits
flang-commits at lists.llvm.org
Mon Jan 29 11:05:17 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-openacc
Author: Valentin Clement (バレンタイン クレメン) (clementval)
<details>
<summary>Changes</summary>
The `acc.declate_action` attribute was sometime misplaced as reported in #<!-- -->79770.
This patch updates the lowering code to place the postAllocate/postDeallocate actions at the correct place.
---
Full diff: https://github.com/llvm/llvm-project/pull/79883.diff
2 Files Affected:
- (modified) flang/lib/Lower/Allocatable.cpp (+34-26)
- (modified) flang/test/Lower/OpenACC/acc-declare.f90 (+12)
``````````diff
diff --git a/flang/lib/Lower/Allocatable.cpp b/flang/lib/Lower/Allocatable.cpp
index affb483e5b82b43..71b61b9c20f63a3 100644
--- a/flang/lib/Lower/Allocatable.cpp
+++ b/flang/lib/Lower/Allocatable.cpp
@@ -388,7 +388,6 @@ class AllocateStmtHelper {
genSourceMoldAllocation(alloc, boxAddr, /*isSource=*/false);
else
genSimpleAllocation(alloc, boxAddr);
- postAllocationAction(alloc);
}
static bool lowerBoundsAreOnes(const Allocation &alloc) {
@@ -458,6 +457,7 @@ class AllocateStmtHelper {
// Pointers must use PointerAllocate so that their deallocations
// can be validated.
genInlinedAllocation(alloc, box);
+ postAllocationAction(alloc);
return;
}
// Generate a sequence of runtime calls.
@@ -471,6 +471,7 @@ class AllocateStmtHelper {
genAllocateObjectBounds(alloc, box);
mlir::Value stat = genRuntimeAllocate(builder, loc, box, errorManager);
fir::factory::syncMutableBoxFromIRBox(builder, loc, box);
+ postAllocationAction(alloc);
errorManager.assignStat(builder, loc, stat);
}
@@ -601,6 +602,7 @@ class AllocateStmtHelper {
else
stat = genRuntimeAllocate(builder, loc, box, errorManager);
fir::factory::syncMutableBoxFromIRBox(builder, loc, box);
+ postAllocationAction(alloc);
errorManager.assignStat(builder, loc, stat);
}
@@ -739,16 +741,37 @@ void Fortran::lower::genAllocateStmt(
// Deallocate statement implementation
//===----------------------------------------------------------------------===//
+static void preDeallocationAction(Fortran::lower::AbstractConverter &converter,
+ fir::FirOpBuilder &builder,
+ mlir::Value beginOpValue,
+ const Fortran::semantics::Symbol &sym) {
+ if (sym.test(Fortran::semantics::Symbol::Flag::AccDeclare))
+ Fortran::lower::attachDeclarePreDeallocAction(converter, builder,
+ beginOpValue, sym);
+}
+
+static void postDeallocationAction(Fortran::lower::AbstractConverter &converter,
+ fir::FirOpBuilder &builder,
+ const Fortran::semantics::Symbol &sym) {
+ if (sym.test(Fortran::semantics::Symbol::Flag::AccDeclare))
+ Fortran::lower::attachDeclarePostDeallocAction(converter, builder, sym);
+}
+
// Generate deallocation of a pointer/allocatable.
-static mlir::Value genDeallocate(fir::FirOpBuilder &builder, mlir::Location loc,
- const fir::MutableBoxValue &box,
- ErrorManager &errorManager,
- mlir::Value declaredTypeDesc = {}) {
+static mlir::Value
+genDeallocate(fir::FirOpBuilder &builder,
+ Fortran::lower::AbstractConverter &converter, mlir::Location loc,
+ const fir::MutableBoxValue &box, ErrorManager &errorManager,
+ mlir::Value declaredTypeDesc = {},
+ const Fortran::semantics::Symbol *symbol = nullptr) {
// Deallocate intrinsic types inline.
if (!box.isDerived() && !box.isPolymorphic() &&
!box.isUnlimitedPolymorphic() && !errorManager.hasStatSpec() &&
!useAllocateRuntime) {
- return fir::factory::genFreemem(builder, loc, box);
+ mlir::Value ret = fir::factory::genFreemem(builder, loc, box);
+ if (symbol)
+ postDeallocationAction(converter, builder, *symbol);
+ return ret;
}
// Use runtime calls to deallocate descriptor cases. Sync MutableBoxValue
// with its descriptor before and after calls if needed.
@@ -756,6 +779,8 @@ static mlir::Value genDeallocate(fir::FirOpBuilder &builder, mlir::Location loc,
mlir::Value stat =
genRuntimeDeallocate(builder, loc, box, errorManager, declaredTypeDesc);
fir::factory::syncMutableBoxFromIRBox(builder, loc, box);
+ if (symbol)
+ postDeallocationAction(converter, builder, *symbol);
errorManager.assignStat(builder, loc, stat);
return stat;
}
@@ -769,7 +794,7 @@ void Fortran::lower::genDeallocateBox(
ErrorManager errorManager;
errorManager.init(converter, loc, statExpr, errMsgExpr);
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
- genDeallocate(builder, loc, box, errorManager, declaredTypeDesc);
+ genDeallocate(builder, converter, loc, box, errorManager, declaredTypeDesc);
}
void Fortran::lower::genDeallocateIfAllocated(
@@ -792,22 +817,6 @@ void Fortran::lower::genDeallocateIfAllocated(
.end();
}
-static void preDeallocationAction(Fortran::lower::AbstractConverter &converter,
- fir::FirOpBuilder &builder,
- mlir::Value beginOpValue,
- const Fortran::semantics::Symbol &sym) {
- if (sym.test(Fortran::semantics::Symbol::Flag::AccDeclare))
- Fortran::lower::attachDeclarePreDeallocAction(converter, builder,
- beginOpValue, sym);
-}
-
-static void postDeallocationAction(Fortran::lower::AbstractConverter &converter,
- fir::FirOpBuilder &builder,
- const Fortran::semantics::Symbol &sym) {
- if (sym.test(Fortran::semantics::Symbol::Flag::AccDeclare))
- Fortran::lower::attachDeclarePostDeallocAction(converter, builder, sym);
-}
-
void Fortran::lower::genDeallocateStmt(
Fortran::lower::AbstractConverter &converter,
const Fortran::parser::DeallocateStmt &stmt, mlir::Location loc) {
@@ -843,10 +852,9 @@ void Fortran::lower::genDeallocateStmt(
Fortran::lower::getTypeDescAddr(converter, loc, *derivedTypeSpec);
}
}
- mlir::Value beginOpValue =
- genDeallocate(builder, loc, box, errorManager, declaredTypeDesc);
+ mlir::Value beginOpValue = genDeallocate(
+ builder, converter, loc, box, errorManager, declaredTypeDesc, &symbol);
preDeallocationAction(converter, builder, beginOpValue, symbol);
- postDeallocationAction(converter, builder, symbol);
}
builder.restoreInsertionPoint(insertPt);
}
diff --git a/flang/test/Lower/OpenACC/acc-declare.f90 b/flang/test/Lower/OpenACC/acc-declare.f90
index 157eedf3165c12e..93060fbbfa802c0 100644
--- a/flang/test/Lower/OpenACC/acc-declare.f90
+++ b/flang/test/Lower/OpenACC/acc-declare.f90
@@ -318,6 +318,18 @@ subroutine acc_declare_array_section(a)
! CHECK: acc.copyout accPtr(%[[COPYIN]] : !fir.ref<!fir.array<?xi32>>) bounds(%{{.*}}) to varPtr(%[[BOX_ADDR]] : !fir.ref<!fir.array<?xi32>>) {dataClause = #acc<data_clause acc_copy>, name = "a(1:10)"}
+ subroutine acc_declare_allocate_with_stat()
+ integer :: status
+ real, pointer, dimension(:) :: localptr
+ !$acc declare create(localptr)
+ allocate(localptr(n), stat=status)
+
+ deallocate(localptr, stat=status)
+ end subroutine
+
+! CHECK-LABEL: func.func @_QMacc_declarePacc_declare_allocate_with_stat()
+! CHECK: fir.call @_FortranAPointerAllocate(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}} {acc.declare_action = #acc.declare_action<postAlloc = @_QMacc_declareFacc_declare_allocate_with_statElocalptr_acc_declare_update_desc_post_alloc>}
+! CHECK: fir.call @_FortranAPointerDeallocate(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}} {acc.declare_action = #acc.declare_action<preDealloc = @_QMacc_declareFacc_declare_allocate_with_statElocalptr_acc_declare_update_desc_pre_dealloc>}
end module
module acc_declare_allocatable_test
``````````
</details>
https://github.com/llvm/llvm-project/pull/79883
More information about the flang-commits
mailing list