Fix gcc.c-torture/execute/ieee/cdivchkf.c on hpux
[official-gcc.git] / libgomp / testsuite / libgomp.fortran / depend-6.f90
blobbb085f21fd76a0cabd3b2268ca42f28f10b025fc
1 ! { dg-additional-sources my-usleep.c }
2 ! { dg-additional-options -Wno-complain-wrong-lang }
4 module m
5 use omp_lib
6 implicit none
8 interface
9 subroutine usleep(t) bind(C, name="my_usleep")
10 use iso_c_binding
11 integer(c_int), value :: t
12 end subroutine
13 end interface
15 contains
16 subroutine test (ifval)
17 logical, value :: ifval
18 integer :: a(0:7), b(0:7), i
19 integer(omp_depend_kind) d1, d2
20 !$omp depobj (d1) depend(inout: omp_all_memory)
21 !$omp depobj (d2) depend(out: omp_all_memory)
22 do i = 0, 7
23 a(i) = i
24 b(i) = 2 * i
25 end do
26 !$omp parallel
27 block
28 !$omp single
29 block
30 !$omp task shared(a) depend(in: a(0))
31 block
32 call usleep (5000)
33 a(0) = 42
34 end block
35 !$omp task shared(a) depend(out: a(1))
36 block
37 call usleep (5000)
38 a(1) = 43
39 end block
40 !$omp task shared(a) depend(inout: a(2))
41 block
42 call usleep (5000)
43 a(2) = 44
44 end block
45 !$omp task shared(a) depend(mutexinoutset: a(3))
46 block
47 call usleep (5000)
48 a(3) = 45
49 end block
50 !$omp task shared(a)
51 block
52 call usleep (15000)
53 a(4) = 46
54 end block
55 !$omp task shared(b) depend(in: b(0))
56 block
57 call usleep (5000)
58 b(0) = 47
59 end block
60 !$omp task shared(b) depend(in: b(4))
61 block
62 call usleep (5000)
63 b(4) = 48
64 end block
65 !$omp task shared(b) depend(inoutset: b(5))
66 block
67 call usleep (5000)
68 b(5) = 49
69 end block
71 ! None of the above tasks depend on each other.
72 ! The following task depends on all but the a(4) = 46; one.
73 !$omp task shared(a, b) depend(depobj: d1) private(i) if(ifval)
74 block
75 if (a(0) /= 42 .or. a(1) /= 43 .or. a(2) /= 44 .or. a(3) /= 45 &
76 .or. a(5) /= 5 .or. a(6) /= 6 .or. a(7) /= 7 &
77 .or. b(0) /= 47 .or. b(1) /= 2 .or. b(2) /= 4 .or. b(3) /= 6 &
78 .or. b(4) /= 48 .or. b(5) /= 49 .or. b(6) /= 12 .or. b(7) /= 14) &
79 error stop
80 do i = 0, 7
81 if (i /= 4) &
82 a(i) = 3 * i + 7
83 end do
84 do i = 0, 7
85 b(i) = 4 * i - 7
86 end do
87 end block
88 ! The following task depends on both b(0) = 47; and
89 ! above omp_all_memory tasks, but as the latter depends on
90 ! the former, effectively it is dependent just on the omp_all_memory
91 ! task.
92 !$omp task shared(b) depend(inout: b(0))
93 block
94 call usleep (5000)
95 b(0) = 49
96 end block
97 ! The following task depends on all the above except a(4) = 46; one,
98 ! but it can be reduced to dependency on the above omp_all_memory
99 ! one and b(0) = 49; one.
100 !$omp task shared(a, b) depend(inout: b(6)) depend(depobj: d2) &
101 !$omp& depend(out: b(7)) private(i) if(ifval)
102 block
103 do i = 0, 7
104 if (i /= 4) then
105 if (a(i) /= 3 * i + 7) &
106 error stop
107 a(i) = 5 * i + 50
108 end if
109 end do
110 if (b(0) /= 49) &
111 error stop
112 b(0) = 6 * i + 57
113 do i = 1, 7
114 if (b(i) /= 4 * i - 7) &
115 error stop
116 b(i) = 6 * i + 57
117 end do
118 end block
119 !$omp taskwait
120 if (a(4) /= 46) &
121 error stop
122 end block
123 end block
124 !$omp depobj (d2) destroy
125 !$omp depobj (d1) destroy
127 end module m
129 use m
130 call test (.true.)
131 call test (.false.)