131 lines · plain
1! Test LASTPRIVATE with iteration variable.2! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s3! RUN: %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck --check-prefix=CHECK-FIR %s4 5!CHECK-LABEL: func @_QPlastprivate_iv_inc6 7!CHECK: %[[I2_MEM:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFlastprivate_iv_incEi"}8!CHECK: %[[I2:.*]]:2 = hlfir.declare %[[I2_MEM]] {uniq_name = "_QFlastprivate_iv_incEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)9 10!CHECK: %[[LB:.*]] = arith.constant 4 : i3211!CHECK: %[[UB:.*]] = arith.constant 10 : i3212!CHECK: %[[STEP:.*]] = arith.constant 3 : i3213!CHECK: omp.wsloop private(@{{.*}} %{{.*}} -> %[[I_MEM:.*]] : !fir.ref<i32>) {14!CHECK-NEXT: omp.loop_nest (%[[IV:.*]]) : i32 = (%[[LB]]) to (%[[UB]]) inclusive step (%[[STEP]]) {15!CHECK: %[[I:.*]]:2 = hlfir.declare %[[I_MEM]] {uniq_name = "_QFlastprivate_iv_incEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)16!CHECK: hlfir.assign %[[IV]] to %[[I]]#0 : i32, !fir.ref<i32>17!CHECK: %[[UB_2:.*]] = arith.constant 10 : i3218!CHECK: %[[STEP_2:.*]] = arith.constant 3 : i3219!CHECK: %[[V:.*]] = arith.addi %[[IV]], %[[STEP_2]] : i3220!CHECK: %[[C0:.*]] = arith.constant 0 : i3221!CHECK: %[[STEP_NEG:.*]] = arith.cmpi slt, %[[STEP_2]], %[[C0]] : i3222!CHECK: %[[V_LT:.*]] = arith.cmpi slt, %[[V]], %[[UB_2]] : i3223!CHECK: %[[V_GT:.*]] = arith.cmpi sgt, %[[V]], %[[UB_2]] : i3224!CHECK: %[[CMP:.*]] = arith.select %[[STEP_NEG]], %[[V_LT]], %[[V_GT]] : i125!CHECK: fir.if %[[CMP]] {26!CHECK: hlfir.assign %[[V]] to %[[I]]#0 : i32, !fir.ref<i32>27!CHECK: %[[I_VAL:.*]] = fir.load %[[I]]#0 : !fir.ref<i32>28!CHECK: hlfir.assign %[[I_VAL]] to %[[I2]]#0 : i32, !fir.ref<i32>29!CHECK: }30!CHECK: omp.yield31!CHECK: }32!CHECK: }33subroutine lastprivate_iv_inc()34 integer :: i35 36 !$omp do lastprivate(i)37 do i = 4, 10, 338 end do39 !$omp end do40end subroutine41 42!CHECK-LABEL: func @_QPlastprivate_iv_dec43 44!CHECK: %[[I2_MEM:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFlastprivate_iv_decEi"}45!CHECK: %[[I2:.*]]:2 = hlfir.declare %[[I2_MEM]] {uniq_name = "_QFlastprivate_iv_decEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)46!CHECK: %[[LB:.*]] = arith.constant 10 : i3247!CHECK: %[[UB:.*]] = arith.constant 1 : i3248!CHECK: %[[STEP:.*]] = arith.constant -3 : i3249!CHECK: omp.wsloop private(@{{.*}} %{{.*}} -> %[[I_MEM:.*]] : !fir.ref<i32>) {50!CHECK-NEXT: omp.loop_nest (%[[IV:.*]]) : i32 = (%[[LB]]) to (%[[UB]]) inclusive step (%[[STEP]]) {51!CHECK: %[[I:.*]]:2 = hlfir.declare %[[I_MEM]] {uniq_name = "_QFlastprivate_iv_decEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)52!CHECK: hlfir.assign %[[IV]] to %[[I]]#0 : i32, !fir.ref<i32>53!CHECK: %[[UB_2:.*]] = arith.constant 1 : i3254!CHECK: %[[STEP_2:.*]] = arith.constant -3 : i3255!CHECK: %[[V:.*]] = arith.addi %[[IV]], %[[STEP_2]] : i3256!CHECK: %[[C0:.*]] = arith.constant 0 : i3257!CHECK: %[[STEP_NEG:.*]] = arith.cmpi slt, %[[STEP_2]], %[[C0]] : i3258!CHECK: %[[V_LT:.*]] = arith.cmpi slt, %[[V]], %[[UB_2]] : i3259!CHECK: %[[V_GT:.*]] = arith.cmpi sgt, %[[V]], %[[UB_2]] : i3260!CHECK: %[[CMP:.*]] = arith.select %[[STEP_NEG]], %[[V_LT]], %[[V_GT]] : i161!CHECK: fir.if %[[CMP]] {62!CHECK: hlfir.assign %[[V]] to %[[I]]#0 : i32, !fir.ref<i32>63!CHECK: %[[I_VAL:.*]] = fir.load %[[I]]#0 : !fir.ref<i32>64!CHECK: hlfir.assign %[[I_VAL]] to %[[I2]]#0 : i32, !fir.ref<i32>65!CHECK: }66!CHECK: omp.yield67!CHECK: }68!CHECK: }69subroutine lastprivate_iv_dec()70 integer :: i71 72 !$omp do lastprivate(i)73 do i = 10, 1, -374 end do75 !$omp end do76end subroutine77 78 79!CHECK-LABEL: @_QPlastprivate_iv_i180subroutine lastprivate_iv_i181 integer*1 :: i182 i1=083!CHECK: omp.wsloop private({{.*}})84!CHECK: omp.loop_nest85!CHECK: fir.if %{{.*}} {86!CHECK: hlfir.assign %{{.*}} to %[[IV:.*]]#0 : i32, !fir.ref<i8>87!CHECK: %[[IV_VAL:.*]] = fir.load %[[IV]]#0 : !fir.ref<i8>88!CHECK: hlfir.assign %[[IV_VAL]] to %{{.*}}#0 : i8, !fir.ref<i8>89!CHECK: }90 91 92 !$omp do lastprivate(i1)93 do i1=1,894 enddo95!$omp end do96end subroutine97 98!CHECK: omp.wsloop private(@_QFlastprivate_iv_pointerEi_private_box_ptr_i32 %{{.*}}#0 -> %[[PRIVATE_IV:.*]] : !fir.ref<!fir.box<!fir.ptr<i32>>>) {99!CHECK: omp.loop_nest (%[[LOOP_INDEX:.*]]) : i64 100!CHECK: %[[PRIVATE_IV_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_IV]] {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFlastprivate_iv_pointerEi"} : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> (!fir.ref<!fir.box<!fir.ptr<i32>>>, !fir.ref<!fir.box<!fir.ptr<i32>>>)101!CHECK: %[[LOOP_INDEX_INCR:.*]] = arith.addi %[[LOOP_INDEX]], %{{.*}} : i64102!CHECK: fir.if %{{.*}} {103!CHECK: %[[PRIVATE_IV_BOX:.*]] = fir.load %[[PRIVATE_IV_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>104!CHECK: %[[PRIVATE_IV_ADDR:.*]] = fir.box_addr %[[PRIVATE_IV_BOX]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>105!CHECK: hlfir.assign %[[LOOP_INDEX_INCR]] to %[[PRIVATE_IV_ADDR]] : i64, !fir.ptr<i32>106!CHECK: }107!CHECK: omp.yield108!CHECK: }109!CHECK: }110 111!CHECK-FIR: omp.wsloop private(@_QFlastprivate_iv_pointerEi_private_box_ptr_i32 %{{.*}} -> %[[PRIVATE_IV:.*]] : !fir.ref<!fir.box<!fir.ptr<i32>>>) {112!CHECK-FIR: omp.loop_nest (%[[LOOP_INDEX:.*]]) : i64113!CHECK-FIR: %[[PRIVATE_IV_DECL:.*]] = fir.declare %[[PRIVATE_IV]] {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFlastprivate_iv_pointerEi"} : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<!fir.ptr<i32>>>114!CHECK-FIR: %[[LOOP_INDEX_INCR:.*]] = arith.addi %[[LOOP_INDEX]], %{{.*}} : i64115!CHECK-FIR: fir.if %{{.*}} {116!CHECK-FIR: %[[PRIVATE_IV_BOX:.*]] = fir.load %[[PRIVATE_IV_DECL]] : !fir.ref<!fir.box<!fir.ptr<i32>>>117!CHECK-FIR: %[[PRIVATE_IV_ADDR:.*]] = fir.box_addr %[[PRIVATE_IV_BOX]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>118!CHECK-FIR: %[[LOOP_INDEX_CVT:.*]] = fir.convert %[[LOOP_INDEX_INCR]] : (i64) -> i32119!CHECK-FIR: fir.store %[[LOOP_INDEX_CVT]] to %[[PRIVATE_IV_ADDR]] : !fir.ptr<i32>120!CHECK-FIR: }121!CHECK-FIR: omp.yield122!CHECK-FIR: }123subroutine lastprivate_iv_pointer()124 integer, pointer :: i125 126 !$omp do lastprivate(i)127 do i = 1, 20128 end do129 !$omp end do130end subroutine131