brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · 114ea6c Raw
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