| ! { dg-do run } |
| ! { dg-additional-options "-fdump-tree-gimple" } |
| |
| ! Check that nested function calls in a dispatch region are handled correctly, |
| ! i.e. that the adjust_args clause is applied only to the outer call. |
| |
| module m |
| use iso_c_binding |
| use omp_lib |
| implicit none(type,external) |
| contains |
| integer function f(x, y1, y2, z1, z2) |
| allocatable :: f |
| integer, value :: x |
| type(c_ptr), value :: y1, y2 |
| type(c_ptr) :: z1, z2 |
| |
| if (x == 1) then ! HOST |
| block |
| integer, pointer :: iy1, iy2, iz1, iz2 |
| call c_f_pointer (y1, iy1) |
| call c_f_pointer (y2, iy2) |
| call c_f_pointer (z1, iz1) |
| call c_f_pointer (z2, iz2) |
| f = (iy1 + iy2) + 10 * (iz1+iz2) |
| end block |
| else |
| allocate(f) |
| !$omp target is_device_ptr(y1, y2, z1, z2) map(tofrom: f) |
| block |
| integer, pointer :: iy1, iy2, iz1, iz2 |
| call c_f_pointer (y1, iy1) |
| call c_f_pointer (y2, iy2) |
| call c_f_pointer (z1, iz1) |
| call c_f_pointer (z2, iz2) |
| f = -(iy1+iy2)*23 -127 * (iz1+iz2) - x * 3 |
| end block |
| end if |
| end |
| |
| integer function g(x, y1, y2, z1, z2) |
| !$omp declare variant(f) match(construct={dispatch}) adjust_args(need_device_ptr : y1, y2, z1, z2) |
| allocatable :: g |
| integer, value :: x |
| type(c_ptr), value :: y1, y2 |
| type(c_ptr) :: z1, z2 |
| g = x |
| stop 2 ! should not get called |
| end |
| end |
| |
| program main |
| use m |
| implicit none (type, external) |
| integer, target :: v1, v2 |
| integer :: res, ref |
| v1 = 5 |
| v2 = 11 |
| |
| ref = 5*2 + 10 * 11*2 |
| ref = -(5*2)*23 -127 * (11*2) - ref * 3 |
| |
| !$omp target data map(v1,v2) |
| res = func (c_loc(v1), c_loc(v1), c_loc(v2), c_loc(v2)) |
| !$omp end target data |
| |
| if (res /= ref) stop 1 |
| contains |
| integer function func(x1, x2, x3, x4) |
| use m |
| implicit none(type,external) |
| type(c_ptr) :: x1, x2, x3, x4 |
| value :: x1, x3 |
| |
| !$omp dispatch |
| func = g(g(1,x1,x2,x3,x4), x1,x2,x3,x4) |
| end |
| end |
| |
| ! { dg-final { scan-tree-dump-times "__builtin_omp_get_mapped_ptr" 4 "gimple" } } |