mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
This should have been part of commit r16-838-gb3d07ec7ac2ccd or r16-883-g5d6ed6d604ff94 - all showing the same issue: '!$omp target' followed by a metadirective with 'teams'; if the metadirective cannot be early resolved, a diagnostic error is shown about using directives between 'target' and 'teams'. While the message is misleading, the problem is that the host invokes 'target' differently when 'teams' is present; in this case, host fallback + amdgcn offload require the no-teams case, nvptx offload the teams case such that it only can be resolved at runtime. Mark the error as 'dg-bogus + xfail' to silence the FAIL, when nvptx offloading is compiled for. (If not, the metadirective can be resolved early during compilation.) libgomp/ChangeLog: PR middle-end/118694 * testsuite/libgomp.fortran/metadirective-1.f90: xfail when compiling (also) for nvptx offloading as an error is then expected.
69 lines
1.7 KiB
Fortran
69 lines
1.7 KiB
Fortran
! { dg-do run { target { ! offload_target_nvptx } } }
|
|
! { dg-do compile { target offload_target_nvptx } }
|
|
|
|
program test
|
|
implicit none
|
|
|
|
integer, parameter :: N = 100
|
|
integer :: x(N), y(N), z(N)
|
|
integer :: i
|
|
|
|
do i = 1, N
|
|
x(i) = i;
|
|
y(i) = -i;
|
|
end do
|
|
|
|
call f (x, y, z)
|
|
|
|
do i = 1, N
|
|
if (z(i) .ne. x(i) * y(i)) stop 1
|
|
end do
|
|
|
|
! -----
|
|
do i = 1, N
|
|
x(i) = i;
|
|
y(i) = -i;
|
|
end do
|
|
|
|
call g (x, y, z)
|
|
|
|
do i = 1, N
|
|
if (z(i) .ne. x(i) * y(i)) stop 1
|
|
end do
|
|
|
|
contains
|
|
subroutine f (x, y, z)
|
|
integer :: x(N), y(N), z(N)
|
|
! The following fails as on the host the target side cannot be
|
|
! resolved - and the 'teams' or not status affects how 'target'
|
|
! is called. -> See PR118694, esp. comment 9.
|
|
! Note also the dg-do compile above for offload_target_nvptx
|
|
|
|
!$omp target map (to: x, y) map(from: z)
|
|
block
|
|
!$omp metadirective &
|
|
!$omp& when(device={arch("nvptx")}: teams loop) &
|
|
!$omp& default(parallel loop)
|
|
do i = 1, N
|
|
z(i) = x(i) * y(i)
|
|
enddo
|
|
end block
|
|
! { dg-bogus "'target' construct with nested 'teams' construct contains directives outside of the 'teams' construct" "PR118694" { xfail offload_target_nvptx } .-9 } */
|
|
end subroutine
|
|
subroutine g (x, y, z)
|
|
integer :: x(N), y(N), z(N)
|
|
|
|
!$omp target map (to: x, y) map(from: z)
|
|
block
|
|
!$omp metadirective &
|
|
!$omp& when(device={arch("nvptx")}: teams loop) &
|
|
!$omp& default(parallel loop)
|
|
do i = 1, N
|
|
z(i) = x(i) * y(i)
|
|
enddo
|
|
end block
|
|
! { dg-bogus "'target' construct with nested 'teams' construct contains directives outside of the 'teams' construct" "PR118694" { xfail offload_target_nvptx } .-9 } */
|
|
!$omp end target
|
|
end subroutine
|
|
end program
|