blob: d61745345a640554906d940d448a0c2019c73787 [file] [edit]
! This test checks lowering of compound (combined and composite) constructs.
! Specifically, it makes sure that the proper ComposableOpInterface attributes
! are set.
! RUN: bbc -fopenmp -fopenmp-version=60 -emit-hlfir %s -o - | FileCheck %s
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=60 %s -o - | FileCheck %s
! ------------------------------------------------------------------------------
! COMPOSITE CONSTRUCTS
! ------------------------------------------------------------------------------
subroutine distribute_parallel_do()
implicit none
integer :: i
!$omp teams
!$omp distribute parallel do
do i=1, 10
end do
!$omp end teams
end subroutine
! CHECK-LABEL: func.func @_QPdistribute_parallel_do
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
subroutine distribute_parallel_do_simd()
implicit none
integer :: i
!$omp teams
!$omp distribute parallel do simd
do i=1, 10
end do
!$omp end teams
end subroutine
! CHECK-LABEL: func.func @_QPdistribute_parallel_do_simd
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
subroutine distribute_simd()
implicit none
integer :: i
!$omp teams
!$omp distribute simd
do i=1, 10
end do
!$omp end teams
end subroutine
! CHECK-LABEL: func.func @_QPdistribute_simd
! CHECK: omp.distribute
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
subroutine do_simd()
implicit none
integer :: i
!$omp do simd
do i=1, 10
end do
end subroutine
! CHECK-LABEL: func.func @_QPdo_simd
! CHECK: omp.wsloop
! CHECK-NEXT: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! TODO: Add taskloop simd once supported by lowering.
! ------------------------------------------------------------------------------
! COMBINED CONSTRUCTS
! ------------------------------------------------------------------------------
subroutine masked_taskloop()
implicit none
integer :: i
!$omp masked taskloop
do i=1, 10
end do
end subroutine
! CHECK-LABEL: func.func @_QPmasked_taskloop
! CHECK: omp.masked
! CHECK: omp.taskloop.context
! CHECK: omp.taskloop.wrapper
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine master_taskloop()
implicit none
integer :: i
!$omp master taskloop
do i=1, 10
end do
end subroutine
! CHECK-LABEL: func.func @_QPmaster_taskloop
! CHECK: omp.master
! CHECK: omp.taskloop.context
! CHECK: omp.taskloop.wrapper
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_do()
implicit none
integer :: i
!$omp parallel do
do i=1, 10
end do
end subroutine
! CHECK-LABEL: func.func @_QPparallel_do
! CHECK: omp.parallel
! CHECK: omp.wsloop
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_loop()
implicit none
integer :: i
!$omp parallel loop
do i=1, 10
end do
end subroutine
! CHECK-LABEL: func.func @_QPparallel_loop
! CHECK: omp.parallel
! CHECK: omp.wsloop
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_masked()
implicit none
!$omp parallel masked
call foo()
!$omp end parallel masked
end subroutine
! CHECK-LABEL: func.func @_QPparallel_masked
! CHECK: omp.parallel
! CHECK: omp.masked
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_master()
implicit none
!$omp parallel master
call foo()
!$omp end parallel master
end subroutine
! CHECK-LABEL: func.func @_QPparallel_master
! CHECK: omp.parallel
! CHECK: omp.master
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_sections()
implicit none
!$omp parallel sections
call foo()
!$omp end parallel sections
end subroutine
! CHECK-LABEL: func.func @_QPparallel_sections
! CHECK: omp.parallel
! CHECK: omp.sections
! CHECK: omp.section
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_workshare()
implicit none
integer :: x(10)
!$omp parallel workshare
x = 1
!$omp end parallel workshare
end subroutine
! CHECK-LABEL: func.func @_QPparallel_workshare
! CHECK: omp.parallel
! CHECK: omp.workshare
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine target_loop()
implicit none
integer :: i
!$omp target loop
do i=1, 10
end do
end subroutine
! CHECK-LABEL: func.func @_QPtarget_loop
! CHECK: omp.target
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine target_parallel()
implicit none
!$omp target parallel
call foo()
!$omp end target parallel
end subroutine
! CHECK-LABEL: func.func @_QPtarget_parallel
! CHECK: omp.target
! CHECK: omp.parallel
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine target_simd()
implicit none
integer :: i
!$omp target simd
do i=1, 10
end do
end subroutine
! CHECK-LABEL: func.func @_QPtarget_simd
! CHECK: omp.target
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine target_teams()
implicit none
!$omp target teams
call foo()
!$omp end target teams
end subroutine
! CHECK-LABEL: func.func @_QPtarget_teams
! CHECK: omp.target
! CHECK: omp.teams
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine teams_distribute()
implicit none
integer :: i
!$omp teams distribute
do i=1, 10
end do
end subroutine
! CHECK-LABEL: func.func @_QPteams_distribute
! CHECK: omp.teams
! CHECK: omp.distribute
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine teams_loop()
implicit none
integer :: i
!$omp teams loop
do i=1, 10
end do
end subroutine
! CHECK-LABEL: func.func @_QPteams_loop
! CHECK: omp.teams
! CHECK: omp.parallel
! CHECK: omp.distribute
! CHECK-NEXT: omp.wsloop
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.composite{{.*}}}
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine teams_workdistribute()
implicit none
integer :: x
!$omp teams workdistribute
x = 1
!$omp end teams workdistribute
end subroutine
! CHECK-LABEL: func.func @_QPteams_workdistribute
! CHECK: omp.teams
! CHECK: omp.workdistribute
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
! ------------------------------------------------------------------------------
! COMBINED CONSTRUCTS (SPLIT)
! ------------------------------------------------------------------------------
subroutine masked_loop()
implicit none
integer :: i
!$omp masked
!$omp loop
do i=1, 10
end do
!$omp end masked
end subroutine
! CHECK-LABEL: func.func @_QPmasked_loop
! CHECK: omp.masked
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine masked_parallel()
implicit none
!$omp masked
!$omp parallel
call foo()
!$omp end parallel
!$omp end masked
end subroutine
! CHECK-LABEL: func.func @_QPmasked_parallel
! CHECK: omp.masked
! CHECK: omp.parallel
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine masked_simd()
implicit none
integer :: i
!$omp masked
!$omp simd
do i=1, 10
end do
!$omp end masked
end subroutine
! CHECK-LABEL: func.func @_QPmasked_simd
! CHECK: omp.masked
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine masked_target()
implicit none
!$omp masked
!$omp target
call foo()
!$omp end target
!$omp end masked
end subroutine
! CHECK-LABEL: func.func @_QPmasked_target
! CHECK: omp.masked
! CHECK: omp.target
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine masked_target_data()
implicit none
integer :: x(10)
!$omp masked
!$omp target_data map(tofrom: x)
call foo()
!$omp end target_data
!$omp end masked
end subroutine
! CHECK-LABEL: func.func @_QPmasked_target_data
! CHECK: omp.masked
! CHECK: omp.target_data
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine masked_task()
implicit none
!$omp masked
!$omp task
call foo()
!$omp end task
!$omp end masked
end subroutine
! CHECK-LABEL: func.func @_QPmasked_task
! CHECK: omp.masked
! CHECK: omp.task
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine master_loop()
implicit none
integer :: i
!$omp master
!$omp loop
do i=1, 10
end do
!$omp end master
end subroutine
! CHECK-LABEL: func.func @_QPmaster_loop
! CHECK: omp.master
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine master_parallel()
implicit none
!$omp master
!$omp parallel
call foo()
!$omp end parallel
!$omp end master
end subroutine
! CHECK-LABEL: func.func @_QPmaster_parallel
! CHECK: omp.master
! CHECK: omp.parallel
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine master_simd()
implicit none
integer :: i
!$omp master
!$omp simd
do i=1, 10
end do
!$omp end master
end subroutine
! CHECK-LABEL: func.func @_QPmaster_simd
! CHECK: omp.master
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine master_target()
implicit none
!$omp master
!$omp target
call foo()
!$omp end target
!$omp end master
end subroutine
! CHECK-LABEL: func.func @_QPmaster_target
! CHECK: omp.master
! CHECK: omp.target
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine master_target_data()
implicit none
integer :: x(10)
!$omp master
!$omp target_data map(tofrom: x)
call foo()
!$omp end target_data
!$omp end master
end subroutine
! CHECK-LABEL: func.func @_QPmaster_target_data
! CHECK: omp.master
! CHECK: omp.target_data
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine master_task()
implicit none
!$omp master
!$omp task
call foo()
!$omp end task
!$omp end master
end subroutine
! CHECK-LABEL: func.func @_QPmaster_task
! CHECK: omp.master
! CHECK: omp.task
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_simd()
implicit none
integer :: i
!$omp parallel
!$omp simd
do i=1, 10
end do
!$omp end parallel
end subroutine
! CHECK-LABEL: func.func @_QPparallel_simd
! CHECK: omp.parallel
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_single()
implicit none
!$omp parallel
!$omp single
call foo()
!$omp end single
!$omp end parallel
end subroutine
! CHECK-LABEL: func.func @_QPparallel_single
! CHECK: omp.parallel
! CHECK: omp.single
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_target()
implicit none
!$omp parallel
!$omp target
call foo()
!$omp end target
!$omp end parallel
end subroutine
! CHECK-LABEL: func.func @_QPparallel_target
! CHECK: omp.parallel
! CHECK: omp.target
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_target_data()
implicit none
integer :: x(10)
!$omp parallel
!$omp target_data map(tofrom: x)
call foo()
!$omp end target_data
!$omp end parallel
end subroutine
! CHECK-LABEL: func.func @_QPparallel_target_data
! CHECK: omp.parallel
! CHECK: omp.target_data
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_task()
implicit none
!$omp parallel
!$omp task
call foo()
!$omp end task
!$omp end parallel
end subroutine
! CHECK-LABEL: func.func @_QPparallel_task
! CHECK: omp.parallel
! CHECK: omp.task
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine parallel_taskloop()
implicit none
integer :: i
!$omp parallel
!$omp taskloop
do i=1, 10
end do
!$omp end parallel
end subroutine
! CHECK-LABEL: func.func @_QPparallel_taskloop
! CHECK: omp.parallel
! CHECK: omp.taskloop.context
! CHECK: omp.taskloop.wrapper
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine single_loop()
implicit none
integer :: i
!$omp single
!$omp loop
do i=1, 10
end do
!$omp end single
end subroutine
! CHECK-LABEL: func.func @_QPsingle_loop
! CHECK: omp.single
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine single_parallel()
implicit none
!$omp single
!$omp parallel
call foo()
!$omp end parallel
!$omp end single
end subroutine
! CHECK-LABEL: func.func @_QPsingle_parallel
! CHECK: omp.single
! CHECK: omp.parallel
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine single_simd()
implicit none
integer :: i
!$omp single
!$omp simd
do i=1, 10
end do
!$omp end single
end subroutine
! CHECK-LABEL: func.func @_QPsingle_simd
! CHECK: omp.single
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine single_target()
implicit none
!$omp single
!$omp target
call foo()
!$omp end target
!$omp end single
end subroutine
! CHECK-LABEL: func.func @_QPsingle_target
! CHECK: omp.single
! CHECK: omp.target
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine single_target_data()
implicit none
integer :: x(10)
!$omp single
!$omp target_data map(tofrom: x)
call foo()
!$omp end target_data
!$omp end single
end subroutine
! CHECK-LABEL: func.func @_QPsingle_target_data
! CHECK: omp.single
! CHECK: omp.target_data
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine single_task()
implicit none
!$omp single
!$omp task
call foo()
!$omp end task
!$omp end single
end subroutine
! CHECK-LABEL: func.func @_QPsingle_task
! CHECK: omp.single
! CHECK: omp.task
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine single_taskloop()
implicit none
integer :: i
!$omp single
!$omp taskloop
do i=1, 10
end do
!$omp end single
end subroutine
! CHECK-LABEL: func.func @_QPsingle_taskloop
! CHECK: omp.single
! CHECK: omp.taskloop.context
! CHECK: omp.taskloop.wrapper
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine target_task()
implicit none
!$omp target
!$omp task
call foo()
!$omp end task
!$omp end target
end subroutine
! CHECK-LABEL: func.func @_QPtarget_task
! CHECK: omp.target
! CHECK: omp.task
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine target_taskloop()
implicit none
integer :: i
!$omp target
!$omp taskloop
do i=1, 10
end do
!$omp end target
end subroutine
! CHECK-LABEL: func.func @_QPtarget_taskloop
! CHECK: omp.target
! CHECK: omp.taskloop.context
! CHECK: omp.taskloop.wrapper
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine target_data_loop()
implicit none
integer :: i
integer :: x(10)
!$omp target_data map(tofrom: x)
!$omp loop
do i=1, 10
end do
!$omp end target_data
end subroutine
! CHECK-LABEL: func.func @_QPtarget_data_loop
! CHECK: omp.target_data
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine target_data_parallel()
implicit none
integer :: x(10)
!$omp target_data map(tofrom: x)
!$omp parallel
call foo()
!$omp end parallel
!$omp end target_data
end subroutine
! CHECK-LABEL: func.func @_QPtarget_data_parallel
! CHECK: omp.target_data
! CHECK: omp.parallel
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine target_data_simd()
implicit none
integer :: i
integer :: x(10)
!$omp target_data map(tofrom: x)
!$omp simd
do i=1, 10
end do
!$omp end target_data
end subroutine
! CHECK-LABEL: func.func @_QPtarget_data_simd
! CHECK: omp.target_data
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine task_loop()
implicit none
integer :: i
!$omp task
!$omp loop
do i=1, 10
end do
!$omp end task
end subroutine
! CHECK-LABEL: func.func @_QPtask_loop
! CHECK: omp.task
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine task_parallel()
implicit none
!$omp task
!$omp parallel
call foo()
!$omp end parallel
!$omp end task
end subroutine
! CHECK-LABEL: func.func @_QPtask_parallel
! CHECK: omp.task
! CHECK: omp.parallel
! CHECK: omp.terminator
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine task_simd()
implicit none
integer :: i
!$omp task
!$omp simd
do i=1, 10
end do
!$omp end task
end subroutine
! CHECK-LABEL: func.func @_QPtask_simd
! CHECK: omp.task
! CHECK: omp.simd
! CHECK-NEXT: omp.loop_nest
! CHECK: omp.yield
! CHECK-NEXT: }
! CHECK-NEXT: }
! CHECK-NOT: omp.combined
! CHECK: omp.terminator
! CHECK-NEXT: } {{{.*}}omp.combined{{.*}}}
subroutine teams_parallel()
implicit none
!$omp teams
!$omp parallel
call foo()
!$omp end parallel
!$omp end teams
end subroutine