xref: /llvm-project/offload/test/offloading/fortran/target-map-pointer-scopes-enter-exit.f90 (revision 372344995568cae076477a8b0e98fcdec7c49379)
1*37234499Sagozillon! Offloading test checking interaction of pointers with target in different
2*37234499Sagozillon! scopes
388234488SEthan Luis McDonough! REQUIRES: flang, amdgpu
4330d8983SJohannes Doerfert
5330d8983SJohannes Doerfert! RUN: %libomptarget-compile-fortran-run-and-check-generic
6330d8983SJohannes Doerfertmodule test
7330d8983SJohannes Doerfert    contains
8330d8983SJohannes Doerfert  subroutine func_arg(arg_alloc)
9330d8983SJohannes Doerfert    integer,  pointer, intent (inout) :: arg_alloc(:)
10330d8983SJohannes Doerfert
11330d8983SJohannes Doerfert  !$omp target enter data map(alloc: arg_alloc)
12330d8983SJohannes Doerfert
13330d8983SJohannes Doerfert  !$omp target
14330d8983SJohannes Doerfert    do index = 1, 10
15330d8983SJohannes Doerfert      arg_alloc(index) = arg_alloc(index) + index
16330d8983SJohannes Doerfert    end do
17330d8983SJohannes Doerfert  !$omp end target
18330d8983SJohannes Doerfert
19330d8983SJohannes Doerfert  !$omp target exit data map(from: arg_alloc)
20330d8983SJohannes Doerfert
21330d8983SJohannes Doerfert  !$omp target exit data map(delete: arg_alloc)
22330d8983SJohannes Doerfert
23330d8983SJohannes Doerfert    print *, arg_alloc
24330d8983SJohannes Doerfert  end subroutine func_arg
25330d8983SJohannes Doerfertend module
26330d8983SJohannes Doerfert
27330d8983SJohannes Doerfertsubroutine func
28330d8983SJohannes Doerfert  integer,  pointer :: local_alloc(:)
29330d8983SJohannes Doerfert  allocate(local_alloc(10))
30330d8983SJohannes Doerfert
31330d8983SJohannes Doerfert  !$omp target enter data map(alloc: local_alloc)
32330d8983SJohannes Doerfert
33330d8983SJohannes Doerfert  !$omp target
34330d8983SJohannes Doerfert    do index = 1, 10
35330d8983SJohannes Doerfert      local_alloc(index) = index
36330d8983SJohannes Doerfert    end do
37330d8983SJohannes Doerfert  !$omp end target
38330d8983SJohannes Doerfert
39330d8983SJohannes Doerfert  !$omp target exit data map(from: local_alloc)
40330d8983SJohannes Doerfert
41330d8983SJohannes Doerfert  !$omp target exit data map(delete: local_alloc)
42330d8983SJohannes Doerfert
43330d8983SJohannes Doerfert  print *, local_alloc
44330d8983SJohannes Doerfert
45330d8983SJohannes Doerfert  deallocate(local_alloc)
46330d8983SJohannes Doerfertend subroutine func
47330d8983SJohannes Doerfert
48330d8983SJohannes Doerfert
49330d8983SJohannes Doerfertprogram main
50330d8983SJohannes Doerfert  use test
51330d8983SJohannes Doerfert  integer,  pointer :: map_ptr(:)
52330d8983SJohannes Doerfert  allocate(map_ptr(10))
53330d8983SJohannes Doerfert
54330d8983SJohannes Doerfert  !$omp target enter data map(alloc: map_ptr)
55330d8983SJohannes Doerfert
56330d8983SJohannes Doerfert  !$omp target
57330d8983SJohannes Doerfert    do index = 1, 10
58330d8983SJohannes Doerfert      map_ptr(index) = index
59330d8983SJohannes Doerfert    end do
60330d8983SJohannes Doerfert  !$omp end target
61330d8983SJohannes Doerfert
62330d8983SJohannes Doerfert  !$omp target exit data map(from: map_ptr)
63330d8983SJohannes Doerfert
64330d8983SJohannes Doerfert  !$omp target exit data map(delete: map_ptr)
65330d8983SJohannes Doerfert
66330d8983SJohannes Doerfert  call func
67330d8983SJohannes Doerfert
68330d8983SJohannes Doerfert  print *, map_ptr
69330d8983SJohannes Doerfert
70330d8983SJohannes Doerfert  call func_arg(map_ptr)
71330d8983SJohannes Doerfert
72330d8983SJohannes Doerfert  deallocate(map_ptr)
73330d8983SJohannes Doerfertend program
74330d8983SJohannes Doerfert
75330d8983SJohannes Doerfert! CHECK: 1 2 3 4 5 6 7 8 9 10
76330d8983SJohannes Doerfert! CHECK: 1 2 3 4 5 6 7 8 9 10
77330d8983SJohannes Doerfert! CHECK: 2 4 6 8 10 12 14 16 18 20
78