blob: 4e29329e15cac45a09680946612433fc257274dd [file] [log] [blame]
! RUN: %flang_fc1 -fopenmp-simd -fdebug-dump-parse-tree %s 2>&1 | FileCheck %s
! Test that non-SIMD OpenMPConstructs are removed on the parse tree level
! when -fopenmp-simd is specified.
! Tests the logic in lib/Semantics/rewrite-parse-tree.cpp
! CHECK-LABEL: Name = 'test_simd'
subroutine test_simd()
integer :: i
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK: OmpDirectiveName -> llvm::omp::Directive = simd
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp simd
do i = 1, 100
end do
end subroutine
! CHECK-LABEL: Name = 'test_do_simd'
subroutine test_do_simd()
integer :: i
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK: OmpDirectiveName -> llvm::omp::Directive = do simd
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp do simd
do i = 1, 100
end do
end subroutine
! CHECK-LABEL: Name = 'test_parallel_do_simd'
subroutine test_parallel_do_simd()
integer :: i
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK: OmpDirectiveName -> llvm::omp::Directive = parallel do simd
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp parallel do simd
do i = 1, 100
end do
end subroutine
! CHECK-LABEL: Name = 'test_simd_scan'
subroutine test_simd_scan()
integer :: i
real :: sum
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK: OmpDirectiveName -> llvm::omp::Directive = simd
!$omp simd reduction(inscan,+:sum)
do i = 1, N
sum = sum + a(i)
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPSimpleStandaloneConstruct -> OmpDirectiveSpecification
! CHECK: OmpDirectiveName -> llvm::omp::Directive = scan
!$omp scan inclusive(sum)
sum = sum + a(i)
end do
end subroutine
! CHECK-LABEL: Name = 'test_simd_atomic'
subroutine test_simd_atomic()
integer :: i, x
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK: OmpDirectiveName -> llvm::omp::Directive = simd
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp simd
do i = 1, 100
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=i'
!$omp atomic write
x = i
end do
end subroutine
! CHECK-LABEL: Name = 'test_do'
subroutine test_do()
integer :: i
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = do
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp parallel do
do i = 1, 100
end do
end subroutine
! CHECK-LABEL: Name = 'test_do_nested'
subroutine test_do_nested()
integer :: i
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = parallel do
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp parallel do
do i = 1, 100
do j = 1, 100
end do
end do
end subroutine
! CHECK-LABEL: Name = 'test_target'
subroutine test_target()
integer :: i
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPBlockct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = target
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp target
do i = 1, 100
end do
!$omp end target
end subroutine
! CHECK-LABEL: Name = 'test_target_teams_distribute'
subroutine test_target_teams_distribute()
integer :: i
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = target teams distribute
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp target teams distribute
do i = 1, 100
end do
!$omp end target teams distribute
end subroutine
! CHECK-LABEL: Name = 'test_target_data'
subroutine test_target_data()
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = target data
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp target data map(to: A) map(tofrom: B)
do i = 1, 100
end do
!$omp end target data
end subroutine
! CHECK-LABEL: Name = 'test_loop'
subroutine test_loop()
integer :: i
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = loop
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp loop bind(thread)
do i = 1, 100
end do
end subroutine
! CHECK-LABEL: Name = 'test_unroll'
subroutine test_unroll()
integer :: i
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = unroll
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp unroll
do i = 1, 100
end do
end subroutine
! CHECK-LABEL: Name = 'test_do_ordered'
subroutine test_do_ordered()
integer :: i, x
x = 0
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = do
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp do ordered
do i = 1, 100
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = ordered
!$omp ordered
x = x + 1
!$omp end ordered
end do
end subroutine
! CHECK-LABEL: Name = 'test_cancel'
subroutine test_cancel()
integer :: i, x
x = 0
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = parallel do
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp parallel do
do i = 1, 100
if (i == 10) then
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPCancelConstruct -> OmpDirectiveSpecification
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = cancel
!$omp cancel do
end if
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPCancellationPointConstruct -> OmpDirectiveSpecification
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = cancellation point
!$omp cancellation point do
end do
end subroutine
! CHECK-LABEL: Name = 'test_scan'
subroutine test_scan()
integer :: i, sum
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = parallel do
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
!$omp parallel do reduction(inscan, +: sum)
do i = 1, n
sum = sum + i
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPSimpleStandaloneConstruct -> OmpDirectiveSpecification
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = scan
!$omp scan inclusive(sum)
end do
!$omp end parallel do
end subroutine
! CHECK-LABEL: Name = 'test_target_map'
subroutine test_target_map()
integer :: array(10)
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = target
!$omp target map(tofrom: array(2:10))
array(2) = array(2) * 2
!$omp end target
end subroutine
! CHECK-LABEL: Name = 'test_sections'
subroutine test_sections()
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPSectionsConstruct
!$omp sections
! CHECK-NOT: OpenMPConstruct -> OpenMPSectionConstruct
!$omp section
! CHECK-NOT: OpenMPConstruct -> OpenMPSectionConstruct
!$omp section
!$omp end sections
end subroutine
! CHECK-LABEL: Name = 'test_threadprivate_mod'
module test_threadprivate_mod
implicit none
! CHECK: DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt
! CHECK: Name = 'x'
! CHECK: Name = 'y'
integer :: x, y
! CHECK: DeclarationConstruct -> SpecificationConstruct -> OtherSpecificationStmt -> CommonStmt
! CHECK: Name = 'x'
! CHECK: Name = 'y'
common /vars/ x, y
! CHECK-NOT: DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OpenMPThreadprivate
!$omp threadprivate(/vars/)
end module
! CHECK-LABEL: Name = 'test_atomic'
subroutine test_atomic()
real :: z, x, y
!$omp parallel private(tid, z)
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=y'
!$omp atomic write
x = y
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'z=x'
!$omp atomic read
z = x
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=x+1._4'
!$omp atomic update
x = x + 1
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'z=x'
!$omp atomic read
z = x
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=x+y'
!$omp atomic capture
x = x + y
!$omp end atomic
!$omp end parallel
end subroutine
! CHECK-LABEL: Name = 'test_task_single_taskwait'
subroutine test_task_single_taskwait()
integer :: x
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = parallel
!$omp parallel
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = single
!$omp single
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
do i = 1, 5
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = task
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=i'
!$omp task
x = i
!$omp end task
end do
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPSimpleStandaloneConstruct -> OmpDirectiveSpecification
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = taskwait
!$omp taskwait
!$omp end single
!$omp end parallel
end subroutine
! CHECK-LABEL: Name = 'test_task_taskyield_flush_barrier'
subroutine test_task_taskyield_flush_barrier()
integer :: x, i
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = parallel
!$omp parallel
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPSimpleStandaloneConstruct -> OmpDirectiveSpecification
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = barrier
!$omp barrier
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = single
!$omp single
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = task
!$omp task
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPSimpleStandaloneConstruct -> OmpDirectiveSpecification
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = taskyield
!$omp taskyield
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=i'
x = i
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPFlushConstruct -> OmpDirectiveSpecification
!$omp flush
!$omp end task
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = task
!$omp task
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPFlushConstruct -> OmpDirectiveSpecification
!$omp flush
!$omp end task
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPSimpleStandaloneConstruct -> OmpDirectiveSpecification
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = taskwait
!$omp taskwait
!$omp end single
!$omp end parallel
end subroutine
! CHECK-LABEL: Name = 'test_master_masked'
subroutine test_master_masked()
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = parallel
!$omp parallel private(tid)
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = masked
!$omp masked
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=y'
x = y
!$omp end masked
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = master
!$omp master
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'y=x'
y = x
!$omp end master
!$omp end parallel
end subroutine
! CHECK-LABEL: Name = 'test_critical'
subroutine test_critical()
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = parallel
!$omp parallel do private(i)
do i = 1, 4
!$omp critical(mylock)
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=y'
x = y
!$omp end critical(mylock)
end do
!$omp end parallel do
end subroutine
! CHECK-LABEL: Name = 'test_target_enter_exit_update_data'
subroutine test_target_enter_exit_update_data()
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPSimpleStandaloneConstruct -> OmpDirectiveSpecification
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = target enter data
!$omp target enter data map(to: A)
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = target teams distribute parallel do
!$omp target teams distribute parallel do
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
do i = 1, n
! CHECK: ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=y'
x = y
end do
!$omp end target teams distribute parallel do
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPSimpleStandaloneConstruct -> OmpDirectiveSpecification
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = target update
!$omp target update from(A)
! CHECK-NOT: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPSimpleStandaloneConstruct -> OmpDirectiveSpecification
! CHECK-NOT: OmpDirectiveName -> llvm::omp::Directive = target exit data
!$omp target exit data map(from: A)
end subroutine
! CHECK-LABEL: Name = 'test_declare_mapper'
module test_declare_mapper
implicit none
type :: myvec_t
integer :: len
real, allocatable :: data(:)
end type myvec_t
! CHECK-NOT: DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OpenMPDeclareMapperConstruct
!$omp declare mapper(myvec_t :: v) map(v, v%data(1:v%len))
end module