Instead of storing a variant with specific types, store parser::Block as the body. Add two access functions to make the traversal of the nest simpler. This will allow storing loop-nest sequences in the future.
417 lines
17 KiB
Fortran
417 lines
17 KiB
Fortran
! 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
|