brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · fa33abb Raw
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