|  | ! { dg-do run } | 
|  | ! { dg-options "-fcray-pointer" } | 
|  |  | 
|  | use iso_c_binding, only : c_ptr, c_ptrdiff_t, c_loc | 
|  | interface | 
|  | subroutine foo (x, y, z, w) | 
|  | use iso_c_binding, only : c_ptr | 
|  | real, pointer :: x(:), y(:), w(:) | 
|  | type(c_ptr) :: z | 
|  | end subroutine | 
|  | subroutine bar (x, y, z, w) | 
|  | use iso_c_binding, only : c_ptr | 
|  | real, pointer :: x(:), y(:), w(:) | 
|  | type(c_ptr) :: z | 
|  | end subroutine | 
|  | subroutine baz (x, c) | 
|  | real, pointer :: x(:) | 
|  | real, allocatable :: c(:) | 
|  | end subroutine | 
|  | end interface | 
|  | type dt | 
|  | real, allocatable :: a(:) | 
|  | end type | 
|  | type (dt) :: b(64) | 
|  | real, target :: a(4096+63) | 
|  | real, pointer :: p(:), q(:), r(:), s(:) | 
|  | real, allocatable :: c(:) | 
|  | integer(c_ptrdiff_t) :: o | 
|  | integer :: i | 
|  | o = 64 - mod (loc (a), 64) | 
|  | if (o == 64) o = 0 | 
|  | o = o / sizeof(0.0) | 
|  | p => a(o + 1:o + 1024) | 
|  | q => a(o + 1025:o + 2048) | 
|  | r => a(o + 2049:o + 3072) | 
|  | s => a(o + 3073:o + 4096) | 
|  | do i = 1, 1024 | 
|  | p(i) = i | 
|  | q(i) = i | 
|  | r(i) = i | 
|  | s(i) = i | 
|  | end do | 
|  | call foo (p, q, c_loc (r(1)), s) | 
|  | do i = 1, 1024 | 
|  | if (p(i) /= i * i + 3 * i + 2) stop 1 | 
|  | p(i) = i | 
|  | end do | 
|  | call bar (p, q, c_loc (r(1)), s) | 
|  | do i = 1, 1024 | 
|  | if (p(i) /= i * i + 3 * i + 2) stop 2 | 
|  | end do | 
|  | ! Attempt to create 64-byte aligned allocatable | 
|  | do i = 1, 64 | 
|  | allocate (c(1023 + i)) | 
|  | if (iand (int(loc(c(1)),8), 63_8) == 0) exit | 
|  | deallocate (c) | 
|  | allocate (b(i)%a(1023 + i)) | 
|  | allocate (c(1023 + i)) | 
|  | if (iand (int(loc(c(1)),8), 63_8) == 0) exit | 
|  | deallocate (c) | 
|  | end do | 
|  | if (allocated (c)) then | 
|  | do i = 1, 1024 | 
|  | c(i) = 2 * i | 
|  | end do | 
|  | call baz (p, c) | 
|  | do i = 1, 1024 | 
|  | if (p(i) /= i * i + 5 * i + 2) stop 3 | 
|  | end do | 
|  | end if | 
|  | end | 
|  | subroutine foo (x, y, z, w) | 
|  | use iso_c_binding, only : c_ptr, c_f_pointer | 
|  | real, pointer :: x(:), y(:), w(:), p(:) | 
|  | type(c_ptr) :: z | 
|  | integer :: i | 
|  | real :: pt(1024) | 
|  | pointer (ip, pt) | 
|  | ip = loc (w) | 
|  | !$omp simd aligned (x, y : 64) | 
|  | do i = 1, 1024 | 
|  | x(i) = x(i) * y(i) + 2.0 | 
|  | end do | 
|  | !$omp simd aligned (x, z : 64) private (p) | 
|  | do i = 1, 1024 | 
|  | call c_f_pointer (z, p, shape=[1024]) | 
|  | x(i) = x(i) + p(i) | 
|  | end do | 
|  | !$omp simd aligned (x, ip : 64) | 
|  | do i = 1, 1024 | 
|  | x(i) = x(i) + 2 * pt(i) | 
|  | end do | 
|  | !$omp end simd | 
|  | end subroutine | 
|  | subroutine bar (x, y, z, w) | 
|  | use iso_c_binding, only : c_ptr, c_f_pointer | 
|  | real, pointer :: x(:), y(:), w(:), a(:), b(:) | 
|  | type(c_ptr) :: z, c | 
|  | integer :: i | 
|  | real :: pt(1024) | 
|  | pointer (ip, pt) | 
|  | ip = loc (w) | 
|  | a => x | 
|  | b => y | 
|  | c = z | 
|  | !$omp simd aligned (a, b : 64) | 
|  | do i = 1, 1024 | 
|  | a(i) = a(i) * b(i) + 2.0 | 
|  | end do | 
|  | !$omp simd aligned (a, c : 64) | 
|  | do i = 1, 1024 | 
|  | block | 
|  | real, pointer :: p(:) | 
|  | call c_f_pointer (c, p, shape=[1024]) | 
|  | a(i) = a(i) + p(i) | 
|  | end block | 
|  | end do | 
|  | !$omp simd aligned (a, ip : 64) | 
|  | do i = 1, 1024 | 
|  | a(i) = a(i) + 2 * pt(i) | 
|  | end do | 
|  | !$omp end simd | 
|  | end subroutine | 
|  | subroutine baz (x, c) | 
|  | real, pointer :: x(:) | 
|  | real, allocatable :: c(:) | 
|  | integer :: i | 
|  | !$omp simd aligned (x, c : 64) | 
|  | do i = 1, 1024 | 
|  | x(i) = x(i) + c(i) | 
|  | end do | 
|  | !$omp end simd | 
|  | end subroutine baz |