xref: /llvm-project/flang/test/Lower/OpenMP/wsloop-unstructured.f90 (revision 937cbce14c9aa956342a9c818c26a8a557802843)
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