| ! { dg-additional-options "-cpp" } |
| ! |
| ! Ensure that polymorphic mapping is diagnosed as undefined behavior |
| ! Ensure that static access to polymorphic variables works |
| |
| ! Some extended tests are only run with shared memory |
| ! To enforce this (where possible) on the device side: |
| ! #define USE_USM_REQUIREMENT |
| ! which is done in map-alloc-comp-9-usm.f90 |
| |
| subroutine test(case) |
| implicit none(type, external) |
| #ifdef USE_USM_REQUIREMENT |
| !$omp requires unified_shared_memory |
| #endif |
| |
| type t |
| integer :: x(4) |
| end type t |
| |
| type ta |
| integer, allocatable :: x(:) |
| end type ta |
| |
| type t2 |
| class(t), allocatable :: x |
| class(t), allocatable :: x2(:) |
| end type t2 |
| |
| type t3 |
| type(t2) :: y |
| type(t2) :: y2(2) |
| end type t3 |
| |
| type t4 |
| type(t3), allocatable :: y |
| type(t3), allocatable :: y2(:) |
| end type t4 |
| |
| integer, value :: case |
| |
| logical :: is_shared_mem |
| |
| ! Mangle stack addresses |
| integer, volatile :: case_var(100*case) |
| |
| type(t), allocatable :: var1 |
| type(ta), allocatable :: var1a |
| class(t), allocatable :: var2 |
| type(t2), allocatable :: var3 |
| type(t4), allocatable :: var4 |
| |
| case_var(100) = 0 |
| !print *, 'case', case |
| |
| var1 = t([1,2,3,4]) |
| var1a = ta([-1,-2,-3,-4,-5]) |
| |
| var2 = t([11,22,33,44]) |
| |
| allocate(t2 :: var3) |
| allocate(t :: var3%x) |
| allocate(t :: var3%x2(2)) |
| var3%x%x = [111,222,333,444] |
| var3%x2(1)%x = 2*[111,222,333,444] |
| var3%x2(2)%x = 3*[111,222,333,444] |
| |
| allocate(t4 :: var4) |
| allocate(t3 :: var4%y) |
| allocate(t3 :: var4%y2(2)) |
| allocate(t :: var4%y%y%x) |
| allocate(t :: var4%y%y%x2(2)) |
| allocate(t :: var4%y2(1)%y%x) |
| allocate(t :: var4%y2(1)%y%x2(2)) |
| allocate(t :: var4%y2(2)%y%x) |
| allocate(t :: var4%y2(2)%y%x2(2)) |
| var4%y%y%x%x = -1 * [1111,2222,3333,4444] |
| var4%y%y%x2(1)%x = -2 * [1111,2222,3333,4444] |
| var4%y%y%x2(2)%x = -3 * [1111,2222,3333,4444] |
| var4%y2(1)%y%x%x = -4 * [1111,2222,3333,4444] |
| var4%y2(1)%y%x2(1)%x = -5 * [1111,2222,3333,4444] |
| var4%y2(1)%y%x2(2)%x = -6 * [1111,2222,3333,4444] |
| var4%y2(2)%y%x%x = -7 * [1111,2222,3333,4444] |
| var4%y2(2)%y%x2(1)%x = -8 * [1111,2222,3333,4444] |
| var4%y2(2)%y%x2(2)%x = -9 * [1111,2222,3333,4444] |
| |
| #ifdef USE_USM_REQUIREMENT |
| is_shared_mem = .true. |
| #else |
| is_shared_mem = .false. |
| !$omp target map(to: is_shared_mem) |
| is_shared_mem = .true. |
| !$omp end target |
| #endif |
| |
| if (case == 1) then |
| ! implicit mapping |
| !$omp target |
| if (any (var1%x /= [1,2,3,4])) stop 1 |
| var1%x = 2 * var1%x |
| !$omp end target |
| |
| !$omp target |
| if (any (var1a%x /= [-1,-2,-3,-4])) stop 2 |
| var1a%x = 3 * var1a%x |
| !$omp end target |
| |
| !$omp target ! { dg-warning "Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var2%x /= [11,22,33,44])) stop 3 |
| var2%x = 4 * var2%x |
| !$omp end target |
| |
| !$omp target ! { dg-warning "Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var3%x%x /= [111,222,333,444])) stop 4 |
| var3%x%x = 5 * var3%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4 |
| if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4 |
| var3%x2(1)%x = 5 * var3%x2(1)%x |
| var3%x2(2)%x = 5 * var3%x2(2)%x |
| end if |
| !$omp end target |
| |
| !$omp target ! { dg-warning "Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5 |
| end if |
| var4%y%y%x%x = 6 * var4%y%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x |
| var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x |
| endif |
| var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x |
| var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x |
| endif |
| var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x |
| var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x |
| endif |
| !$omp end target |
| |
| else if (case == 2) then |
| ! Use target with defaultmap(TO) |
| |
| !$omp target defaultmap(to : all) |
| if (any (var1%x /= [1,2,3,4])) stop 1 |
| var1%x = 2 * var1%x |
| !$omp end target |
| |
| !$omp target defaultmap(to : all) |
| if (any (var1a%x /= [-1,-2,-3,-4])) stop 2 |
| var1a%x = 3 * var1a%x |
| !$omp end target |
| |
| !$omp target defaultmap(to : all) ! { dg-warning "Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var2%x /= [11,22,33,44])) stop 3 |
| var2%x = 4 * var2%x |
| !$omp end target |
| |
| !$omp target defaultmap(to : all) ! { dg-warning "Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var3%x%x /= [111,222,333,444])) stop 4 |
| var3%x%x = 5 * var3%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4 |
| if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4 |
| var3%x2(1)%x = 5 * var3%x2(1)%x |
| var3%x2(2)%x = 5 * var3%x2(2)%x |
| endif |
| !$omp end target |
| |
| !$omp target defaultmap(to : all) firstprivate(is_shared_mem) ! { dg-warning "Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5 |
| endif |
| var4%y%y%x%x = 6 * var4%y%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x |
| var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x |
| endif |
| var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x |
| var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x |
| endif |
| var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x |
| var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x |
| endif |
| !$omp end target |
| |
| else if (case == 3) then |
| ! Use target with map clause |
| |
| !$omp target map(tofrom: var1) |
| if (any (var1%x /= [1,2,3,4])) stop 1 |
| var1%x = 2 * var1%x |
| !$omp end target |
| |
| !$omp target map(tofrom: var1a) |
| if (any (var1a%x /= [-1,-2,-3,-4])) stop 2 |
| var1a%x = 3 * var1a%x |
| !$omp end target |
| |
| !$omp target map(tofrom: var2) ! { dg-warning "28: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var2%x /= [11,22,33,44])) stop 3 |
| var2%x = 4 * var2%x |
| !$omp end target |
| |
| !$omp target map(tofrom: var3) ! { dg-warning "28: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var3%x%x /= [111,222,333,444])) stop 4 |
| var3%x%x = 5 * var3%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4 |
| if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4 |
| var3%x2(1)%x = 5 * var3%x2(1)%x |
| var3%x2(2)%x = 5 * var3%x2(2)%x |
| endif |
| !$omp end target |
| |
| !$omp target map(tofrom: var4) ! { dg-warning "28: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5 |
| end if |
| if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5 |
| endif |
| var4%y%y%x%x = 6 * var4%y%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x |
| var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x |
| endif |
| var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x |
| var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x |
| endif |
| var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x |
| var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x |
| endif |
| !$omp end target |
| |
| else if (case == 4) then |
| ! Use target with map clause -- NOTE: This uses TO not TOFROM |
| |
| !$omp target map(to: var1) |
| if (any (var1%x /= [1,2,3,4])) stop 1 |
| var1%x = 2 * var1%x |
| !$omp end target |
| |
| !$omp target map(to: var1a) |
| if (any (var1a%x /= [-1,-2,-3,-4])) stop 2 |
| var1a%x = 3 * var1a%x |
| !$omp end target |
| |
| !$omp target map(to: var2) ! { dg-warning "24: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var2%x /= [11,22,33,44])) stop 3 |
| var2%x = 4 * var2%x |
| !$omp end target |
| |
| !$omp target map(to: var3) ! { dg-warning "24: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var3%x%x /= [111,222,333,444])) stop 4 |
| var3%x%x = 5 * var3%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4 |
| if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4 |
| var3%x2(1)%x = 5 * var3%x2(1)%x |
| var3%x2(2)%x = 5 * var3%x2(2)%x |
| endif |
| !$omp end target |
| |
| !$omp target map(to: var4) ! { dg-warning "24: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5 |
| endif |
| var4%y%y%x%x = 6 * var4%y%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x |
| var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x |
| endif |
| var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x |
| var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x |
| endif |
| var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x |
| var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x |
| endif |
| !$omp end target |
| |
| else if (case == 5) then |
| ! Use target enter/exit data + target with explicit map |
| !$omp target enter data map(to: var1) |
| !$omp target enter data map(to: var1a) |
| !$omp target enter data map(to: var2) ! { dg-warning "35: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" } |
| !$omp target enter data map(to: var3) ! { dg-warning "35: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| !$omp target enter data map(to: var4) ! { dg-warning "35: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| |
| !$omp target map(to: var1) |
| if (any (var1%x /= [1,2,3,4])) stop 1 |
| var1%x = 2 * var1%x |
| !$omp end target |
| |
| !$omp target map(to: var1a) |
| if (any (var1a%x /= [-1,-2,-3,-4])) stop 2 |
| var1a%x = 3 * var1a%x |
| !$omp end target |
| |
| !$omp target map(to: var2) ! { dg-warning "24: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var2%x /= [11,22,33,44])) stop 3 |
| var2%x = 4 * var2%x |
| !$omp end target |
| |
| !$omp target map(to: var3) ! { dg-warning "24: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var3%x%x /= [111,222,333,444])) stop 4 |
| var3%x%x = 5 * var3%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4 |
| if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4 |
| var3%x2(1)%x = 5 * var3%x2(1)%x |
| var3%x2(2)%x = 5 * var3%x2(2)%x |
| endif |
| !$omp end target |
| |
| !$omp target map(to: var4) ! { dg-warning "24: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5 |
| endif |
| var4%y%y%x%x = 6 * var4%y%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x |
| var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x |
| endif |
| var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x |
| var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x |
| endif |
| var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x |
| var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x |
| endif |
| !$omp end target |
| |
| !$omp target exit data map(from: var1) |
| !$omp target exit data map(from: var1a) |
| !$omp target exit data map(from: var2) ! { dg-warning "36: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" } |
| !$omp target exit data map(from: var3) ! { dg-warning "36: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| !$omp target exit data map(from: var4) ! { dg-warning "36: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| |
| else if (case == 6) then |
| ! Use target enter/exit data + target with implicit map |
| |
| !$omp target enter data map(to: var1) |
| !$omp target enter data map(to: var1a) |
| !$omp target enter data map(to: var2) ! { dg-warning "35: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" } |
| !$omp target enter data map(to: var3) ! { dg-warning "35: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| !$omp target enter data map(to: var4) ! { dg-warning "35: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| |
| !$omp target |
| if (any (var1%x /= [1,2,3,4])) stop 1 |
| var1%x = 2 * var1%x |
| !$omp end target |
| |
| !$omp target |
| if (any (var1a%x /= [-1,-2,-3,-4])) stop 2 |
| var1a%x = 3 * var1a%x |
| !$omp end target |
| |
| !$omp target ! { dg-warning "Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var2%x /= [11,22,33,44])) stop 3 |
| var2%x = 4 * var2%x |
| !$omp end target |
| |
| !$omp target ! { dg-warning "Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var3%x%x /= [111,222,333,444])) stop 4 |
| var3%x%x = 5 * var3%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4 |
| if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4 |
| var3%x2(1)%x = 5 * var3%x2(1)%x |
| var3%x2(2)%x = 5 * var3%x2(2)%x |
| endif |
| !$omp end target |
| |
| !$omp target ! { dg-warning "Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5 |
| endif |
| if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5 |
| if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5 |
| endif |
| var4%y%y%x%x = 6 * var4%y%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x |
| var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x |
| endif |
| var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x |
| var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x |
| endif |
| var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x |
| var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x |
| endif |
| !$omp end target |
| |
| !$omp target exit data map(from: var1) |
| !$omp target exit data map(from: var1a) |
| !$omp target exit data map(from: var2) ! { dg-warning "36: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" } |
| !$omp target exit data map(from: var3) ! { dg-warning "36: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| !$omp target exit data map(from: var4) ! { dg-warning "36: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" } |
| |
| else |
| error stop |
| end if |
| |
| if ((case /= 2 .and. case /= 4) .or. is_shared_mem) then |
| ! The target update should have been active, check for the updated values |
| if (any (var1%x /= 2 * [1,2,3,4])) stop 11 |
| if (any (var1a%x /= 3 * [-1,-2,-3,-4])) stop 22 |
| if (any (var2%x /= 4 * [11,22,33,44])) stop 33 |
| |
| if (any (var3%x%x /= 5 * [111,222,333,444])) stop 44 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var3%x2(1)%x /= 2 * 5 * [111,222,333,444])) stop 44 |
| if (any (var3%x2(2)%x /= 3 * 5 * [111,222,333,444])) stop 44 |
| endif |
| |
| if (any (var4%y%y%x%x /= -1 * 6 * [1111,2222,3333,4444])) stop 55 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y%y%x2(1)%x /= -2 * 6 * [1111,2222,3333,4444])) stop 55 |
| if (any (var4%y%y%x2(2)%x /= -3 * 6 * [1111,2222,3333,4444])) stop 55 |
| endif |
| if (any (var4%y2(1)%y%x%x /= -4 * 6 * [1111,2222,3333,4444])) stop 55 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(1)%y%x2(1)%x /= -5 * 6 * [1111,2222,3333,4444])) stop 55 |
| if (any (var4%y2(1)%y%x2(2)%x /= -6 * 6 * [1111,2222,3333,4444])) stop 55 |
| endif |
| if (any (var4%y2(2)%y%x%x /= -7 * 6 * [1111,2222,3333,4444])) stop 55 |
| if (is_shared_mem) then ! For stride data, this accesses the host's _vtab |
| if (any (var4%y2(2)%y%x2(1)%x /= -8 * 6 * [1111,2222,3333,4444])) stop 55 |
| if (any (var4%y2(2)%y%x2(2)%x /= -9 * 6 * [1111,2222,3333,4444])) stop 55 |
| endif |
| else |
| ! The old host values should still be there as 'to:' created a device copy |
| if (any (var1%x /= [1,2,3,4])) stop 12 |
| if (any (var1a%x /= [-1,-2,-3,-4])) stop 22 |
| if (any (var2%x /= [11,22,33,44])) stop 33 |
| |
| if (any (var3%x%x /= [111,222,333,444])) stop 44 |
| ! .not. is_shared_mem: |
| ! if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 44 |
| ! if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 44 |
| |
| if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 55 |
| if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 55 |
| if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 55 |
| if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 55 |
| ! .not. is_shared_mem: |
| !if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 55 |
| !if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 55 |
| if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 55 |
| ! .not. is_shared_mem: |
| !if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 55 |
| !if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 55 |
| end if |
| if (case_var(100) /= 0) stop 123 |
| end subroutine test |
| |
| program main |
| use omp_lib |
| implicit none(type, external) |
| #ifdef USE_USM_REQUIREMENT |
| !$omp requires unified_shared_memory |
| #endif |
| |
| interface |
| subroutine test(case) |
| integer, value :: case |
| end |
| end interface |
| integer :: dev |
| call run_it(omp_get_default_device()) |
| do dev = 0, omp_get_num_devices() |
| call run_it(dev) |
| end do |
| call run_it(omp_initial_device) |
| ! print *, 'all done' |
| contains |
| subroutine run_it(dev) |
| integer, value :: dev |
| ! print *, 'DEVICE', dev |
| call omp_set_default_device(dev) |
| call test(1) |
| call test(2) |
| call test(3) |
| call test(4) |
| call test(5) |
| call test(6) |
| end |
| end |