Files
clang-p2996/flang/test/Lower/OpenMP/loop-compound.f90
Kareem Ergawy 2f245875b2 [flang][OpenMP] Handle unstructured CF in compound loop constructs (#111111)
Fixes a bug in handling unstructured control-flow in compound loop
constructs. The fix makes sure that unstructured CF does not get lowered
until we reach the last item of the compound construct. This way, we
avoid moving block of unstructured loops in-between the middle items of
the construct and messing (i.e. adding operations) to these block while
doing so.
2024-10-04 15:24:00 +02:00

269 lines
8.0 KiB
Fortran

! This test checks lowering of OpenMP compound (combined and composite) loop
! constructs.
! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s
! RUN: %flang_fc1 -fopenmp -emit-hlfir %s -o - | FileCheck %s
program main
integer :: i,j
! TODO When composite constructs are supported add:
! - TASKLOOP SIMD
! ----------------------------------------------------------------------------
! DISTRIBUTE PARALLEL DO
! ----------------------------------------------------------------------------
!$omp teams
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.loop_nest
!$omp distribute parallel do
do i = 1, 10
end do
!$omp end distribute parallel do
!$omp end teams
! ----------------------------------------------------------------------------
! DISTRIBUTE PARALLEL DO SIMD
! ----------------------------------------------------------------------------
!$omp teams
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
!$omp distribute parallel do simd
do i = 1, 10
end do
!$omp end distribute parallel do simd
!$omp end teams
! ----------------------------------------------------------------------------
! DISTRIBUTE SIMD
! ----------------------------------------------------------------------------
!$omp teams
! CHECK: omp.distribute
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
!$omp distribute simd
do i = 1, 10
end do
!$omp end distribute simd
!$omp end teams
! ----------------------------------------------------------------------------
! DO SIMD
! ----------------------------------------------------------------------------
! CHECK: omp.wsloop
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
!$omp do simd
do i = 1, 10
end do
!$omp end do simd
! ----------------------------------------------------------------------------
! PARALLEL DO SIMD
! ----------------------------------------------------------------------------
! CHECK: omp.parallel
! CHECK: omp.wsloop
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
!$omp parallel do simd
do i = 1, 10
end do
!$omp end parallel do simd
! ----------------------------------------------------------------------------
! PARALLEL DO
! ----------------------------------------------------------------------------
! CHECK: omp.parallel
! CHECK: omp.wsloop
! CHECK-NEXT: omp.loop_nest
!$omp parallel do
do i = 1, 10
end do
!$omp end parallel do
! ----------------------------------------------------------------------------
! TARGET PARALLEL DO SIMD
! ----------------------------------------------------------------------------
! CHECK: omp.target
! CHECK: omp.parallel
! CHECK: omp.wsloop
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
!$omp target parallel do simd
do i = 1, 10
end do
!$omp end target parallel do simd
! ----------------------------------------------------------------------------
! TARGET PARALLEL DO
! ----------------------------------------------------------------------------
! CHECK: omp.target
! CHECK: omp.parallel
! CHECK: omp.wsloop
! CHECK-NEXT: omp.loop_nest
!$omp target parallel do
do i = 1, 10
end do
!$omp end target parallel do
! ----------------------------------------------------------------------------
! TARGET SIMD
! ----------------------------------------------------------------------------
! CHECK: omp.target
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
!$omp target simd
do i = 1, 10
end do
!$omp end target simd
! ----------------------------------------------------------------------------
! TARGET TEAMS DISTRIBUTE
! ----------------------------------------------------------------------------
! CHECK: omp.target
! CHECK: omp.teams
! CHECK: omp.distribute
! CHECK-NEXT: omp.loop_nest
!$omp target teams distribute
do i = 1, 10
end do
!$omp end target teams distribute
! ----------------------------------------------------------------------------
! TARGET TEAMS DISTRIBUTE PARALLEL DO
! ----------------------------------------------------------------------------
! CHECK: omp.target
! CHECK: omp.teams
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.loop_nest
!$omp target teams distribute parallel do
do i = 1, 10
end do
!$omp end target teams distribute parallel do
! ----------------------------------------------------------------------------
! TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD
! ----------------------------------------------------------------------------
! CHECK: omp.target
! CHECK: omp.teams
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
!$omp target teams distribute parallel do simd
do i = 1, 10
end do
!$omp end target teams distribute parallel do simd
! ----------------------------------------------------------------------------
! TARGET TEAMS DISTRIBUTE SIMD
! ----------------------------------------------------------------------------
! CHECK: omp.target
! CHECK: omp.teams
! CHECK: omp.distribute
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
!$omp target teams distribute simd
do i = 1, 10
end do
!$omp end target teams distribute simd
! ----------------------------------------------------------------------------
! TEAMS DISTRIBUTE
! ----------------------------------------------------------------------------
! CHECK: omp.teams
! CHECK: omp.distribute
! CHECK-NEXT: omp.loop_nest
!$omp teams distribute
do i = 1, 10
end do
!$omp end teams distribute
! ----------------------------------------------------------------------------
! TEAMS DISTRIBUTE PARALLEL DO
! ----------------------------------------------------------------------------
! CHECK: omp.teams
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.loop_nest
!$omp teams distribute parallel do
do i = 1, 10
end do
!$omp end teams distribute parallel do
! ----------------------------------------------------------------------------
! TEAMS DISTRIBUTE PARALLEL DO SIMD
! ----------------------------------------------------------------------------
! CHECK: omp.teams
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
!$omp teams distribute parallel do simd
do i = 1, 10
end do
!$omp end teams distribute parallel do simd
! ----------------------------------------------------------------------------
! TEAMS DISTRIBUTE SIMD
! ----------------------------------------------------------------------------
! CHECK: omp.teams
! CHECK: omp.distribute
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
!$omp teams distribute simd
do i = 1, 10
end do
!$omp end teams distribute simd
! ----------------------------------------------------------------------------
! Unstructured control-flow in loop
! ----------------------------------------------------------------------------
! CHECK: omp.target
! CHECK: omp.teams
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.loop_nest
!
! Verify the conrol-flow of the unstructured inner loop.
! CHECK: cf.br ^[[BB1:.*]]
! CHECK: ^[[BB1]]:
! CHECK: cf.br ^[[BB2:.*]]
! CHECK: ^[[BB2]]:
! CHECK: cf.cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
! CHECK: ^[[BB3]]:
! CHECK: cf.cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]
! CHECK: ^[[BB4]]:
! CHECK: cf.br ^[[BB6]]
! CHECK: ^[[BB5]]:
! CHECK: cf.br ^[[BB2]]
! CHECK: ^[[BB6]]:
! CHECK-NEXT: omp.yield
!$omp target teams distribute parallel do
do i = 1, 10
outerloop: do j = i-1, i+i
if (j == i) then
exit outerloop
end if
end do outerloop
end do
!$omp end target teams distribute parallel do
end program main