Files
clang-p2996/flang/test/Lower/OpenMP/wsloop-unstructured.f90
Sergio Afonso ca4dbc2718 [Flang][OpenMP][Lower] Update workshare-loop lowering (5/5) (#89215)
This patch updates lowering from PFT to MLIR of workshare loops to
follow the loop wrapper approach. Unit tests impacted by this change are
also updated.

As the last patch of the stack, this should compile and pass unit tests.
2024-04-24 14:30:03 +01:00

65 lines
2.2 KiB
Fortran

! RUN: bbc -emit-hlfir -fopenmp -o - %s | FileCheck %s
subroutine sub(imax, jmax, x, y)
integer, intent(in) :: imax, jmax
real, intent(in), dimension(1:imax, 1:jmax) :: x, y
integer :: i, j, ii
! collapse(2) is needed to reproduce the issue
!$omp parallel do collapse(2)
do j = 1, jmax
do i = 1, imax
do ii = 1, imax ! note that this loop is not collapsed
if (x(i,j) < y(ii,j)) then
! exit needed to force unstructured control flow
exit
endif
enddo
enddo
enddo
end subroutine sub
! this is testing that we don't crash generating code for this: in particular
! that all blocks are terminated
! CHECK-LABEL: func.func @_QPsub(
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "imax"},
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "jmax"},
! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<!fir.array<?x?xf32>> {fir.bindc_name = "x"},
! CHECK-SAME: %[[VAL_3:.*]]: !fir.ref<!fir.array<?x?xf32>> {fir.bindc_name = "y"}) {
! [...]
! CHECK: omp.wsloop {
! CHECK-NEXT: omp.loop_nest (%[[VAL_53:.*]], %[[VAL_54:.*]]) : i32 = ({{.*}}) to ({{.*}}) inclusive step ({{.*}}) {
! [...]
! CHECK: cf.br ^bb1
! CHECK: ^bb1:
! CHECK: cf.br ^bb2
! CHECK: ^bb2:
! [...]
! CHECK: cf.br ^bb3
! CHECK: ^bb3:
! [...]
! CHECK: %[[VAL_63:.*]] = arith.cmpi sgt, %{{.*}}, %{{.*}} : i32
! CHECK: cf.cond_br %[[VAL_63]], ^bb4, ^bb7
! CHECK: ^bb4:
! [...]
! CHECK: %[[VAL_76:.*]] = arith.cmpf olt, %{{.*}}, %{{.*}} fastmath<contract> : f32
! CHECK: cf.cond_br %[[VAL_76]], ^bb5, ^bb6
! CHECK: ^bb5:
! CHECK: cf.br ^bb7
! CHECK: ^bb6:
! [...]
! CHECK: cf.br ^bb3
! CHECK: ^bb7:
! CHECK: omp.yield
! CHECK: }
! CHECK: omp.terminator
! CHECK: }
! CHECK: omp.terminator
! CHECK: }
! CHECK: cf.br ^bb1
! CHECK: ^bb1:
! CHECK: return
! CHECK: }