diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index ef8540c35a372..f26a1aaf0236f 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -2610,8 +2610,12 @@ class FirConverter : public Fortran::lower::AbstractConverter { scopeBlockIdMap.try_emplace(&scope, ++blockId); Fortran::lower::AggregateStoreMap storeMap; for (const Fortran::lower::pft::Variable &var : - Fortran::lower::pft::getScopeVariableList(scope)) - instantiateVar(var, storeMap); + Fortran::lower::pft::getScopeVariableList(scope)) { + // Do no instantiate again variables from the block host + // that appears in specification of block variables. + if (!var.hasSymbol() || !lookupSymbol(var.getSymbol())) + instantiateVar(var, storeMap); + } } else if (e.getIf()) { if (eval.lowerAsUnstructured()) maybeStartBlock(e.block); diff --git a/flang/test/Lower/HLFIR/convert-variable-block.f90 b/flang/test/Lower/HLFIR/convert-variable-block.f90 new file mode 100644 index 0000000000000..30f8eacaaed17 --- /dev/null +++ b/flang/test/Lower/HLFIR/convert-variable-block.f90 @@ -0,0 +1,25 @@ +! Test that hlfir.declare is not created again for dummy arguments +! used in specifications of BLOCK variables. +! RUN: bbc -emit-hlfir %s -o - | FileCheck %s + +subroutine test(n) + integer(8) :: n + call before_block() + block + real :: x(n) + call foo(x) + end block +end subroutine +! CHECK-LABEL: func.func @_QPtest( +! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref {fir.bindc_name = "n"}) { +! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {uniq_name = "_QFtestEn"} : (!fir.ref) -> (!fir.ref, !fir.ref) +! CHECK: fir.call @_QPbefore_block() {{.*}}: () -> () +! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref +! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i64) -> index +! CHECK: %[[VAL_5:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_6:.*]] = arith.cmpi sgt, %[[VAL_4]], %[[VAL_5]] : index +! CHECK: %[[VAL_7:.*]] = arith.select %[[VAL_6]], %[[VAL_4]], %[[VAL_5]] : index +! CHECK: %[[VAL_8:.*]] = fir.alloca !fir.array, %[[VAL_7]] {bindc_name = "x", uniq_name = "_QFtestB1Ex"} +! CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1> +! CHECK: %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_8]](%[[VAL_9]]) {uniq_name = "_QFtestB1Ex"} : (!fir.ref>, !fir.shape<1>) -> (!fir.box>, !fir.ref>) +! CHECK: fir.call @_QPfoo(%[[VAL_10]]#1) {{.*}}: (!fir.ref>) -> ()