aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/allocate-7.f90
blob: 83f3eabfc3e1810df1780605a0881c78439934cb (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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
! { 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