121 lines · plain
1! RUN: bbc -emit-hlfir -fopenmp %s -o - | FileCheck %s2! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s3 4! --- Check that with shared(i) the variable outside the parallel section5! --- is updated. 6! CHECK-LABEL: func.func @_QPomploop()7! CHECK: %[[ALLOC_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFomploopEi"}8! CHECK: %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOC_I]] {uniq_name = "_QFomploopEi"} :9! CHECK: omp.parallel {10! CHECK: omp.sections {11! CHECK: omp.section {12! CHECK: %[[RES:.*]] = fir.do_loop %[[ARG0:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[ARG1:.*]] = 13! CHECK: fir.store %[[ARG1]] to %[[DECL_I]]#014! CHECK: hlfir.assign15! CHECK: %[[LOAD_I:.*]] = fir.load %[[DECL_I]]#016! CHECK: %[[RES_I:.*]] = arith.addi %[[LOAD_I]], %{{.*}}17! CHECK: fir.result %[[RES_I]]18! CHECK: }19! CHECK: fir.store %[[RES]] to %[[DECL_I]]#020! CHECK: omp.terminator21! CHECK: }22! CHECK: omp.terminator23! CHECK: }24! CHECK: return25! CHECK: }26subroutine omploop27 implicit none28 integer :: i, j29 i = 130 j = 031 !$omp parallel shared(i)32 !$omp sections33 do i=1,1034 j = j + i35 end do36 !$omp end sections37 !$omp end parallel38end subroutine39 40! --- Check that with default(shared) the variable outside the parallel section41! --- is NOT updated (i is private to the omp.parallel code)42! CHECK-LABEL: func.func @_QPomploop2()43! CHECK: %[[ALLOC_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFomploop2Ei"}44! CHECK: %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOC_I]] {uniq_name = "_QFomploop2Ei"} :45! CHECK: omp.parallel {46! CHECK: %[[ALLOC_PRIV_I:.*]] = fir.alloca i32 {bindc_name = "i", pinned}47! CHECK: %[[DECL_PRIV_I:.*]]:2 = hlfir.declare %[[ALLOC_PRIV_I]]48! CHECK: omp.sections {49! CHECK: omp.section {50! CHECK: %[[RES:.*]] = fir.do_loop %[[ARG0:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[ARG1:.*]] = 51! CHECK-NOT: fir.store %[[ARG1]] to %[[DECL_I]]#152! CHECK: fir.store %[[ARG1]] to %[[DECL_PRIV_I]]#053! CHECK: hlfir.assign54! CHECK: %[[LOAD_I:.*]] = fir.load %[[DECL_PRIV_I]]#055! CHECK: %[[RES_I:.*]] = arith.addi %[[LOAD_I]], %{{.*}}56! CHECK: fir.result %[[RES_I]]57! CHECK: }58! CHECK: fir.store %[[RES]] to %[[DECL_PRIV_I]]#059! CHECK: omp.terminator60! CHECK: }61! CHECK: omp.terminator62! CHECK: }63! CHECK: return64! CHECK: }65subroutine omploop266 implicit none67 integer :: i, j68 i = 169 j = 070 !$omp parallel default(shared)71 !$omp sections72 do i=1,1073 j = j + i74 end do75 !$omp end sections76 !$omp end parallel77end subroutine78 79 80! --- Check that with no data-sharing the variable outside the parallel section81! --- is NOT updated (i is private to the omp.parallel code)82! CHECK-LABEL: func.func @_QPomploop3()83! CHECK: %[[ALLOC_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFomploop3Ei"}84! CHECK: %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOC_I]] {uniq_name = "_QFomploop3Ei"} :85! CHECK: omp.parallel {86! CHECK: %[[ALLOC_PRIV_I:.*]] = fir.alloca i32 {bindc_name = "i", pinned}87! CHECK: %[[DECL_PRIV_I:.*]]:2 = hlfir.declare %[[ALLOC_PRIV_I]]88! CHECK: omp.sections {89! CHECK: omp.section {90! CHECK: %[[RES:.*]] = fir.do_loop %[[ARG0:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[ARG1:.*]] = 91! CHECK-NOT: fir.store %[[ARG1]] to %[[DECL_I]]#192! CHECK: fir.store %[[ARG1]] to %[[DECL_PRIV_I]]#093! CHECK: hlfir.assign94! CHECK: %[[LOAD_I:.*]] = fir.load %[[DECL_PRIV_I]]#095! CHECK: %[[RES_I:.*]] = arith.addi %[[LOAD_I]], %{{.*}}96! CHECK: fir.result %[[RES_I]]97! CHECK: }98! CHECK: fir.store %[[RES]] to %[[DECL_PRIV_I]]#099! CHECK: omp.terminator100! CHECK: }101! CHECK: omp.terminator102! CHECK: }103! CHECK: return104! CHECK: }105subroutine omploop3106 implicit none107 integer :: i, j108 i = 1109 j = 0110 !$omp parallel111 !$omp sections112 do i=1,10113 j = j + i114 end do115 !$omp end sections116 !$omp end parallel117end subroutine118 119 120 121