Skip to content

Commit 46c9a8c

Browse files
committed
preserve unwrap
1 parent 153e1f1 commit 46c9a8c

File tree

2 files changed

+150
-70
lines changed

2 files changed

+150
-70
lines changed

flang/lib/Lower/OpenACC.cpp

Lines changed: 140 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -244,16 +244,29 @@ static void createDeclareAllocFuncWithArg(mlir::OpBuilder &modBuilder,
244244
if (unwrapFirBox)
245245
asFortranDesc << accFirDescriptorPostfix.str();
246246

247-
// Use declare_enter for the descriptor so the runtime mirrors allocation
248-
// semantics instead of issuing an update. This ensures the descriptor's
249-
// device-side metadata is established via a structured begin.
250-
EntryOp descEntryOp = createDataEntryOp<EntryOp>(
251-
builder, loc, registerFuncOp.getArgument(0), asFortranDesc, bounds,
252-
/*structured=*/false, /*implicit=*/true, clause, descTy,
253-
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
254-
mlir::acc::DeclareEnterOp::create(
255-
builder, loc, mlir::acc::DeclareTokenType::get(descEntryOp.getContext()),
256-
mlir::ValueRange(descEntryOp.getAccVar()));
247+
// For descriptor, preserve old behavior when unwrapping FIR box: update.
248+
if (unwrapFirBox) {
249+
mlir::acc::UpdateDeviceOp updateDeviceOp =
250+
createDataEntryOp<mlir::acc::UpdateDeviceOp>(
251+
builder, loc, registerFuncOp.getArgument(0), asFortranDesc, bounds,
252+
/*structured=*/false, /*implicit=*/true,
253+
mlir::acc::DataClause::acc_update_device, descTy,
254+
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
255+
llvm::SmallVector<int32_t> operandSegments{0, 0, 0, 1};
256+
llvm::SmallVector<mlir::Value> operands{updateDeviceOp.getResult()};
257+
createSimpleOp<mlir::acc::UpdateOp>(builder, loc, operands,
258+
operandSegments);
259+
} else {
260+
// New behavior: start a structured region with declare_enter.
261+
EntryOp descEntryOp = createDataEntryOp<EntryOp>(
262+
builder, loc, registerFuncOp.getArgument(0), asFortranDesc, bounds,
263+
/*structured=*/false, /*implicit=*/true, clause, descTy,
264+
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
265+
mlir::acc::DeclareEnterOp::create(
266+
builder, loc,
267+
mlir::acc::DeclareTokenType::get(descEntryOp.getContext()),
268+
mlir::ValueRange(descEntryOp.getAccVar()));
269+
}
257270

258271
if (unwrapFirBox) {
259272
mlir::Value desc =
@@ -298,30 +311,58 @@ static void createDeclareDeallocFuncWithArg(
298311
}
299312

300313
llvm::SmallVector<mlir::Value> bounds;
301-
mlir::acc::GetDevicePtrOp entryOp =
302-
createDataEntryOp<mlir::acc::GetDevicePtrOp>(
303-
builder, loc, var, asFortran, bounds,
304-
/*structured=*/false, /*implicit=*/false, clause, var.getType(),
305-
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
306-
mlir::acc::DeclareExitOp::create(builder, loc, mlir::Value{},
307-
mlir::ValueRange(entryOp.getAccVar()));
308-
309-
if constexpr (std::is_same_v<ExitOp, mlir::acc::CopyoutOp> ||
310-
std::is_same_v<ExitOp, mlir::acc::UpdateHostOp>)
311-
ExitOp::create(builder, entryOp.getLoc(), entryOp.getAccVar(),
312-
entryOp.getVar(), entryOp.getVarType(), entryOp.getBounds(),
313-
entryOp.getAsyncOperands(),
314-
entryOp.getAsyncOperandsDeviceTypeAttr(),
315-
entryOp.getAsyncOnlyAttr(), entryOp.getDataClause(),
316-
/*structured=*/false, /*implicit=*/false,
317-
builder.getStringAttr(*entryOp.getName()));
318-
else
319-
ExitOp::create(builder, entryOp.getLoc(), entryOp.getAccVar(),
320-
entryOp.getBounds(), entryOp.getAsyncOperands(),
321-
entryOp.getAsyncOperandsDeviceTypeAttr(),
322-
entryOp.getAsyncOnlyAttr(), entryOp.getDataClause(),
323-
/*structured=*/false, /*implicit=*/false,
324-
builder.getStringAttr(*entryOp.getName()));
314+
if (unwrapFirBox) {
315+
// Unwrap: delete device payload using getdeviceptr + declare_exit + ExitOp
316+
mlir::acc::GetDevicePtrOp entryOp =
317+
createDataEntryOp<mlir::acc::GetDevicePtrOp>(
318+
builder, loc, var, asFortran, bounds,
319+
/*structured=*/false, /*implicit=*/false, clause, var.getType(),
320+
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
321+
mlir::acc::DeclareExitOp::create(builder, loc, mlir::Value{},
322+
mlir::ValueRange(entryOp.getAccVar()));
323+
324+
if constexpr (std::is_same_v<ExitOp, mlir::acc::CopyoutOp> ||
325+
std::is_same_v<ExitOp, mlir::acc::UpdateHostOp>)
326+
ExitOp::create(builder, entryOp.getLoc(), entryOp.getAccVar(),
327+
entryOp.getVar(), entryOp.getVarType(),
328+
entryOp.getBounds(), entryOp.getAsyncOperands(),
329+
entryOp.getAsyncOperandsDeviceTypeAttr(),
330+
entryOp.getAsyncOnlyAttr(), entryOp.getDataClause(),
331+
/*structured=*/false, /*implicit=*/false,
332+
builder.getStringAttr(*entryOp.getName()));
333+
else
334+
ExitOp::create(builder, entryOp.getLoc(), entryOp.getAccVar(),
335+
entryOp.getBounds(), entryOp.getAsyncOperands(),
336+
entryOp.getAsyncOperandsDeviceTypeAttr(),
337+
entryOp.getAsyncOnlyAttr(), entryOp.getDataClause(),
338+
/*structured=*/false, /*implicit=*/false,
339+
builder.getStringAttr(*entryOp.getName()));
340+
} else {
341+
mlir::acc::GetDevicePtrOp entryOp =
342+
createDataEntryOp<mlir::acc::GetDevicePtrOp>(
343+
builder, loc, var, asFortran, bounds,
344+
/*structured=*/false, /*implicit=*/false, clause, var.getType(),
345+
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
346+
mlir::acc::DeclareExitOp::create(builder, loc, mlir::Value{},
347+
mlir::ValueRange(entryOp.getAccVar()));
348+
349+
if constexpr (std::is_same_v<ExitOp, mlir::acc::CopyoutOp> ||
350+
std::is_same_v<ExitOp, mlir::acc::UpdateHostOp>)
351+
ExitOp::create(builder, entryOp.getLoc(), entryOp.getAccVar(),
352+
entryOp.getVar(), entryOp.getVarType(),
353+
entryOp.getBounds(), entryOp.getAsyncOperands(),
354+
entryOp.getAsyncOperandsDeviceTypeAttr(),
355+
entryOp.getAsyncOnlyAttr(), entryOp.getDataClause(),
356+
/*structured=*/false, /*implicit=*/false,
357+
builder.getStringAttr(*entryOp.getName()));
358+
else
359+
ExitOp::create(builder, entryOp.getLoc(), entryOp.getAccVar(),
360+
entryOp.getBounds(), entryOp.getAsyncOperands(),
361+
entryOp.getAsyncOperandsDeviceTypeAttr(),
362+
entryOp.getAsyncOnlyAttr(), entryOp.getDataClause(),
363+
/*structured=*/false, /*implicit=*/false,
364+
builder.getStringAttr(*entryOp.getName()));
365+
}
325366

326367
// Generate the post dealloc function.
327368
modBuilder.setInsertionPointAfter(preDeallocOp);
@@ -337,15 +378,28 @@ static void createDeclareDeallocFuncWithArg(
337378
asFortran << accFirDescriptorPostfix.str();
338379
}
339380

340-
// End the structured declare region for the descriptor or its payload
341-
// using declare_exit instead of issuing an update.
342-
mlir::acc::GetDevicePtrOp postEntryOp =
343-
createDataEntryOp<mlir::acc::GetDevicePtrOp>(
344-
builder, loc, var, asFortran, bounds,
345-
/*structured=*/false, /*implicit=*/true, clause, var.getType(),
346-
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
347-
mlir::acc::DeclareExitOp::create(builder, loc, mlir::Value{},
348-
mlir::ValueRange(postEntryOp.getAccVar()));
381+
if (unwrapFirBox) {
382+
// Old behavior: update descriptor after deallocation.
383+
mlir::acc::UpdateDeviceOp updateDeviceOp =
384+
createDataEntryOp<mlir::acc::UpdateDeviceOp>(
385+
builder, loc, var, asFortran, bounds,
386+
/*structured=*/false, /*implicit=*/true,
387+
mlir::acc::DataClause::acc_update_device, var.getType(),
388+
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
389+
llvm::SmallVector<int32_t> operandSegments{0, 0, 0, 1};
390+
llvm::SmallVector<mlir::Value> operands{updateDeviceOp.getResult()};
391+
createSimpleOp<mlir::acc::UpdateOp>(builder, loc, operands,
392+
operandSegments);
393+
} else {
394+
// New behavior: end structured region with declare_exit.
395+
mlir::acc::GetDevicePtrOp postEntryOp =
396+
createDataEntryOp<mlir::acc::GetDevicePtrOp>(
397+
builder, loc, var, asFortran, bounds,
398+
/*structured=*/false, /*implicit=*/true, clause, var.getType(),
399+
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
400+
mlir::acc::DeclareExitOp::create(builder, loc, mlir::Value{},
401+
mlir::ValueRange(postEntryOp.getAccVar()));
402+
}
349403
modBuilder.setInsertionPointAfter(postDeallocOp);
350404
builder.restoreInsertionPoint(crtInsPt);
351405
}
@@ -3988,16 +4042,28 @@ static void createDeclareAllocFunc(mlir::OpBuilder &modBuilder,
39884042
asFortranDesc << accFirDescriptorPostfix.str();
39894043
llvm::SmallVector<mlir::Value> bounds;
39904044

3991-
// Use declare_enter for the descriptor so the runtime mirrors allocation
3992-
// semantics instead of issuing an update. This ensures the descriptor's
3993-
// device-side metadata is established via a structured begin.
3994-
EntryOp descEntryOp = createDataEntryOp<EntryOp>(
3995-
builder, loc, addrOp, asFortranDesc, bounds,
3996-
/*structured=*/false, /*implicit=*/true, clause, addrOp.getType(),
3997-
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
3998-
mlir::acc::DeclareEnterOp::create(
3999-
builder, loc, mlir::acc::DeclareTokenType::get(descEntryOp.getContext()),
4000-
mlir::ValueRange(descEntryOp.getAccVar()));
4045+
// For unwrapFirBox=false this remains declare_enter; for unwrapFirBox=true,
4046+
// the descriptor post-alloc remains update behavior.
4047+
if (unwrapFirBox) {
4048+
mlir::acc::UpdateDeviceOp updDesc =
4049+
createDataEntryOp<mlir::acc::UpdateDeviceOp>(
4050+
builder, loc, addrOp, asFortranDesc, bounds,
4051+
/*structured=*/false, /*implicit=*/true,
4052+
mlir::acc::DataClause::acc_update_device, addrOp.getType(),
4053+
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
4054+
llvm::SmallVector<int32_t> seg{0, 0, 0, 1};
4055+
llvm::SmallVector<mlir::Value> ops{updDesc.getResult()};
4056+
createSimpleOp<mlir::acc::UpdateOp>(builder, loc, ops, seg);
4057+
} else {
4058+
EntryOp descEntryOp = createDataEntryOp<EntryOp>(
4059+
builder, loc, addrOp, asFortranDesc, bounds,
4060+
/*structured=*/false, /*implicit=*/true, clause, addrOp.getType(),
4061+
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
4062+
mlir::acc::DeclareEnterOp::create(
4063+
builder, loc,
4064+
mlir::acc::DeclareTokenType::get(descEntryOp.getContext()),
4065+
mlir::ValueRange(descEntryOp.getAccVar()));
4066+
}
40014067

40024068
if (unwrapFirBox) {
40034069
auto loadOp = fir::LoadOp::create(builder, loc, addrOp.getResult());
@@ -4090,15 +4156,27 @@ static void createDeclareDeallocFunc(mlir::OpBuilder &modBuilder,
40904156
if (unwrapFirBox)
40914157
asFortran << accFirDescriptorPostfix.str();
40924158
llvm::SmallVector<mlir::Value> bounds;
4093-
// Use declare_exit for the descriptor to end the structured declare region
4094-
// instead of issuing an update.
4095-
mlir::acc::GetDevicePtrOp descEntryOp =
4096-
createDataEntryOp<mlir::acc::GetDevicePtrOp>(
4097-
builder, loc, addrOp, asFortran, bounds,
4098-
/*structured=*/false, /*implicit=*/true, clause, addrOp.getType(),
4099-
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
4100-
mlir::acc::DeclareExitOp::create(builder, loc, mlir::Value{},
4101-
mlir::ValueRange(descEntryOp.getAccVar()));
4159+
if (unwrapFirBox) {
4160+
// Unwrap mode: update the descriptor after deallocation (no declare_exit).
4161+
mlir::acc::UpdateDeviceOp updDesc =
4162+
createDataEntryOp<mlir::acc::UpdateDeviceOp>(
4163+
builder, loc, addrOp, asFortran, bounds,
4164+
/*structured=*/false, /*implicit=*/true,
4165+
mlir::acc::DataClause::acc_update_device, addrOp.getType(),
4166+
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
4167+
llvm::SmallVector<int32_t> seg{0, 0, 0, 1};
4168+
llvm::SmallVector<mlir::Value> ops{updDesc.getResult()};
4169+
createSimpleOp<mlir::acc::UpdateOp>(builder, loc, ops, seg);
4170+
} else {
4171+
// Default: end the structured declare region using declare_exit.
4172+
mlir::acc::GetDevicePtrOp descEntryOp =
4173+
createDataEntryOp<mlir::acc::GetDevicePtrOp>(
4174+
builder, loc, addrOp, asFortran, bounds,
4175+
/*structured=*/false, /*implicit=*/true, clause, addrOp.getType(),
4176+
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
4177+
mlir::acc::DeclareExitOp::create(builder, loc, mlir::Value{},
4178+
mlir::ValueRange(descEntryOp.getAccVar()));
4179+
}
41024180
modBuilder.setInsertionPointAfter(postDeallocOp);
41034181
}
41044182

flang/test/Lower/OpenACC/acc-declare-unwrap-defaultbounds.f90

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
! This test checks lowering of OpenACC declare directive in function and
22
! subroutine specification parts.
3-
! RUN: bbc -fopenacc -emit-hlfir --openacc-unwrap-fir-box=true --openacc-generate-default-bounds=true %s -o - | FileCheck %s
43

4+
! RUN: bbc -fopenacc -emit-hlfir --openacc-unwrap-fir-box=true --openacc-generate-default-bounds=true %s -o - | FileCheck %s
55

66
module acc_declare
77
contains
@@ -258,6 +258,8 @@ subroutine acc_declare_allocate()
258258

259259
! CHECK-LABEL: func.func private @_QMacc_declareFacc_declare_allocateEa_acc_declare_update_desc_post_alloc(
260260
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) {
261+
! CHECK: %[[UPDATE:.*]] = acc.update_device varPtr(%[[ARG0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> {implicit = true, name = "a_desc", structured = false}
262+
! CHECK: acc.update dataOperands(%[[UPDATE]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
261263
! CHECK: %[[LOAD:.*]] = fir.load %[[ARG0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
262264
! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[LOAD]] {acc.declare = #acc.declare<dataClause = acc_create>} : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
263265
! CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[BOX_ADDR]] : !fir.heap<!fir.array<?xi32>>) -> !fir.heap<!fir.array<?xi32>> {name = "a", structured = false}
@@ -279,8 +281,8 @@ subroutine acc_declare_allocate()
279281
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) {
280282
! CHECK: %[[LOAD:.*]] = fir.load %[[ARG0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
281283
! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[LOAD]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
282-
! CHECK: %[[GETDEVICEPTR:.*]] = acc.getdeviceptr varPtr(%[[BOX_ADDR]] : !fir.heap<!fir.array<?xi32>>) -> !fir.heap<!fir.array<?xi32>> {dataClause = #acc<data_clause acc_create>, implicit = true, name = "a_desc", structured = false}
283-
! CHECK: acc.declare_exit dataOperands(%[[GETDEVICEPTR]] : !fir.heap<!fir.array<?xi32>>)
284+
! CHECK: %[[UPDATE:.*]] = acc.update_device varPtr(%[[BOX_ADDR]] : !fir.heap<!fir.array<?xi32>>) -> !fir.heap<!fir.array<?xi32>> {implicit = true, name = "a_desc", structured = false}
285+
! CHECK: acc.update dataOperands(%[[UPDATE]] : !fir.heap<!fir.array<?xi32>>)
284286
! CHECK: return
285287
! CHECK: }
286288

@@ -353,8 +355,8 @@ module acc_declare_allocatable_test
353355

354356
! CHECK-LABEL: func.func private @_QMacc_declare_allocatable_testEdata1_acc_declare_update_desc_post_alloc() {
355357
! CHECK: %[[GLOBAL_ADDR:.*]] = fir.address_of(@_QMacc_declare_allocatable_testEdata1) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
356-
! CHECK: %[[CREATE_DESC:.*]] = acc.create varPtr(%[[GLOBAL_ADDR]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> {implicit = true, name = "data1_desc", structured = false}
357-
! CHECK: acc.declare_enter dataOperands(%[[CREATE_DESC]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
358+
! CHECK: %[[UPDATE:.*]] = acc.update_device varPtr(%[[GLOBAL_ADDR]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> {implicit = true, name = "data1_desc", structured = false}
359+
! CHECK: acc.update dataOperands(%[[UPDATE]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
358360
! CHECK: %[[LOAD:.*]] = fir.load %[[GLOBAL_ADDR]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
359361
! CHECK: %[[BOXADDR:.*]] = fir.box_addr %[[LOAD]] {acc.declare = #acc.declare<dataClause = acc_create>} : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
360362
! CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[BOXADDR]] : !fir.heap<!fir.array<?xi32>>) -> !fir.heap<!fir.array<?xi32>> {name = "data1", structured = false}
@@ -374,8 +376,8 @@ module acc_declare_allocatable_test
374376

375377
! CHECK-LABEL: func.func private @_QMacc_declare_allocatable_testEdata1_acc_declare_update_desc_post_dealloc() {
376378
! CHECK: %[[GLOBAL_ADDR:.*]] = fir.address_of(@_QMacc_declare_allocatable_testEdata1) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
377-
! CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[GLOBAL_ADDR]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> {dataClause = #acc<data_clause acc_create>, implicit = true, name = "data1_desc", structured = false}
378-
! CHECK: acc.declare_exit dataOperands(%[[DEVPTR]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
379+
! CHECK: %[[UPDATE:.*]] = acc.update_device varPtr(%[[GLOBAL_ADDR]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> {implicit = true, name = "data1_desc", structured = false}
380+
! CHECK: acc.update dataOperands(%[[UPDATE]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
379381
! CHECK: return
380382
! CHECK: }
381383

@@ -473,4 +475,4 @@ subroutine init()
473475
! CHECK-LABEL: func.func @_QMacc_declare_post_action_statPinit()
474476
! 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>>, !fir.ref<i64>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
475477
! CHECK: fir.if
476-
! 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>>, !fir.ref<i64>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
478+
! 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>>, !fir.ref<i64>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32

0 commit comments

Comments
 (0)