Skip to content

Commit 09cdfd6

Browse files
authored
[flang][cuda] Avoid hlfir.declare verifier error when creating temps (llvm#89984)
When creating temporaries for implicit transfer, the newly create hlfir.declare operation was missing some information like the shape and the verifier was throwing an error. Fix it by making sure we have an ExtendedValue when calling addSymbol to register the temp. ``` error: loc("cuda-data-transfer.cuf":67:22): 'hlfir.declare' op of array entity with a raw address base must have a shape operand that is a shape or shapeshift ``` Thanks @jeanPerier for the advice! FYI @ImanHosseini
1 parent 5cfd5d1 commit 09cdfd6

File tree

2 files changed

+4
-2
lines changed

2 files changed

+4
-2
lines changed

flang/lib/Lower/Bridge.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3794,7 +3794,9 @@ class FirConverter : public Fortran::lower::AbstractConverter {
37943794
auto needCleanup = fir::getIntIfConstant(cleanup);
37953795
if (needCleanup && *needCleanup)
37963796
temps.push_back(temp);
3797-
addSymbol(sym, temp, /*forced=*/true);
3797+
addSymbol(sym,
3798+
hlfir::translateToExtendedValue(loc, builder, temp).first,
3799+
/*forced=*/true);
37983800
builder.create<fir::CUDADataTransferOp>(loc, addr, temp,
37993801
transferKindAttr);
38003802
++nbDeviceResidentObject;

flang/test/Lower/CUDA/cuda-data-transfer.cuf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ end
9898

9999
! CHECK: %[[TEMP:.*]] = fir.allocmem !fir.array<10xi32> {bindc_name = ".tmp", uniq_name = ""}
100100
! CHECK: %[[DECL_TEMP:.*]]:2 = hlfir.declare %[[TEMP]](%{{.*}}) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.heap<!fir.array<10xi32>>, !fir.heap<!fir.array<10xi32>>)
101-
! CHECK: %[[ADEV_TEMP:.*]]:2 = hlfir.declare %21#0 {cuda_attr = #fir.cuda<device>, uniq_name = "_QFsub2Eadev"} : (!fir.heap<!fir.array<10xi32>>) -> (!fir.heap<!fir.array<10xi32>>, !fir.heap<!fir.array<10xi32>>)
101+
! CHECK: %[[ADEV_TEMP:.*]]:2 = hlfir.declare %[[DECL_TEMP]]#1(%{{.*}}) {cuda_attr = #fir.cuda<device>, uniq_name = "_QFsub2Eadev"} : (!fir.heap<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.heap<!fir.array<10xi32>>, !fir.heap<!fir.array<10xi32>>)
102102
! CHECK: fir.cuda_data_transfer %[[ADEV]]#1 to %[[DECL_TEMP]]#0 {transfer_kind = #fir.cuda_transfer<device_host>} : !fir.ref<!fir.array<10xi32>>, !fir.heap<!fir.array<10xi32>>
103103
! CHECK: %[[ELEMENTAL:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32>
104104
! CHECK: hlfir.assign %[[ELEMENTAL]] to %[[BHOST]]#0 : !hlfir.expr<10xi32>, !fir.ref<!fir.array<10xi32>>

0 commit comments

Comments
 (0)