summaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/lastprivate2.f90
blob: 6d7e11eab00e2e06d7bccb59f30d38e88d7b4619 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
program lastprivate
  integer :: i, k
  common /c/ i, k
  !$omp parallel num_threads (4)
  call test1
  !$omp end parallel
  if (i .ne. 21 .or. k .ne. 20) call abort
  !$omp parallel num_threads (4)
  call test2
  !$omp end parallel
  if (i .ne. 64 .or. k .ne. 61) call abort
  !$omp parallel num_threads (4)
  call test3
  !$omp end parallel
  if (i .ne. 14 .or. k .ne. 11) call abort
  call test4
  call test5
  call test6
  call test7
  call test8
  call test9
  call test10
  call test11
  call test12
contains
  subroutine test1
    integer :: i, k
    common /c/ i, k
    !$omp do lastprivate (i, k)
    do i = 1, 20
      k = i
    end do
  end subroutine test1
  subroutine test2
    integer :: i, k
    common /c/ i, k
    !$omp do lastprivate (i, k)
    do i = 7, 61, 3
      k = i
    end do
  end subroutine test2
  function ret3 ()
    integer :: ret3
    ret3 = 3
  end function ret3
  subroutine test3
    integer :: i, k
    common /c/ i, k
    !$omp do lastprivate (i, k)
    do i = -10, 11, ret3 ()
      k = i
    end do
  end subroutine test3
  subroutine test4
    integer :: j, l
    !$omp parallel do lastprivate (j, l) num_threads (4)
    do j = 1, 20
      l = j
    end do
    if (j .ne. 21 .or. l .ne. 20) call abort
  end subroutine test4
  subroutine test5
    integer :: j, l
    l = 77
    !$omp parallel do lastprivate (j, l) num_threads (4) firstprivate (l)
    do j = 7, 61, 3
      l = j
    end do
    if (j .ne. 64 .or. l .ne. 61) call abort
  end subroutine test5
  subroutine test6
    integer :: j, l
    !$omp parallel do lastprivate (j, l) num_threads (4)
    do j = -10, 11, ret3 ()
      l = j
    end do
    if (j .ne. 14 .or. l .ne. 11) call abort
  end subroutine test6
  subroutine test7
    integer :: i, k
    common /c/ i, k
    !$omp parallel do lastprivate (i, k) num_threads (4)
    do i = 1, 20
      k = i
    end do
    if (i .ne. 21 .or. k .ne. 20) call abort
  end subroutine test7
  subroutine test8
    integer :: i, k
    common /c/ i, k
    !$omp parallel do lastprivate (i, k) num_threads (4)
    do i = 7, 61, 3
      k = i
    end do
    if (i .ne. 64 .or. k .ne. 61) call abort
  end subroutine test8
  subroutine test9
    integer :: i, k
    common /c/ i, k
    k = 77
    !$omp parallel do lastprivate (i, k) num_threads (4) firstprivate (k)
    do i = -10, 11, ret3 ()
      k = i
    end do
    if (i .ne. 14 .or. k .ne. 11) call abort
  end subroutine test9
  subroutine test10
    integer :: i, k
    common /c/ i, k
    !$omp parallel num_threads (4)
    !$omp do lastprivate (i, k)
    do i = 1, 20
      k = i
    end do
    !$omp end parallel
    if (i .ne. 21 .or. k .ne. 20) call abort
  end subroutine test10
  subroutine test11
    integer :: i, k
    common /c/ i, k
    !$omp parallel num_threads (4)
    !$omp do lastprivate (i, k)
    do i = 7, 61, 3
      k = i
    end do
    !$omp end parallel
    if (i .ne. 64 .or. k .ne. 61) call abort
  end subroutine test11
  subroutine test12
    integer :: i, k
    common /c/ i, k
    k = 77
    !$omp parallel num_threads (4)
    !$omp do lastprivate (i, k) firstprivate (k)
    do i = -10, 11, ret3 ()
      k = i
    end do
    !$omp end parallel
    if (i .ne. 14 .or. k .ne. 11) call abort
  end subroutine test12
end program lastprivate