brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.5 KiB · 5a9be40 Raw
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