263 lines · plain
1! This test checks lowering of `LASTPRIVATE` clause for scalar types.2 3! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s4! RUN: %flang_fc1 -fopenmp -emit-hlfir %s -o - | FileCheck %s5 6!CHECK: func @_QPlastprivate_character(%[[ARG1:.*]]: !fir.boxchar<1>{{.*}}) {7!CHECK-DAG: %[[ARG1_UNBOX:.*]]:2 = fir.unboxchar8!CHECK-DAG: %[[FIVE:.*]] = arith.constant 5 : index9!CHECK-DAG: %[[ARG1_REF:.*]] = fir.convert %[[ARG1_UNBOX]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1,5>>10!CHECK-DAG: %[[ARG1_DECL:.*]]:2 = hlfir.declare %[[ARG1_REF]] typeparams %[[FIVE]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFlastprivate_characterEarg1"} : (!fir.ref<!fir.char<1,5>>, index, !fir.dscope) -> (!fir.ref<!fir.char<1,5>>, !fir.ref<!fir.char<1,5>>)11 12!CHECK: omp.parallel {13 14! Check that we are accessing the clone inside the loop15!CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[ARG1_PVT:.*]], @{{.*}} %{{.*}}#0 -> %{{.*}} : !fir.ref<!fir.char<1,5>>, !{{.*}}) {16!CHECK-NEXT: omp.loop_nest (%[[INDX_WS:.*]]) : {{.*}} {17!CHECK: %[[FIVE:.*]] = arith.constant 5 : index18!CHECK: %[[ARG1_PVT_DECL:.*]]:2 = hlfir.declare %[[ARG1_PVT]] typeparams %[[FIVE]] {uniq_name = "_QFlastprivate_characterEarg1"} : (!fir.ref<!fir.char<1,5>>, index) -> (!fir.ref<!fir.char<1,5>>, !fir.ref<!fir.char<1,5>>)19!CHECK: %[[UNIT:.*]] = arith.constant 6 : i3220!CHECK-NEXT: %[[ADDR:.*]] = fir.address_of(@_QQclX21!CHECK-NEXT: %[[CVT0:.*]] = fir.convert %[[ADDR]] 22!CHECK-NEXT: %[[CNST:.*]] = arith.constant23!CHECK-NEXT: %[[CALL_BEGIN_IO:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[UNIT]], %[[CVT0]], %[[CNST]]) {{.*}}: (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>24!CHECK-NEXT: %[[CVT_0_1:.*]] = fir.convert %[[ARG1_PVT_DECL]]#0 25!CHECK-NEXT: %[[CVT_0_2:.*]] = fir.convert %[[FIVE]]26!CHECK-NEXT: %[[CALL_OP_ASCII:.*]] = fir.call @_FortranAioOutputAscii(%[[CALL_BEGIN_IO]], %[[CVT_0_1]], %[[CVT_0_2]])27!CHECK-NEXT: %[[CALL_END_IO:.*]] = fir.call @_FortranAioEndIoStatement(%[[CALL_BEGIN_IO]])28 29! Testing last iteration check30!CHECK: %[[V:.*]] = arith.addi %[[INDX_WS]], %{{.*}} : i3231!CHECK: %[[C0:.*]] = arith.constant 0 : i3232!CHECK: %[[T1:.*]] = arith.cmpi slt, %{{.*}}, %[[C0]] : i3233!CHECK: %[[T2:.*]] = arith.cmpi slt, %[[V]], %{{.*}} : i3234!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i3235!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i136!CHECK: fir.if %[[IV_CMP]] {37!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>38 39! Testing lastprivate val update40!CHECK: hlfir.assign %[[ARG1_PVT_DECL]]#0 to %[[ARG1_DECL]]#0 : !fir.ref<!fir.char<1,5>>, !fir.ref<!fir.char<1,5>>41!CHECK: }42!CHECK: omp.yield43!CHECK: }44!CHECK: }45 46subroutine lastprivate_character(arg1)47 character(5) :: arg148!$OMP PARALLEL 49!$OMP DO LASTPRIVATE(arg1)50do n = 1, 551 arg1(n:n) = 'c'52 print *, arg153end do54!$OMP END DO55!$OMP END PARALLEL56end subroutine57 58!CHECK: func @_QPlastprivate_int(%[[ARG1:.*]]: !fir.ref<i32> {fir.bindc_name = "arg1"}) {59!CHECK: %[[ARG1_DECL:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFlastprivate_intEarg1"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)60!CHECK-DAG: omp.parallel {61!CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[CLONE:.*]], @{{.*}} %{{.*}}#0 -> %{{.*}} : !fir.ref<i32>, !{{.*}}) {62!CHECK-NEXT: omp.loop_nest (%[[INDX_WS:.*]]) : {{.*}} {63!CHECK: %[[CLONE_DECL:.*]]:2 = hlfir.declare %[[CLONE]] {uniq_name = "_QFlastprivate_intEarg1"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)64 65! Testing last iteration check66!CHECK: %[[V:.*]] = arith.addi %[[INDX_WS]], %{{.*}} : i3267!CHECK: %[[C0:.*]] = arith.constant 0 : i3268!CHECK: %[[T1:.*]] = arith.cmpi slt, %{{.*}}, %[[C0]] : i3269!CHECK: %[[T2:.*]] = arith.cmpi slt, %[[V]], %{{.*}} : i3270!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i3271!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i172!CHECK: fir.if %[[IV_CMP]] {73!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>74 75! Testing lastprivate val update76!CHECK-NEXT: %[[CLONE_LD:.*]] = fir.load %[[CLONE_DECL]]#0 : !fir.ref<i32>77!CHECK: hlfir.assign %[[CLONE_LD]] to %[[ARG1_DECL]]#0 : i32, !fir.ref<i32>78!CHECK: }79!CHECK: omp.yield80!CHECK: }81!CHECK: }82 83subroutine lastprivate_int(arg1)84 integer :: arg185!$OMP PARALLEL 86!$OMP DO LASTPRIVATE(arg1)87do n = 1, 588 arg1 = 289 print *, arg190end do91!$OMP END DO92!$OMP END PARALLEL93print *, arg194end subroutine95 96!CHECK: func.func @_QPmult_lastprivate_int(%[[ARG1:.*]]: !fir.ref<i32> {fir.bindc_name = "arg1"}, %[[ARG2:.*]]: !fir.ref<i32> {fir.bindc_name = "arg2"}) {97!CHECK: %[[ARG1_DECL:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFmult_lastprivate_intEarg1"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)98!CHECK: %[[ARG2_DECL:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFmult_lastprivate_intEarg2"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)99!CHECK: omp.parallel {100!CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[CLONE1:.*]], @{{.*}} %{{.*}}#0 -> %[[CLONE2:.*]], @{{.*}} %{{.*}}#0 -> %{{.*}} : !fir.ref<i32>, !fir.ref<i32>, !{{.*}}) {101!CHECK-NEXT: omp.loop_nest (%[[INDX_WS:.*]]) : {{.*}} {102!CHECK-DAG: %[[CLONE1_DECL:.*]]:2 = hlfir.declare %[[CLONE1]] {uniq_name = "_QFmult_lastprivate_intEarg1"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)103!CHECK-DAG: %[[CLONE2_DECL:.*]]:2 = hlfir.declare %[[CLONE2]] {uniq_name = "_QFmult_lastprivate_intEarg2"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)104 105! Testing last iteration check106!CHECK: %[[V:.*]] = arith.addi %[[INDX_WS]], %{{.*}} : i32107!CHECK: %[[C0:.*]] = arith.constant 0 : i32108!CHECK: %[[T1:.*]] = arith.cmpi slt, %{{.*}}, %[[C0]] : i32109!CHECK: %[[T2:.*]] = arith.cmpi slt, %[[V]], %{{.*}} : i32110!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32111!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i1112!CHECK: fir.if %[[IV_CMP]] {113!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>114! Testing lastprivate val update115!CHECK-DAG: %[[CLONE_LD1:.*]] = fir.load %[[CLONE1_DECL]]#0 : !fir.ref<i32>116!CHECK-DAG: hlfir.assign %[[CLONE_LD1]] to %[[ARG1_DECL]]#0 : i32, !fir.ref<i32>117!CHECK-DAG: %[[CLONE_LD2:.*]] = fir.load %[[CLONE2_DECL]]#0 : !fir.ref<i32>118!CHECK-DAG: hlfir.assign %[[CLONE_LD2]] to %[[ARG2_DECL]]#0 : i32, !fir.ref<i32>119!CHECK: }120!CHECK: omp.yield121!CHECK: }122!CHECK: }123 124subroutine mult_lastprivate_int(arg1, arg2)125 integer :: arg1, arg2126!$OMP PARALLEL 127!$OMP DO LASTPRIVATE(arg1) LASTPRIVATE(arg2)128do n = 1, 5129 arg1 = 2130 arg2 = 3131 print *, arg1, arg2132end do133!$OMP END DO134!$OMP END PARALLEL135print *, arg1, arg2136end subroutine137 138!CHECK: func.func @_QPmult_lastprivate_int2(%[[ARG1:.*]]: !fir.ref<i32> {fir.bindc_name = "arg1"}, %[[ARG2:.*]]: !fir.ref<i32> {fir.bindc_name = "arg2"}) {139!CHECK: %[[ARG1_DECL:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFmult_lastprivate_int2Earg1"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)140!CHECK: %[[ARG2_DECL:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFmult_lastprivate_int2Earg2"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)141!CHECK: omp.parallel {142!CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[CLONE1:.*]], @{{.*}} %{{.*}}#0 -> %[[CLONE2:.*]], @{{.*}} %{{.*}}#0 -> %{{.*}} : !fir.ref<i32>, !fir.ref<i32>, !{{.*}}) {143!CHECK-NEXT: omp.loop_nest (%[[INDX_WS:.*]]) : {{.*}} {144!CHECK-DAG: %[[CLONE1_DECL:.*]]:2 = hlfir.declare %[[CLONE1]] {uniq_name = "_QFmult_lastprivate_int2Earg1"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)145!CHECK-DAG: %[[CLONE2_DECL:.*]]:2 = hlfir.declare %[[CLONE2]] {uniq_name = "_QFmult_lastprivate_int2Earg2"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)146 147!Testing last iteration check148!CHECK: %[[V:.*]] = arith.addi %[[INDX_WS]], %{{.*}} : i32149!CHECK: %[[C0:.*]] = arith.constant 0 : i32150!CHECK: %[[T1:.*]] = arith.cmpi slt, %{{.*}}, %[[C0]] : i32151!CHECK: %[[T2:.*]] = arith.cmpi slt, %[[V]], %{{.*}} : i32152!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32153!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i1154!CHECK: fir.if %[[IV_CMP]] {155!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>156!Testing lastprivate val update157!CHECK-DAG: %[[CLONE_LD2:.*]] = fir.load %[[CLONE2_DECL]]#0 : !fir.ref<i32>158!CHECK-DAG: hlfir.assign %[[CLONE_LD2]] to %[[ARG2_DECL]]#0 : i32, !fir.ref<i32>159!CHECK-DAG: %[[CLONE_LD1:.*]] = fir.load %[[CLONE1_DECL]]#0 : !fir.ref<i32>160!CHECK-DAG: hlfir.assign %[[CLONE_LD1]] to %[[ARG1_DECL]]#0 : i32, !fir.ref<i32>161!CHECK: }162!CHECK: omp.yield163!CHECK: }164!CHECK: }165 166subroutine mult_lastprivate_int2(arg1, arg2)167 integer :: arg1, arg2168!$OMP PARALLEL 169!$OMP DO LASTPRIVATE(arg1, arg2)170do n = 1, 5171 arg1 = 2172 arg2 = 3173 print *, arg1, arg2174end do175!$OMP END DO176!$OMP END PARALLEL177print *, arg1, arg2178end subroutine179 180!CHECK: func.func @_QPfirstpriv_lastpriv_int(%[[ARG1:.*]]: !fir.ref<i32> {fir.bindc_name = "arg1"}, %[[ARG2:.*]]: !fir.ref<i32> {fir.bindc_name = "arg2"}) {181!CHECK: %[[ARG1_DECL:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFfirstpriv_lastpriv_intEarg1"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)182!CHECK: %[[ARG2_DECL:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFfirstpriv_lastpriv_intEarg2"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)183!CHECK: omp.parallel {184! Firstprivate update185!CHECK-NOT: omp.barrier186!CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[CLONE1:.*]], @{{.*}} %{{.*}}#0 -> %[[CLONE2:.*]], @{{.*}} %{{.*}}#0 -> %{{.*}} : !fir.ref<i32>, !fir.ref<i32>, !{{.*}}) {187!CHECK-NEXT: omp.loop_nest (%[[INDX_WS:.*]]) : {{.*}} {188!CHECK: %[[CLONE1_DECL:.*]]:2 = hlfir.declare %[[CLONE1]] {uniq_name = "_QFfirstpriv_lastpriv_intEarg1"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)189!CHECK: %[[CLONE2_DECL:.*]]:2 = hlfir.declare %[[CLONE2]] {uniq_name = "_QFfirstpriv_lastpriv_intEarg2"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)190 191! Testing last iteration check192!CHECK: %[[V:.*]] = arith.addi %[[INDX_WS]], %{{.*}} : i32193!CHECK: %[[C0:.*]] = arith.constant 0 : i32194!CHECK: %[[T1:.*]] = arith.cmpi slt, %{{.*}}, %[[C0]] : i32195!CHECK: %[[T2:.*]] = arith.cmpi slt, %[[V]], %{{.*}} : i32196!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32197!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i1198!CHECK: fir.if %[[IV_CMP]] {199!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>200! Testing lastprivate val update201!CHECK-NEXT: %[[CLONE_LD:.*]] = fir.load %[[CLONE2_DECL]]#0 : !fir.ref<i32>202!CHECK-NEXT: hlfir.assign %[[CLONE_LD]] to %[[ARG2_DECL]]#0 : i32, !fir.ref<i32>203!CHECK-NEXT: }204!CHECK-NEXT: omp.yield205!CHECK-NEXT: }206!CHECK-NEXT: }207 208subroutine firstpriv_lastpriv_int(arg1, arg2)209 integer :: arg1, arg2210!$OMP PARALLEL 211!$OMP DO FIRSTPRIVATE(arg1) LASTPRIVATE(arg2)212do n = 1, 5213 arg1 = 2214 arg2 = 3215 print *, arg1, arg2216end do217!$OMP END DO218!$OMP END PARALLEL219print *, arg1, arg2220end subroutine221 222!CHECK: func.func @_QPfirstpriv_lastpriv_int2(%[[ARG1:.*]]: !fir.ref<i32> {fir.bindc_name = "arg1"}) {223!CHECK: %[[ARG1_DECL:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFfirstpriv_lastpriv_int2Earg1"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)224!CHECK: omp.parallel {225 226! Firstprivate update227 228 229!CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[CLONE1:.*]], @{{.*}} %{{.*}}#0 -> %[[IV:.*]] : !fir.ref<i32>, !fir.ref<i32>) private_barrier {230!CHECK-NEXT: omp.loop_nest (%[[INDX_WS:.*]]) : {{.*}} {231!CHECK: %[[CLONE1_DECL:.*]]:2 = hlfir.declare %[[CLONE1]] {uniq_name = "_QFfirstpriv_lastpriv_int2Earg1"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)232 233!CHECK-NEXT: hlfir.declare %[[IV]]234! Testing last iteration check235!CHECK: %[[V:.*]] = arith.addi %[[INDX_WS]], %{{.*}} : i32236!CHECK: %[[C0:.*]] = arith.constant 0 : i32237!CHECK: %[[T1:.*]] = arith.cmpi slt, %{{.*}}, %[[C0]] : i32238!CHECK: %[[T2:.*]] = arith.cmpi slt, %[[V]], %{{.*}} : i32239!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32240!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i1241!CHECK: fir.if %[[IV_CMP]] {242!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>243! Testing lastprivate val update244!CHECK-NEXT: %[[CLONE_LD:.*]] = fir.load %[[CLONE1_DECL]]#0 : !fir.ref<i32>245!CHECK-NEXT: hlfir.assign %[[CLONE_LD]] to %[[ARG1_DECL]]#0 : i32, !fir.ref<i32>246!CHECK-NEXT: }247!CHECK-NEXT: omp.yield248!CHECK-NEXT: }249!CHECK-NEXT: }250 251subroutine firstpriv_lastpriv_int2(arg1)252 integer :: arg1253!$OMP PARALLEL 254!$OMP DO FIRSTPRIVATE(arg1) LASTPRIVATE(arg1)255do n = 1, 5256 arg1 = 2257 print *, arg1258end do259!$OMP END DO260!$OMP END PARALLEL261print *, arg1262end subroutine263