70 lines · plain
1! RUN: %flang_fc1 -emit-hlfir -o - -fopenmp %s | FileCheck %s2! RUN: bbc -emit-hlfir -o - -fopenmp %s | FileCheck %s3 4! CHECK-LABEL: func.func @_QQmain()5! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.box<!fir.heap<i32>> {bindc_name = "a", uniq_name = "_QFEa"}6! CHECK: %[[VAL_1:.*]] = fir.zero_bits !fir.heap<i32>7! CHECK: %[[VAL_2:.*]] = fir.embox %[[VAL_1]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>8! CHECK: fir.store %[[VAL_2]] to %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<i32>>>9! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]] {fortran_attrs = {{.*}}<allocatable>, uniq_name = "_QFEa"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)10! CHECK: omp.parallel {11! CHECK: omp.wsloop private(@{{.*}} %{{.*}} -> %{{.*}}, @{{.*}} %{{.*}} -> %[[VAL_17:.*]] : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<i32>) private_barrier {12! CHECK: omp.loop_nest13! CHECK: %[[VAL_16:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = {{.*}}<allocatable>, uniq_name = "_QFEa"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)14! CHECK: %[[VAL_18:.*]]:2 = hlfir.declare %[[VAL_17]] {uniq_name = "_QFEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)15 16! [...]17! if this is the last iteration18! CHECK: fir.if %{{.*}} {19! store loop IV20! CHECK: hlfir.assign %{{.*}} to %[[VAL_18]]#0 : i32, !fir.ref<i32>21! assign private variable to original copy: realloc22! CHECK: %[[VAL_23:.*]] = fir.load %[[VAL_16]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>23! CHECK: %[[VAL_24:.*]] = fir.box_addr %[[VAL_23]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>24! CHECK: %[[VAL_25:.*]] = fir.load %[[VAL_24]] : !fir.heap<i32>25! CHECK: hlfir.assign %[[VAL_25]] to %[[VAL_3]]#0 realloc : i32, !fir.ref<!fir.box<!fir.heap<i32>>>26! CHECK-NEXT: }27! CHECK-NEXT: omp.yield28! CHECK-NEXT: }29program lastprivate_allocatable30 integer, allocatable :: a31 integer :: i32 ! a is unallocated here33 !$omp parallel do lastprivate(a)34 do i=1,135 a = 4236 enddo37 !$omp end parallel do38 ! a should be allocated here39end program40 41! CHECK-LABEL: func @_QPlastprivate_realloc()42! CHECK: %[[A:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFlastprivate_reallocEa"} :43! CHECK-SAME: (!fir.ref<!fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>>) ->44! CHECK-SAME: (!fir.ref<!fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>>)45! CHECK: omp.parallel {46! CHECK: %[[A_PRIV:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFlastprivate_reallocEa"} :47! CHECK-SAME: (!fir.ref<!fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>>) ->48! CHECK-SAME: (!fir.ref<!fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>>)49! CHECK: omp.sections {50! CHECK: omp.section {51! CHECK: fir.load52! CHECK: %[[TEMP:.*]] = fir.load %[[A_PRIV:.*]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>>53! CHECK: hlfir.assign %[[TEMP]] to %[[A]]#0 realloc : !fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>,54! CHECK-SAME: !fir.ref<!fir.box<!fir.heap<!fir.array<?xcomplex<f32>>>>>55! CHECK: }56! CHECK: }57! CHECK: }58subroutine lastprivate_realloc()59 complex, allocatable :: a(:)60 61 allocate(a(2))62 !$omp parallel63 !$omp sections lastprivate(a)64 !$omp section65 deallocate(a)66 allocate(a(3))67 !$omp end sections68 !$omp end parallel69end subroutine70