blob: 83f3eabfc3e1810df1780605a0881c78439934cb [file] [log] [blame]
! { dg-additional-options "-fdump-tree-omplower" }
! For the 4 vars in omp_parallel, 4 in omp_target and 2 in no_alloc2_func.
! { dg-final { scan-tree-dump-times "__builtin_GOMP_alloc \\(" 10 "omplower" } }
! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(" 10 "omplower" } }
module m
use iso_c_binding
use omp_lib
implicit none (type, external)
integer(c_intptr_t) :: intptr
contains
subroutine check_int (x, y)
integer :: x, y
value :: y
if (x /= y) &
stop 1
end
subroutine check_ptr (x, y)
type(c_ptr) :: x
integer(c_intptr_t), value :: y
if (transfer(x,intptr) /= y) &
stop 2
end
integer function no_alloc_func () result(res)
! There is no __builtin_GOMP_alloc / __builtin_GOMP_free as
! allocator == omp_default_mem_alloc (known at compile time.
integer :: no_alloc
!$omp allocate(no_alloc) allocator(omp_default_mem_alloc)
no_alloc = 7
res = no_alloc
end
integer function no_alloc2_func() result(res)
! If no_alloc2 were TREE_UNUSED, there would be no
! __builtin_GOMP_alloc / __builtin_GOMP_free
! However, as the parser already marks no_alloc2
! and is_alloc2 as used, the tree is generated for both vars.
integer :: no_alloc2, is_alloc2
!$omp allocate(no_alloc2, is_alloc2)
is_alloc2 = 7
res = is_alloc2
end
subroutine omp_parallel ()
integer :: i, n, iii, jjj(5)
type(c_ptr) :: ptr
!$omp allocate(iii, jjj, ptr)
n = 6
iii = 5
ptr = transfer (int(z'1234', c_intptr_t), ptr)
block
integer :: kkk(n)
!$omp allocate(kkk)
do i = 1, 5
jjj(i) = 3*i
end do
do i = 1, 6
kkk(i) = 7*i
end do
!$omp parallel default(none) firstprivate(iii, jjj, kkk, ptr) if(.false.)
if (iii /= 5) &
stop 3
iii = 7
call check_int (iii, 7)
do i = 1, 5
if (jjj(i) /= 3*i) &
stop 4
end do
do i = 1, 6
if (kkk(i) /= 7*i) &
stop 5
end do
do i = 1, 5
jjj(i) = 4*i
end do
do i = 1, 6
kkk(i) = 8*i
end do
do i = 1, 5
call check_int (jjj(i), 4*i)
end do
do i = 1, 6
call check_int (kkk(i), 8*i)
end do
if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) &
stop 6
ptr = transfer (int(z'abcd', c_intptr_t), ptr)
if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) &
stop 7
call check_ptr (ptr, int(z'abcd', c_intptr_t))
!$omp end parallel
if (iii /= 5) &
stop 8
call check_int (iii, 5)
do i = 1, 5
if (jjj(i) /= 3*i) &
stop 9
call check_int (jjj(i), 3*i)
end do
do i = 1, 6
if (kkk(i) /= 7*i) &
stop 10
call check_int (kkk(i), 7*i)
end do
if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) &
stop 11
call check_ptr (ptr, int(z'1234', c_intptr_t))
!$omp parallel default(firstprivate) if(.false.)
if (iii /= 5) &
stop 12
iii = 7
call check_int (iii, 7)
do i = 1, 5
if (jjj(i) /= 3*i) &
stop 13
end do
do i = 1, 6
if (kkk(i) /= 7*i) &
stop 14
end do
do i = 1, 5
jjj(i) = 4*i
end do
do i = 1, 6
kkk(i) = 8*i
end do
do i = 1, 5
call check_int (jjj(i), 4*i)
end do
do i = 1, 6
call check_int (kkk(i), 8*i)
end do
if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) &
stop 15
ptr = transfer (int (z'abcd', c_intptr_t), ptr)
if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) &
stop 16
call check_ptr (ptr, int (z'abcd', c_intptr_t))
!$omp end parallel
if (iii /= 5) &
stop 17
call check_int (iii, 5)
do i = 1, 5
if (jjj(i) /= 3*i) &
stop 18
call check_int (jjj(i), 3*i)
end do
do i = 1, 6
if (kkk(i) /= 7*i) &
stop 19
call check_int (kkk(i), 7*i)
end do
if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) &
stop 20
call check_ptr (ptr, int (z'1234', c_intptr_t))
end block
end
subroutine omp_target ()
integer :: i, n, iii, jjj(5)
type(c_ptr) :: ptr
!$omp allocate(iii, jjj, ptr)
n = 6
iii = 5
ptr = transfer (int (z'1234', c_intptr_t), ptr)
block
integer :: kkk(n)
!$omp allocate(kkk)
do i = 1, 5
jjj(i) = 3*i
end do
do i = 1, 6
kkk(i) = 7*i
end do
!$omp target defaultmap(none) firstprivate(iii, jjj, kkk, ptr) private(i)
if (iii /= 5) &
stop 21
iii = 7
call check_int (iii, 7)
do i = 1, 5
if (jjj(i) /= 3*i) &
stop 22
end do
do i = 1, 6
if (kkk(i) /= 7*i) &
stop 23
end do
do i = 1, 5
jjj(i) = 4*i
end do
do i = 1, 6
kkk(i) = 8*i
end do
do i = 1, 5
call check_int (jjj(i), 4*i)
end do
do i = 1, 6
call check_int (kkk(i), 8*i)
end do
if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) &
stop 24
ptr = transfer (int (z'abcd', c_intptr_t), ptr)
if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) &
stop 25
call check_ptr (ptr, int (z'abcd', c_intptr_t))
!$omp end target
if (iii /= 5) &
stop 26
call check_int (iii, 5)
do i = 1, 5
if (jjj(i) /= 3*i) &
stop 27
call check_int (jjj(i), 3*i)
end do
do i = 1, 6
if (kkk(i) /= 7*i) &
stop 28
call check_int (kkk(i), 7*i)
end do
if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) &
stop 29
call check_ptr (ptr, int (z'1234', c_intptr_t))
!$omp target defaultmap(firstprivate)
if (iii /= 5) &
stop 30
iii = 7
call check_int (iii, 7)
do i = 1, 5
if (jjj(i) /= 3*i) &
stop 31
end do
do i = 1, 6
if (kkk(i) /= 7*i) &
stop 32
end do
do i = 1, 5
jjj(i) = 4*i
end do
do i = 1, 6
kkk(i) = 8*i
end do
do i = 1, 5
call check_int (jjj(i), 4*i)
end do
do i = 1, 6
call check_int (kkk(i), 8*i)
end do
if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) &
stop 33
ptr = transfer (int (z'abcd', c_intptr_t), ptr)
if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) &
stop 34
call check_ptr (ptr, int (z'abcd', c_intptr_t))
!$omp end target
if (iii /= 5) &
stop 35
call check_int (iii, 5)
do i = 1, 5
if (jjj(i) /= 3*i) &
stop 36
call check_int (jjj(i), 3*i)
end do
do i = 1, 6
if (kkk(i) /= 7*i) &
stop 37
call check_int (kkk(i), 7*i)
end do
if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) &
stop 38
call check_ptr (ptr, int (z'1234', c_intptr_t))
!$omp target defaultmap(tofrom)
if (iii /= 5) &
stop 39
iii = 7
call check_int (iii, 7)
do i = 1, 5
if (jjj(i) /= 3*i) &
stop 40
end do
do i = 1, 6
if (kkk(i) /= 7*i) &
stop 41
end do
do i = 1, 5
jjj(i) = 4*i
end do
do i = 1, 6
kkk(i) = 8*i
end do
do i = 1, 5
call check_int (jjj(i), 4*i)
end do
do i = 1, 6
call check_int (kkk(i), 8*i)
end do
if (transfer (ptr, intptr) /= int(z'1234', c_intptr_t)) &
stop 42
ptr = transfer (int(z'abcd',c_intptr_t), ptr)
if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) &
stop 43
call check_ptr (ptr, int (z'abcd', c_intptr_t))
!$omp end target
if (iii /= 7) &
stop 44
call check_int (iii, 7)
do i = 1, 5
if (jjj(i) /= 4*i) &
stop 45
call check_int (jjj(i), 4*i)
end do
do i = 1, 6
if (kkk(i) /= 8*i) &
stop 46
call check_int (kkk(i), 8*i)
end do
if (transfer (ptr, intptr) /= int(z'abcd', c_intptr_t)) &
stop 47
call check_ptr (ptr, int (z'abcd', c_intptr_t))
end block
end
end module
use m
call omp_parallel ()
call omp_target ()
end