mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-24 23:06:05 +00:00
[flang][openacc] Attach post allocate action on the correct operation (#106805)
In some cases (when using stat), the action was attached to the invisible fir.result op. Apply same fix as in #89662.
This commit is contained in:
parent
6f81c878ec
commit
5257fa19c9
@ -4293,23 +4293,30 @@ void Fortran::lower::attachDeclarePostAllocAction(
|
||||
const Fortran::semantics::Symbol &sym) {
|
||||
std::stringstream fctName;
|
||||
fctName << converter.mangleName(sym) << declarePostAllocSuffix.str();
|
||||
mlir::Operation &op = builder.getInsertionBlock()->back();
|
||||
mlir::Operation *op = &builder.getInsertionBlock()->back();
|
||||
|
||||
if (op.hasAttr(mlir::acc::getDeclareActionAttrName())) {
|
||||
auto attr = op.getAttrOfType<mlir::acc::DeclareActionAttr>(
|
||||
if (auto resOp = mlir::dyn_cast<fir::ResultOp>(*op)) {
|
||||
assert(resOp.getOperands().size() == 0 &&
|
||||
"expect only fir.result op with no operand");
|
||||
op = op->getPrevNode();
|
||||
}
|
||||
assert(op && "expect operation to attach the post allocation action");
|
||||
|
||||
if (op->hasAttr(mlir::acc::getDeclareActionAttrName())) {
|
||||
auto attr = op->getAttrOfType<mlir::acc::DeclareActionAttr>(
|
||||
mlir::acc::getDeclareActionAttrName());
|
||||
op.setAttr(mlir::acc::getDeclareActionAttrName(),
|
||||
mlir::acc::DeclareActionAttr::get(
|
||||
builder.getContext(), attr.getPreAlloc(),
|
||||
/*postAlloc=*/builder.getSymbolRefAttr(fctName.str()),
|
||||
attr.getPreDealloc(), attr.getPostDealloc()));
|
||||
op->setAttr(mlir::acc::getDeclareActionAttrName(),
|
||||
mlir::acc::DeclareActionAttr::get(
|
||||
builder.getContext(), attr.getPreAlloc(),
|
||||
/*postAlloc=*/builder.getSymbolRefAttr(fctName.str()),
|
||||
attr.getPreDealloc(), attr.getPostDealloc()));
|
||||
} else {
|
||||
op.setAttr(mlir::acc::getDeclareActionAttrName(),
|
||||
mlir::acc::DeclareActionAttr::get(
|
||||
builder.getContext(),
|
||||
/*preAlloc=*/{},
|
||||
/*postAlloc=*/builder.getSymbolRefAttr(fctName.str()),
|
||||
/*preDealloc=*/{}, /*postDealloc=*/{}));
|
||||
op->setAttr(mlir::acc::getDeclareActionAttrName(),
|
||||
mlir::acc::DeclareActionAttr::get(
|
||||
builder.getContext(),
|
||||
/*preAlloc=*/{},
|
||||
/*postAlloc=*/builder.getSymbolRefAttr(fctName.str()),
|
||||
/*preDealloc=*/{}, /*postDealloc=*/{}));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -455,3 +455,20 @@ end module
|
||||
|
||||
! CHECK-LABEL: acc.global_ctor @_QMacc_declare_allocatable_test3Edata1_acc_ctor
|
||||
! CHECK-LABEL: acc.global_ctor @_QMacc_declare_allocatable_test3Edata2_acc_ctor
|
||||
|
||||
module acc_declare_post_action_stat
|
||||
real, dimension(:), allocatable :: x, y
|
||||
!$acc declare create(x,y)
|
||||
|
||||
contains
|
||||
|
||||
subroutine init()
|
||||
integer :: stat
|
||||
allocate(x(10), y(10), stat=stat)
|
||||
end subroutine
|
||||
end module
|
||||
|
||||
! CHECK-LABEL: func.func @_QMacc_declare_post_action_statPinit()
|
||||
! CHECK: fir.call @_FortranAAllocatableAllocate({{.*}}) fastmath<contract> {acc.declare_action = #acc.declare_action<postAlloc = @_QMacc_declare_post_action_statEx_acc_declare_update_desc_post_alloc>} : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
|
||||
! CHECK: fir.if
|
||||
! CHECK: fir.call @_FortranAAllocatableAllocate({{.*}}) fastmath<contract> {acc.declare_action = #acc.declare_action<postAlloc = @_QMacc_declare_post_action_statEy_acc_declare_update_desc_post_alloc>} : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
|
||||
|
Loading…
x
Reference in New Issue
Block a user