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.
269 lines
8.0 KiB
Fortran
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
|