363 lines · plain
1! Test unstructured code adjacent to and inside OpenMP constructs.2 3! RUN: bbc %s -fopenmp -emit-hlfir -o "-" \4! RUN: | FileCheck %s5 6! CHECK-LABEL: func @_QPss1{{.*}} {7! CHECK: br ^bb18! CHECK: ^bb1: // 2 preds: ^bb0, ^bb49! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb510! CHECK: ^bb2: // pred: ^bb111! CHECK: cond_br %{{[0-9]*}}, ^bb3, ^bb412! CHECK: ^bb4: // pred: ^bb213! CHECK: fir.call @_FortranAioBeginExternalListOutput14! CHECK: br ^bb115! CHECK: ^bb5: // 2 preds: ^bb1, ^bb316! CHECK: omp.master {17! CHECK: @_FortranAioBeginExternalListOutput18! CHECK: omp.terminator19! CHECK: }20! CHECK: @_FortranAioBeginExternalListOutput21! CHECK: }22subroutine ss1(n) ! unstructured code followed by a structured OpenMP construct23 do i = 1, 324 if (i .eq. n) exit25 print*, 'ss1-A', i26 enddo27 !$omp master28 print*, 'ss1-B', i29 !$omp end master30 print*31end32 33! CHECK-LABEL: func @_QPss2{{.*}} {34! CHECK: omp.master {35! CHECK: @_FortranAioBeginExternalListOutput36! CHECK: br ^bb137! CHECK: ^bb1: // 2 preds: ^bb0, ^bb438! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb539! CHECK: ^bb2: // pred: ^bb140! CHECK: cond_br %{{[0-9]*}}, ^bb3, ^bb441! CHECK: ^bb3: // pred: ^bb242! CHECK: @_FortranAioBeginExternalListOutput43! CHECK: br ^bb144! CHECK: ^bb5: // 2 preds: ^bb1, ^bb345! CHECK: omp.terminator46! CHECK: }47! CHECK: @_FortranAioBeginExternalListOutput48! CHECK: @_FortranAioBeginExternalListOutput49! CHECK: }50subroutine ss2(n) ! unstructured OpenMP construct; loop exit inside construct51 !$omp master52 print*, 'ss2-A', n53 do i = 1, 354 if (i .eq. n) exit55 print*, 'ss2-B', i56 enddo57 !$omp end master58 print*, 'ss2-C', i59 print*60end61 62! CHECK-LABEL: func @_QPss3{{.*}} {63! CHECK: omp.parallel private(@{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {64! CHECK: %[[ALLOCA_K:.*]] = fir.alloca i32 {bindc_name = "k", pinned}65! CHECK: %[[K_DECL:.*]]:2 = hlfir.declare %[[ALLOCA_K]] {uniq_name = "_QFss3Ek"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)66 67! CHECK: br ^bb168! CHECK: ^bb1: // 2 preds: ^bb0, ^bb369! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb470! CHECK: ^bb2: // pred: ^bb171 72! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[ALLOCA_2:.*]] : !fir.ref<i32>) {73! CHECK: omp.loop_nest (%[[ARG1:.*]]) : {{.*}} {74! CHECK: %[[OMP_LOOP_K_DECL:.*]]:2 = hlfir.declare %[[ALLOCA_2]] {uniq_name = "_QFss3Ek"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)75! CHECK: hlfir.assign %[[ARG1]] to %[[OMP_LOOP_K_DECL]]#0 : i32, !fir.ref<i32>76! CHECK: @_FortranAioBeginExternalListOutput77! CHECK: %[[LOAD_1:.*]] = fir.load %[[OMP_LOOP_K_DECL]]#0 : !fir.ref<i32>78! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[LOAD_1]])79! CHECK: omp.yield80! CHECK: }81! CHECK: }82 83! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[ALLOCA_1:.*]] : !fir.ref<i32>) {84! CHECK: omp.loop_nest (%[[ARG2:.*]]) : {{.*}} {85! CHECK: %[[OMP_LOOP_J_DECL:.*]]:2 = hlfir.declare %[[ALLOCA_1]] {uniq_name = "_QFss3Ej"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)86! CHECK: hlfir.assign %[[ARG2]] to %[[OMP_LOOP_J_DECL]]#0 : i32, !fir.ref<i32>87! CHECK: br ^bb188! CHECK: ^bb2: // 2 preds: ^bb1, ^bb589! CHECK: cond_br %{{[0-9]*}}, ^bb3, ^bb690! CHECK: ^bb3: // pred: ^bb291! CHECK: cond_br %{{[0-9]*}}, ^bb4, ^bb592! CHECK: ^bb4: // pred: ^bb393! CHECK: @_FortranAioBeginExternalListOutput94! CHECK: %[[LOAD_2:.*]] = fir.load %[[K_DECL]]#0 : !fir.ref<i32>95! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[LOAD_2]])96! CHECK: br ^bb297! CHECK: ^bb6: // 2 preds: ^bb2, ^bb498! CHECK: omp.yield99! CHECK: }100! CHECK: }101! CHECK: br ^bb1102! CHECK: ^bb4: // pred: ^bb1103! CHECK: omp.terminator104! CHECK: }105! CHECK: }106subroutine ss3(n) ! nested unstructured OpenMP constructs107 !$omp parallel108 do i = 1, 3109 !$omp do110 do k = 1, 3111 print*, 'ss3-A', k112 enddo113 !$omp end do114 !$omp do115 do j = 1, 3116 do k = 1, 3117 if (k .eq. n) exit118 print*, 'ss3-B', k119 enddo120 enddo121 !$omp end do122 enddo123 !$omp end parallel124end125 126! CHECK-LABEL: func @_QPss4{{.*}} {127! CHECK: omp.parallel private(@{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {128! CHECK: omp.wsloop private(@{{.*}} %{{.*}}#0 -> %[[ALLOCA:.*]] : !fir.ref<i32>) {129! CHECK-NEXT: omp.loop_nest (%[[ARG:.*]]) : {{.*}} {130! CHECK: %[[OMP_LOOP_J_DECL:.*]]:2 = hlfir.declare %[[ALLOCA]] {uniq_name = "_QFss4Ej"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)131! CHECK: hlfir.assign %[[ARG]] to %[[OMP_LOOP_J_DECL]]#0 : i32, !fir.ref<i32>132! CHECK: %[[COND:.*]] = arith.cmpi eq, %{{.*}}, %{{.*}}133! CHECK: %[[COND_XOR:.*]] = arith.xori %[[COND]], %{{.*}}134! CHECK: fir.if %[[COND_XOR]] {135! CHECK: @_FortranAioBeginExternalListOutput136! CHECK: %[[LOAD:.*]] = fir.load %[[OMP_LOOP_J_DECL]]#0 : !fir.ref<i32>137! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[LOAD]])138! CHECK: }139! CHECK-NEXT: omp.yield140! CHECK-NEXT: }141! CHECK-NEXT: }142! CHECK: omp.terminator143! CHECK-NEXT: }144subroutine ss4(n) ! CYCLE in OpenMP wsloop constructs145 !$omp parallel146 do i = 1, 3147 !$omp do148 do j = 1, 3149 if (j .eq. n) cycle150 print*, 'ss4', j151 enddo152 !$omp end do153 enddo154 !$omp end parallel155end156 157! CHECK-LABEL: func @_QPss5() {158! CHECK: omp.parallel private(@{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {159! CHECK: omp.wsloop private({{.*}}) {160! CHECK: omp.loop_nest {{.*}} {161! CHECK: br ^[[BB1:.*]]162! CHECK: ^[[BB1]]:163! CHECK: br ^[[BB2:.*]]164! CHECK: ^[[BB2]]:165! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]166! CHECK: ^[[BB3]]:167! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB3:.*]]168! CHECK: ^[[BB4]]:169! CHECK: br ^[[BB6]]170! CHECK: ^[[BB3]]:171! CHECK: br ^[[BB2]]172! CHECK: ^[[BB6]]:173! CHECK: omp.yield174! CHECK: }175! CHECK: }176! CHECK: omp.terminator177! CHECK: }178subroutine ss5() ! EXIT inside OpenMP wsloop (inside parallel)179 integer :: x180 !$omp parallel private(x)181 !$omp do182 do j = 1, 3183 x = j * i184 do k = 1, 3185 if (k .eq. n) exit186 x = k187 x = x + k188 enddo189 x = j - 222190 enddo191 !$omp end do192 !$omp end parallel193end194 195! CHECK-LABEL: func @_QPss6() {196! CHECK: omp.parallel private(@{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {197! CHECK: br ^[[BB1_OUTER:.*]]198! CHECK: ^[[BB1_OUTER]]:199! CHECK: cond_br %{{.*}}, ^[[BB2_OUTER:.*]], ^[[BB3_OUTER:.*]]200! CHECK: ^[[BB2_OUTER]]:201! CHECK: omp.wsloop private({{.*}}) {202! CHECK: omp.loop_nest {{.*}} {203! CHECK: br ^[[BB1:.*]]204! CHECK: ^[[BB1]]:205! CHECK: br ^[[BB2:.*]]206! CHECK: ^[[BB2]]:207! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]208! CHECK: ^[[BB3]]:209! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]210! CHECK: ^[[BB4]]:211! CHECK: br ^[[BB6]]212! CHECK: ^[[BB5]]213! CHECK: br ^[[BB2]]214! CHECK: ^[[BB6]]:215! CHECK: omp.yield216! CHECK: }217! CHECK: }218! CHECK: br ^[[BB1_OUTER]]219! CHECK: ^[[BB3_OUTER]]:220! CHECK: omp.terminator221! CHECK: }222subroutine ss6() ! EXIT inside OpenMP wsloop in a do loop (inside parallel)223 integer :: x224 !$omp parallel private(x)225 do i = 1, 3226 !$omp do227 do j = 1, 3228 x = j * i229 do k = 1, 3230 if (k .eq. n) exit231 x = k232 x = x + k233 enddo234 x = j - 222235 enddo236 !$omp end do237 enddo238 !$omp end parallel239end240 241! CHECK-LABEL: func @_QPss7() {242! CHECK: br ^[[BB1_OUTER:.*]]243! CHECK: ^[[BB1_OUTER]]:244! CHECK: cond_br %{{.*}}, ^[[BB2_OUTER:.*]], ^[[BB3_OUTER:.*]]245! CHECK-NEXT: ^[[BB2_OUTER:.*]]:246! CHECK: omp.parallel {247! CHECK: omp.wsloop private({{.*}}) {248! CHECK: omp.loop_nest {{.*}} {249! CHECK: br ^[[BB1:.*]]250! CHECK-NEXT: ^[[BB1]]:251! CHECK: br ^[[BB2:.*]]252! CHECK-NEXT: ^[[BB2]]:253! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]254! CHECK-NEXT: ^[[BB3]]:255! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]256! CHECK-NEXT: ^[[BB4]]:257! CHECK: br ^[[BB6]]258! CHECK-NEXT: ^[[BB5]]:259! CHECK: br ^[[BB2]]260! CHECK-NEXT: ^[[BB6]]:261! CHECK: omp.yield262! CHECK: }263! CHECK: }264! CHECK: omp.terminator265! CHECK: }266! CHECK: br ^[[BB1_OUTER]]267! CHECK-NEXT: ^[[BB3_OUTER]]:268! CHECK-NEXT: return269subroutine ss7() ! EXIT inside OpenMP parallel do (inside do loop)270 integer :: x271 do i = 1, 3272 !$omp parallel do private(x)273 do j = 1, 3274 x = j * i275 do k = 1, 3276 if (k .eq. n) exit277 x = k278 x = x + k279 enddo280 enddo281 !$omp end parallel do282 enddo283end284 285! CHECK-LABEL: func @_QPss8() {286! CHECK: omp.parallel {287! CHECK: omp.wsloop private({{.*}}) {288! CHECK: omp.loop_nest {{.*}} {289! CHECK: br ^[[BB1:.*]]290! CHECK-NEXT: ^[[BB1]]:291! CHECK: br ^[[BB2:.*]]292! CHECK: ^[[BB2]]:293! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]294! CHECK: ^[[BB3]]:295! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]296! CHECK: ^[[BB4]]:297! CHECK-NEXT: br ^[[BB6]]298! CHECK: ^[[BB5]]:299! CHECK: br ^[[BB2]]300! CHECK-NEXT: ^[[BB6]]:301! CHECK: omp.yield302! CHECK: }303! CHECK: }304! CHECK: omp.terminator305! CHECK: }306subroutine ss8() ! EXIT inside OpenMP parallel do307 integer :: x308 !$omp parallel do private(x)309 do j = 1, 3310 x = j * i311 do k = 1, 3312 if (k .eq. n) exit313 x = k314 x = x + k315 enddo316 enddo317 !$omp end parallel do318end319 320! CHECK-LABEL: func @_QPss9() {321! CHECK: omp.parallel {322! CHECK-NEXT: omp.parallel private(@{{.*}} %{{.*}}#0 -> %{{.*}}, @{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {323! CHECK: br ^[[BB1:.*]]324! CHECK: ^[[BB1]]:325! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB5:.*]]326! CHECK-NEXT: ^[[BB2]]:327! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB4:.*]]328! CHECK-NEXT: ^[[BB3]]:329! CHECK-NEXT: br ^[[BB5]]330! CHECK-NEXT: ^[[BB4]]:331! CHECK: br ^[[BB1]]332! CHECK-NEXT: ^[[BB5]]:333! CHECK: omp.terminator334! CHECK-NEXT: }335! CHECK: omp.terminator336! CHECK-NEXT: }337! CHECK: }338subroutine ss9() ! EXIT inside OpenMP parallel (inside parallel)339 integer :: x340 !$omp parallel341 !$omp parallel private(x)342 do k = 1, 3343 if (k .eq. n) exit344 x = k345 x = x + k346 end do347 !$omp end parallel348 !$omp end parallel349end350 351! CHECK-LABEL: func @_QQmain352program p353 call ss1(2)354 call ss2(2)355 call ss3(2)356 call ss4(2)357 call ss5()358 call ss6()359 call ss7()360 call ss8()361 call ss9()362end363