155cb52bbSKrzysztof Parzyszek! RUN: bbc -emit-hlfir -fopenmp -o - %s | FileCheck %s 255cb52bbSKrzysztof Parzyszek 355cb52bbSKrzysztof Parzyszeksubroutine sub(imax, jmax, x, y) 455cb52bbSKrzysztof Parzyszek integer, intent(in) :: imax, jmax 555cb52bbSKrzysztof Parzyszek real, intent(in), dimension(1:imax, 1:jmax) :: x, y 655cb52bbSKrzysztof Parzyszek 755cb52bbSKrzysztof Parzyszek integer :: i, j, ii 855cb52bbSKrzysztof Parzyszek 955cb52bbSKrzysztof Parzyszek ! collapse(2) is needed to reproduce the issue 1055cb52bbSKrzysztof Parzyszek !$omp parallel do collapse(2) 1155cb52bbSKrzysztof Parzyszek do j = 1, jmax 1255cb52bbSKrzysztof Parzyszek do i = 1, imax 1355cb52bbSKrzysztof Parzyszek do ii = 1, imax ! note that this loop is not collapsed 1455cb52bbSKrzysztof Parzyszek if (x(i,j) < y(ii,j)) then 1555cb52bbSKrzysztof Parzyszek ! exit needed to force unstructured control flow 1655cb52bbSKrzysztof Parzyszek exit 1755cb52bbSKrzysztof Parzyszek endif 1855cb52bbSKrzysztof Parzyszek enddo 1955cb52bbSKrzysztof Parzyszek enddo 2055cb52bbSKrzysztof Parzyszek enddo 2155cb52bbSKrzysztof Parzyszekend subroutine sub 2255cb52bbSKrzysztof Parzyszek 2355cb52bbSKrzysztof Parzyszek! this is testing that we don't crash generating code for this: in particular 2455cb52bbSKrzysztof Parzyszek! that all blocks are terminated 2555cb52bbSKrzysztof Parzyszek 2655cb52bbSKrzysztof Parzyszek! CHECK-LABEL: func.func @_QPsub( 2755cb52bbSKrzysztof Parzyszek! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "imax"}, 2855cb52bbSKrzysztof Parzyszek! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "jmax"}, 2955cb52bbSKrzysztof Parzyszek! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<!fir.array<?x?xf32>> {fir.bindc_name = "x"}, 3055cb52bbSKrzysztof Parzyszek! CHECK-SAME: %[[VAL_3:.*]]: !fir.ref<!fir.array<?x?xf32>> {fir.bindc_name = "y"}) { 3155cb52bbSKrzysztof Parzyszek! [...] 32*937cbce1SKareem Ergawy! CHECK: omp.wsloop { 33ca4dbc27SSergio Afonso! CHECK-NEXT: omp.loop_nest (%[[VAL_53:.*]], %[[VAL_54:.*]]) : i32 = ({{.*}}) to ({{.*}}) inclusive step ({{.*}}) { 3455cb52bbSKrzysztof Parzyszek! [...] 3555cb52bbSKrzysztof Parzyszek! CHECK: cf.br ^bb1 3655cb52bbSKrzysztof Parzyszek! CHECK: ^bb1: 3755cb52bbSKrzysztof Parzyszek! CHECK: cf.br ^bb2 3855cb52bbSKrzysztof Parzyszek! CHECK: ^bb2: 3955cb52bbSKrzysztof Parzyszek! [...] 4055cb52bbSKrzysztof Parzyszek! CHECK: cf.br ^bb3 4155cb52bbSKrzysztof Parzyszek! CHECK: ^bb3: 4255cb52bbSKrzysztof Parzyszek! [...] 4355cb52bbSKrzysztof Parzyszek! CHECK: %[[VAL_63:.*]] = arith.cmpi sgt, %{{.*}}, %{{.*}} : i32 4455cb52bbSKrzysztof Parzyszek! CHECK: cf.cond_br %[[VAL_63]], ^bb4, ^bb7 4555cb52bbSKrzysztof Parzyszek! CHECK: ^bb4: 4655cb52bbSKrzysztof Parzyszek! [...] 4755cb52bbSKrzysztof Parzyszek! CHECK: %[[VAL_76:.*]] = arith.cmpf olt, %{{.*}}, %{{.*}} fastmath<contract> : f32 4855cb52bbSKrzysztof Parzyszek! CHECK: cf.cond_br %[[VAL_76]], ^bb5, ^bb6 4955cb52bbSKrzysztof Parzyszek! CHECK: ^bb5: 5055cb52bbSKrzysztof Parzyszek! CHECK: cf.br ^bb7 5155cb52bbSKrzysztof Parzyszek! CHECK: ^bb6: 5255cb52bbSKrzysztof Parzyszek! [...] 5355cb52bbSKrzysztof Parzyszek! CHECK: cf.br ^bb3 5455cb52bbSKrzysztof Parzyszek! CHECK: ^bb7: 5555cb52bbSKrzysztof Parzyszek! CHECK: omp.yield 5655cb52bbSKrzysztof Parzyszek! CHECK: } 5755cb52bbSKrzysztof Parzyszek! CHECK: } 58ca4dbc27SSergio Afonso! CHECK: omp.terminator 59ca4dbc27SSergio Afonso! CHECK: } 6055cb52bbSKrzysztof Parzyszek! CHECK: cf.br ^bb1 6155cb52bbSKrzysztof Parzyszek! CHECK: ^bb1: 6255cb52bbSKrzysztof Parzyszek! CHECK: return 6355cb52bbSKrzysztof Parzyszek! CHECK: } 64