blob: 80d00cae009d6a3659fdb1656949618dba7285f3 [file] [log] [blame]
! { dg-additional-options "-fdump-tree-gimple" }
!
! { dg-additional-sources my-usleep.c }
! { dg-prune-output "command-line option '-fintrinsic-modules-path=.*' is valid for Fortran but not for C" }
!
! Ensure that 'depend(...: var)' and 'depobj(...) depend(...: var)'
! depend on the same variable when 'var' is a pointer
!
program main
use omp_lib
use iso_c_binding
implicit none (external, type)
interface
subroutine usleep(t) bind(C, name="my_usleep")
use iso_c_binding
integer(c_int), value :: t
end subroutine
end interface
integer :: bbb
integer, target :: c
integer(omp_depend_kind) :: obj(2)
integer, pointer :: ppp
integer :: x1, x2, x3
c = 42
ppp => c
if (.not. associated (ppp)) &
stop 0;
x1 = 43
x2 = 44
x3 = 45
!$omp depobj(obj(1)) depend(inout: ppp)
!$omp depobj(obj(2)) depend(in: bbb)
!$omp parallel num_threads(5)
!$omp single
!$omp task depend (out: ppp)
write (*,*) "task 1 (start)"
call usleep(40)
if (x1 /= 43) stop 11
if (x2 /= 44) stop 12
x1 = 11
write (*,*) "task 1 (end)"
!$omp end task
!$omp task depend(inout: ppp)
write (*,*) "task 2 (start)"
call usleep(30)
if (x1 /= 11) stop 21
if (x2 /= 44) stop 22
x1 = 111
x2 = 222
write (*,*) "task 2 (end)"
!$omp end task
!$omp task depend(out: bbb)
write (*,*) "task 3 (start)"
call usleep(40)
if (x3 /= 45) stop 3
x3 = 33
write (*,*) "task 3 (end)"
!$omp end task
!$omp task depend(depobj: obj(1), obj(2))
write (*,*) "task 4 (start)"
if (x1 /= 111) stop 41
if (x2 /= 222) stop 42
if (x3 /= 33) stop 43
call usleep(10)
x1 = 411
x2 = 422
x3 = 433
write (*,*) "task 4 (end)"
!$omp end task
!$omp task depend(in: ppp)
if (x1 /= 411) stop 51
if (x2 /= 422) stop 52
if (x3 /= 433) stop 53
write (*,*) "task 5"
!$omp end task
!$omp end single
!$omp end parallel
! expectation (task dependencies):
! 1 - 2 \
! 4 - 5
! 3 ----/
end program main
! Ensure that the pointer target address for ppp is taken
! but the address of bbb itself:
! { dg-final { scan-tree-dump-times "#pragma omp task depend\\(out:ppp\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "#pragma omp task depend\\(inout:ppp\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "#pragma omp task depend\\(out:&bbb\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "#pragma omp task depend\\(depobj:&obj\\\[0\\\]\\) depend\\(depobj:&obj\\\[1\\\]\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "#pragma omp task depend\\(in:ppp\\)" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "MEM\\\[\[^\r\n]+\\\] = ppp;" 1 "gimple" } }
! { dg-final { scan-tree-dump-times "MEM\\\[\[^\r\n]+\\\] = &bbb;" 1 "gimple" } }