diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index 3d071f6bb8d5a1..267a3557ab8c4a 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -4296,8 +4296,13 @@ class FirConverter : public Fortran::lower::AbstractConverter { auto [temp, cleanup] = hlfir::createTempFromMold(loc, builder, entity); auto needCleanup = fir::getIntIfConstant(cleanup); - if (needCleanup && *needCleanup) - temps.push_back(temp); + if (needCleanup && *needCleanup) { + if (auto declareOp = + mlir::dyn_cast(temp.getDefiningOp())) + temps.push_back(declareOp.getMemref()); + else + temps.push_back(temp); + } addSymbol(sym, hlfir::translateToExtendedValue(loc, builder, temp).first, /*forced=*/true); diff --git a/flang/test/Lower/CUDA/cuda-data-transfer.cuf b/flang/test/Lower/CUDA/cuda-data-transfer.cuf index 8b04a2c202dc00..1383b73ea44d6a 100644 --- a/flang/test/Lower/CUDA/cuda-data-transfer.cuf +++ b/flang/test/Lower/CUDA/cuda-data-transfer.cuf @@ -109,7 +109,7 @@ end ! CHECK: cuf.data_transfer %[[ADEV]]#1 to %[[DECL_TEMP]]#0 {transfer_kind = #cuf.cuda_transfer} : !fir.ref>, !fir.heap> ! CHECK: %[[ELEMENTAL:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> ! CHECK: hlfir.assign %[[ELEMENTAL]] to %[[BHOST]]#0 : !hlfir.expr<10xi32>, !fir.ref> -! CHECK: fir.freemem %[[DECL_TEMP]]#0 : !fir.heap> +! CHECK: fir.freemem %[[TEMP]] : !fir.heap> subroutine sub3() use mod1 @@ -251,3 +251,17 @@ end subroutine ! CHECK: %{{.*}} = fir.call @_QMmod1Pdev1 ! CHECK: hlfir.assign ! CHECK-NOT: cuf.data_transfer + +subroutine sub13(a, b, n) + integer :: n + integer :: a(n) + integer, allocatable, device :: b(:) + integer :: res(10) + + res = a + b +end subroutine + +! CHECK-LABEL: func.func @_QPsub13 +! CHECK: %[[TEMP:.*]] = fir.allocmem !fir.array, %14#1 {bindc_name = ".tmp", uniq_name = ""} +! CHECK: cuf.data_transfer +! CHECK: fir.freemem %[[TEMP]] : !fir.heap>