294 lines · plain
1! This test checks lowering of OpenMP DO Directive (Worksharing).2 3! RUN: bbc -fopenmp -emit-hlfir %s -o - \4! RUN: | FileCheck %s5 6! CHECK-LABEL: func @_QPsimple_parallel_do()7subroutine simple_parallel_do8 integer :: i9 ! CHECK: omp.parallel10 ! CHECK: %[[WS_LB:.*]] = arith.constant 1 : i3211 ! CHECK: %[[WS_UB:.*]] = arith.constant 9 : i3212 ! CHECK: %[[WS_STEP:.*]] = arith.constant 1 : i3213 ! CHECK: omp.wsloop private({{.*}}) {14 ! CHECK-NEXT: omp.loop_nest (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]]) {15 !$OMP PARALLEL DO16 do i=1, 917 ! CHECK: hlfir.assign %[[I]] to %[[IV_ADDR:.*]]#0 : i32, !fir.ref<i32>18 ! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]]#0 : !fir.ref<i32>19 ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) {{.*}}: (!fir.ref<i8>, i32) -> i120 print*, i21 end do22 ! CHECK: omp.yield23 ! CHECK: omp.terminator24 !$OMP END PARALLEL DO25end subroutine26 27! CHECK-LABEL: func @_QPparallel_do_with_parallel_clauses28! CHECK-SAME: %[[COND_REF:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "cond"}, %[[NT_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "nt"}29subroutine parallel_do_with_parallel_clauses(cond, nt)30 ! CHECK: %[[COND_DECL:.*]]:2 = hlfir.declare %[[COND_REF]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFparallel_do_with_parallel_clausesEcond"} : (!fir.ref<!fir.logical<4>>, !fir.dscope) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)31 ! CHECK: %[[NT_DECL:.*]]:2 = hlfir.declare %[[NT_REF]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFparallel_do_with_parallel_clausesEnt"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)32 logical :: cond33 integer :: nt34 integer :: i35 ! CHECK: %[[COND:.*]] = fir.load %[[COND_DECL]]#0 : !fir.ref<!fir.logical<4>>36 ! CHECK: %[[COND_CVT:.*]] = fir.convert %[[COND]] : (!fir.logical<4>) -> i137 ! CHECK: %[[NT:.*]] = fir.load %[[NT_DECL]]#0 : !fir.ref<i32>38 ! CHECK: omp.parallel if(%[[COND_CVT]]) num_threads(%[[NT]] : i32) proc_bind(close)39 ! CHECK: %[[WS_LB:.*]] = arith.constant 1 : i3240 ! CHECK: %[[WS_UB:.*]] = arith.constant 9 : i3241 ! CHECK: %[[WS_STEP:.*]] = arith.constant 1 : i3242 ! CHECK: omp.wsloop private({{.*}}) {43 ! CHECK-NEXT: omp.loop_nest (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]]) {44 !$OMP PARALLEL DO IF(cond) NUM_THREADS(nt) PROC_BIND(close)45 do i=1, 946 ! CHECK: hlfir.assign %[[I]] to %[[IV_ADDR:.*]]#0 : i32, !fir.ref<i32>47 ! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]]#0 : !fir.ref<i32>48 ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) {{.*}}: (!fir.ref<i8>, i32) -> i149 print*, i50 end do51 ! CHECK: omp.yield52 ! CHECK: omp.terminator53 !$OMP END PARALLEL DO54end subroutine55 56! CHECK-LABEL: func @_QPparallel_do_with_clauses57! CHECK-SAME: %[[NT_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "nt"}58subroutine parallel_do_with_clauses(nt)59 ! CHECK: %[[NT_DECL:.*]]:2 = hlfir.declare %[[NT_REF]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFparallel_do_with_clausesEnt"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)60 integer :: nt61 integer :: i62 ! CHECK: %[[NT:.*]] = fir.load %[[NT_DECL]]#0 : !fir.ref<i32>63 ! CHECK: omp.parallel num_threads(%[[NT]] : i32)64 ! CHECK: %[[WS_LB:.*]] = arith.constant 1 : i3265 ! CHECK: %[[WS_UB:.*]] = arith.constant 9 : i3266 ! CHECK: %[[WS_STEP:.*]] = arith.constant 1 : i3267 ! CHECK: omp.wsloop schedule(dynamic) private({{.*}}) {68 ! CHECK-NEXT: omp.loop_nest (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]]) {69 !$OMP PARALLEL DO NUM_THREADS(nt) SCHEDULE(dynamic)70 do i=1, 971 ! CHECK: hlfir.assign %[[I]] to %[[IV_ADDR:.*]]#0 : i32, !fir.ref<i32>72 ! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]]#0 : !fir.ref<i32>73 ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) {{.*}}: (!fir.ref<i8>, i32) -> i174 print*, i75 end do76 ! CHECK: omp.yield77 ! CHECK: omp.terminator78 !$OMP END PARALLEL DO79end subroutine80 81!===============================================================================82! Checking for the following construct:83! !$omp parallel do private(...) firstprivate(...)84!===============================================================================85 86! CHECK-LABEL: func @_QPparallel_do_with_privatisation_clauses87! CHECK-SAME: %[[COND_REF:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "cond"}, %[[NT_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "nt"}88subroutine parallel_do_with_privatisation_clauses(cond,nt)89 ! CHECK: %[[COND_DECL:.*]]:2 = hlfir.declare %[[COND_REF]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFparallel_do_with_privatisation_clausesEcond"} : (!fir.ref<!fir.logical<4>>, !fir.dscope) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)90 ! CHECK: %[[NT_DECL:.*]]:2 = hlfir.declare %[[NT_REF]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFparallel_do_with_privatisation_clausesEnt"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)91 logical :: cond92 integer :: nt93 integer :: i94 ! CHECK: omp.parallel95 96 ! CHECK: %[[WS_LB:.*]] = arith.constant 1 : i3297 ! CHECK: %[[WS_UB:.*]] = arith.constant 9 : i3298 ! CHECK: %[[WS_STEP:.*]] = arith.constant 1 : i3299 ! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[PRIVATE_COND_REF:.*]], @{{.*}} %{{.*}}#0 -> %[[PRIVATE_NT_REF:.*]], @{{.*}} %3#0 -> %{{.*}} : !fir.ref<!fir.logical<4>>, !fir.ref<i32>, !fir.ref<i32>) {100 ! CHECK-NEXT: omp.loop_nest (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]]) {101 !$OMP PARALLEL DO PRIVATE(cond) FIRSTPRIVATE(nt)102 do i=1, 9103 ! CHECK: %[[PRIVATE_COND_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_COND_REF]] {uniq_name = "_QFparallel_do_with_privatisation_clausesEcond"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)104 ! CHECK: %[[PRIVATE_NT_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_NT_REF]] {uniq_name = "_QFparallel_do_with_privatisation_clausesEnt"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)105 ! CHECK: hlfir.assign %[[I]] to %[[IV_ADDR:.*]]#0 : i32, !fir.ref<i32>106 ! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]]#0 : !fir.ref<i32>107 ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) {{.*}}: (!fir.ref<i8>, i32) -> i1108 ! CHECK: %[[PRIVATE_COND_VAL:.*]] = fir.load %[[PRIVATE_COND_DECL]]#0 : !fir.ref<!fir.logical<4>>109 ! CHECK: %[[PRIVATE_COND_VAL_CVT:.*]] = fir.convert %[[PRIVATE_COND_VAL]] : (!fir.logical<4>) -> i1110 ! CHECK: fir.call @_FortranAioOutputLogical({{.*}}, %[[PRIVATE_COND_VAL_CVT]]) {{.*}}: (!fir.ref<i8>, i1) -> i1111 ! CHECK: %[[PRIVATE_NT_VAL:.*]] = fir.load %[[PRIVATE_NT_DECL]]#0 : !fir.ref<i32>112 ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[PRIVATE_NT_VAL]]) {{.*}}: (!fir.ref<i8>, i32) -> i1113 print*, i, cond, nt114 end do115 ! CHECK: omp.yield116 ! CHECK: omp.terminator117 !$OMP END PARALLEL DO118end subroutine119 120!===============================================================================121! Checking for the following construct122! !$omp parallel private(...) firstprivate(...)123! !$omp do124!===============================================================================125 126subroutine parallel_private_do(cond,nt)127logical :: cond128 integer :: nt129 integer :: i130 !$OMP PARALLEL PRIVATE(cond) FIRSTPRIVATE(nt)131 !$OMP DO132 do i=1, 9133 call foo(i, cond, nt)134 end do135 !$OMP END DO136 !$OMP END PARALLEL137end subroutine parallel_private_do138 139! CHECK-LABEL: func.func @_QPparallel_private_do(140! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "cond"},141! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "nt"}) {142! CHECK: %[[NT_DECL:.*]]:2 = hlfir.declare %[[VAL_1]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFparallel_private_doEnt"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)143! CHECK: omp.parallel private(@{{.*}} %{{.*}}#0 -> %[[COND_ADDR:.*]], @{{.*firstprivate.*}} %{{.*}}#0 -> %[[NT_PRIV_ADDR:.*]] : {{.*}}) {144 145! CHECK: %[[COND_DECL:.*]]:2 = hlfir.declare %[[COND_ADDR]] {uniq_name = "_QFparallel_private_doEcond"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)146 147! CHECK: %[[NT_PRIV_DECL:.*]]:2 = hlfir.declare %[[NT_PRIV_ADDR]] {uniq_name = "_QFparallel_private_doEnt"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)148 149! CHECK: %[[VAL_7:.*]] = arith.constant 1 : i32150! CHECK: %[[VAL_8:.*]] = arith.constant 9 : i32151! CHECK: %[[VAL_9:.*]] = arith.constant 1 : i32152! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[I_PRIV:.*]] : !fir.ref<i32>) {153! CHECK-NEXT: omp.loop_nest (%[[I:.*]]) : i32 = (%[[VAL_7]]) to (%[[VAL_8]]) inclusive step (%[[VAL_9]]) {154! CHECK: %[[I_PRIV_DECL:.*]]:2 = hlfir.declare %[[I_PRIV]] {uniq_name = "_QFparallel_private_doEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)155! CHECK: hlfir.assign %[[I]] to %[[I_PRIV_DECL]]#0 : i32, !fir.ref<i32>156! CHECK: fir.call @_QPfoo(%[[I_PRIV_DECL]]#0, %[[COND_DECL]]#0, %[[NT_PRIV_DECL]]#0) {{.*}}: (!fir.ref<i32>, !fir.ref<!fir.logical<4>>, !fir.ref<i32>) -> ()157! CHECK: omp.yield158! CHECK: }159! CHECK: }160! CHECK: omp.terminator161! CHECK: }162! CHECK: return163! CHECK: }164 165!===============================================================================166! Checking for the following construct167! !$omp parallel168! !$omp do firstprivate(...) firstprivate(...)169!===============================================================================170 171subroutine omp_parallel_multiple_firstprivate_do(a, b)172 integer::a, b173 !$OMP PARALLEL FIRSTPRIVATE(a) FIRSTPRIVATE(b)174 !$OMP DO175 do i=1, 10176 call bar(i, a)177 end do178 !$OMP END DO179 !$OMP END PARALLEL180end subroutine omp_parallel_multiple_firstprivate_do181 182! CHECK-LABEL: func.func @_QPomp_parallel_multiple_firstprivate_do(183! CHECK-SAME: %[[A_ADDR:.*]]: !fir.ref<i32> {fir.bindc_name = "a"},184! CHECK-SAME: %[[B_ADDR:.*]]: !fir.ref<i32> {fir.bindc_name = "b"}) {185! CHECK: %[[A_DECL:.*]]:2 = hlfir.declare %[[A_ADDR]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFomp_parallel_multiple_firstprivate_doEa"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)186! CHECK: %[[B_DECL:.*]]:2 = hlfir.declare %[[B_ADDR]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFomp_parallel_multiple_firstprivate_doEb"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)187! CHECK: omp.parallel private(@{{.*firstprivate.*}} %{{.*}}#0 -> %[[A_PRIV_ADDR:.*]], @{{.*firstprivate.*}} %{{.*}}#0 -> %[[B_PRIV_ADDR:.*]] : {{.*}}) {188 189! CHECK: %[[A_PRIV_DECL:.*]]:2 = hlfir.declare %[[A_PRIV_ADDR]] {uniq_name = "_QFomp_parallel_multiple_firstprivate_doEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)190 191! CHECK: %[[B_PRIV_DECL:.*]]:2 = hlfir.declare %[[B_PRIV_ADDR]] {uniq_name = "_QFomp_parallel_multiple_firstprivate_doEb"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)192 193 194! CHECK: %[[VAL_8:.*]] = arith.constant 1 : i32195! CHECK: %[[VAL_9:.*]] = arith.constant 10 : i32196! CHECK: %[[VAL_10:.*]] = arith.constant 1 : i32197! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[I_PRIV_ADDR:.*]] : !fir.ref<i32>) {198! CHECK-NEXT: omp.loop_nest (%[[I:.*]]) : i32 = (%[[VAL_8]]) to (%[[VAL_9]]) inclusive step (%[[VAL_10]]) {199! CHECK: %[[I_PRIV_DECL:.*]]:2 = hlfir.declare %[[I_PRIV_ADDR]] {uniq_name = "_QFomp_parallel_multiple_firstprivate_doEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)200! CHECK: hlfir.assign %[[I]] to %[[I_PRIV_DECL]]#0 : i32, !fir.ref<i32>201! CHECK: fir.call @_QPbar(%[[I_PRIV_DECL]]#0, %[[A_PRIV_DECL]]#0) {{.*}}: (!fir.ref<i32>, !fir.ref<i32>) -> ()202! CHECK: omp.yield203! CHECK: }204! CHECK: }205! CHECK: omp.terminator206! CHECK: }207! CHECK: return208! CHECK: }209 210!===============================================================================211! Checking for the following construct212! !$omp parallel213! !$omp do private(...) firstprivate(...)214!===============================================================================215 216subroutine parallel_do_private(cond,nt)217logical :: cond218 integer :: nt219 integer :: i220 !$OMP PARALLEL221 !$OMP DO PRIVATE(cond) FIRSTPRIVATE(nt)222 do i=1, 9223 call foo(i, cond, nt)224 end do225 !$OMP END DO226 !$OMP END PARALLEL227end subroutine parallel_do_private228 229! CHECK-LABEL: func.func @_QPparallel_do_private(230! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "cond"},231! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "nt"}) {232! CHECK: %[[NT_DECL:.*]]:2 = hlfir.declare %[[VAL_1]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFparallel_do_privateEnt"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)233! CHECK: omp.parallel {234! CHECK: %[[VAL_7:.*]] = arith.constant 1 : i32235! CHECK: %[[VAL_8:.*]] = arith.constant 9 : i32236! CHECK: %[[VAL_9:.*]] = arith.constant 1 : i32237! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[COND_PRIV_ADDR:.*]], @{{.*}} %{{.*}}#0 -> %[[NT_PRIV_ADDR:.*]], @{{.*}} %3#0 -> %[[I_PRIV_ADDR:.*]] : !fir.ref<!fir.logical<4>>, !fir.ref<i32>, !fir.ref<i32>) {238! CHECK-NEXT: omp.loop_nest (%[[I:.*]]) : i32 = (%[[VAL_7]]) to (%[[VAL_8]]) inclusive step (%[[VAL_9]]) {239! CHECK: %[[COND_PRIV_DECL:.*]]:2 = hlfir.declare %[[COND_PRIV_ADDR]] {uniq_name = "_QFparallel_do_privateEcond"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)240! CHECK: %[[NT_PRIV_DECL:.*]]:2 = hlfir.declare %[[NT_PRIV_ADDR]] {uniq_name = "_QFparallel_do_privateEnt"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)241! CHECK: %[[I_PRIV_DECL:.*]]:2 = hlfir.declare %[[I_PRIV_ADDR]] {uniq_name = "_QFparallel_do_privateEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)242 243! CHECK: hlfir.assign %[[I]] to %[[I_PRIV_DECL]]#0 : i32, !fir.ref<i32>244! CHECK: fir.call @_QPfoo(%[[I_PRIV_DECL]]#0, %[[COND_PRIV_DECL]]#0, %[[NT_PRIV_DECL]]#0) {{.*}}: (!fir.ref<i32>, !fir.ref<!fir.logical<4>>, !fir.ref<i32>) -> ()245! CHECK: omp.yield246! CHECK: }247! CHECK: }248! CHECK: omp.terminator249! CHECK: }250! CHECK: return251! CHECK: }252 253!===============================================================================254! Checking for the following construct255! !$omp parallel256! !$omp do firstprivate(...) firstprivate(...)257!===============================================================================258 259subroutine omp_parallel_do_multiple_firstprivate(a, b)260 integer::a, b261 !$OMP PARALLEL262 !$OMP DO FIRSTPRIVATE(a) FIRSTPRIVATE(b)263 do i=1, 10264 call bar(i, a)265 end do266 !$OMP END DO267 !$OMP END PARALLEL268end subroutine omp_parallel_do_multiple_firstprivate269 270! CHECK-LABEL: func.func @_QPomp_parallel_do_multiple_firstprivate(271! CHECK-SAME: %[[A_ADDR:.*]]: !fir.ref<i32> {fir.bindc_name = "a"},272! CHECK-SAME: %[[B_ADDR:.*]]: !fir.ref<i32> {fir.bindc_name = "b"}) {273! CHECK: %[[A_DECL:.*]]:2 = hlfir.declare %[[A_ADDR]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFomp_parallel_do_multiple_firstprivateEa"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)274! CHECK: %[[B_DECL:.*]]:2 = hlfir.declare %[[B_ADDR]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFomp_parallel_do_multiple_firstprivateEb"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>275! CHECK: omp.parallel {276! CHECK: %[[VAL_8:.*]] = arith.constant 1 : i32277! CHECK: %[[VAL_9:.*]] = arith.constant 10 : i32278! CHECK: %[[VAL_10:.*]] = arith.constant 1 : i32279! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[A_PRIV_ADDR:.*]], @{{.*}} %{{.}}#0 -> %[[B_PRIV_ADDR:.*]], @{{.*}} %{{.}}#0 -> %[[I_PRIV_ADDR:.*]] : !fir.ref<i32>, !fir.ref<i32>, !fir.ref<i32>) {280! CHECK-NEXT: omp.loop_nest (%[[I:.*]]) : i32 = (%[[VAL_8]]) to (%[[VAL_9]]) inclusive step (%[[VAL_10]]) {281! CHECK: %[[A_PRIV_DECL:.*]]:2 = hlfir.declare %[[A_PRIV_ADDR]] {uniq_name = "_QFomp_parallel_do_multiple_firstprivateEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)282! CHECK: %[[B_PRIV_DECL:.*]]:2 = hlfir.declare %[[B_PRIV_ADDR]] {uniq_name = "_QFomp_parallel_do_multiple_firstprivateEb"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)283! CHECK: %[[I_PRIV_DECL:.*]]:2 = hlfir.declare %[[I_PRIV_ADDR]] {uniq_name = "_QFomp_parallel_do_multiple_firstprivateEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)284 285! CHECK: hlfir.assign %[[I]] to %[[I_PRIV_DECL]]#0 : i32, !fir.ref<i32>286! CHECK: fir.call @_QPbar(%[[I_PRIV_DECL]]#0, %[[A_PRIV_DECL]]#0) {{.*}}: (!fir.ref<i32>, !fir.ref<i32>) -> ()287! CHECK: omp.yield288! CHECK: }289! CHECK: }290! CHECK: omp.terminator291! CHECK: }292! CHECK: return293! CHECK: }294