1! { dg-do run } 2! 3! Test if, if_present clauses on host_data construct. 4 5! { dg-additional-options "-fopt-info-all-omp" } 6! { dg-additional-options "--param=openacc-privatization=noisy" } 7! { dg-additional-options "-foffload=-fopt-info-all-omp" } 8! { dg-additional-options "-foffload=--param=openacc-privatization=noisy" } 9! for testing/documenting aspects of that functionality. 10 11! Fortran variant of 'libgomp.oacc-c-c++-common/host_data-7.c'. 12! 13program main 14 use iso_c_binding 15 implicit none 16 real, target :: var, arr(100) 17 integer(c_intptr_t) :: host_p, host_parr 18 host_p = transfer(c_loc(var), host_p) 19 host_parr = transfer(c_loc(arr), host_parr) 20 call foo (var, arr, host_p, host_parr, .false.) 21 call foo (var, arr, host_p, host_parr, .true.) 22 23contains 24 25subroutine foo (p2, parr, host_p, host_parr, cond) 26 use openacc 27 implicit none 28 real, target, intent(in) :: parr(:), p2 29 integer(c_intptr_t), value, intent(in) :: host_p, host_parr 30 logical, value, intent(in) :: cond 31 real, pointer :: p 32 p => p2 33 34 if (host_p /= transfer(c_loc(p), host_p)) stop 1 35 if (host_parr /= transfer(c_loc(parr), host_parr)) stop 2 36#if !ACC_MEM_SHARED 37 if (acc_is_present(p, c_sizeof(p))) stop 3 38 if (acc_is_present(parr, 1)) stop 4 39#endif 40 41 !$acc data copyin(host_p, host_parr) 42 ! { dg-note {variable 'C\.[0-9]+' declared in block potentially has improper OpenACC privatization level: 'const_decl'} "TODO" { target { ! openacc_host_selected } } .-1 } 43 ! { dg-note {variable 'D\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target { ! openacc_host_selected } } .-2 } 44 ! { dg-note {variable 'p\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-3 } 45 ! { dg-note {variable 'parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-4 } 46 ! { dg-note {variable 'parm\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target { ! openacc_host_selected } } .-5 } 47#if !ACC_MEM_SHARED 48 if (acc_is_present(p, c_sizeof(p))) stop 5 49 if (acc_is_present(parr, 1)) stop 6 50#endif 51 !$acc host_data use_device(p, parr) if_present 52 ! { dg-note {variable 'D\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-1 } 53 ! { dg-note {variable 'transfer\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-2 } 54 ! { dg-note {variable 'host_p\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-3 } 55 ! { dg-note {variable 'parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-4 } 56 ! { dg-note {variable 'host_parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-5 } 57 ! { dg-note {variable 'D\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-6 } 58 ! { dg-note {variable 'transfer\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-7 } 59 ! { dg-note {variable 'parm\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-8 } 60 ! not mapped yet, so it will be equal to the host pointer. 61 if (transfer(c_loc(p), host_p) /= host_p) stop 7 62 if (transfer(c_loc(parr), host_parr) /= host_parr) stop 8 63 !$acc end host_data 64#if !ACC_MEM_SHARED 65 if (acc_is_present(p, c_sizeof(p))) stop 9 66 if (acc_is_present(parr, 1)) stop 10 67#endif 68 69 !$acc data copy(p, parr) 70 ! { dg-note {variable 'p\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-1 } 71 ! { dg-note {variable 'D\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-2 } 72 ! { dg-note {variable 'parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-3 } 73 ! { dg-note {variable 'transfer\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-4 } 74 ! { dg-note {variable 'host_p\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-5 } 75 ! { dg-note {variable 'host_parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-6 } 76 ! { dg-note {variable 'C\.[0-9]+' declared in block potentially has improper OpenACC privatization level: 'const_decl'} "TODO" { target *-*-* } .-7 } 77 ! { dg-note {variable 'parm\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-8 } 78 ! { dg-note {variable 'D\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-9 } 79 ! { dg-note {variable 'transfer\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-10 } 80 ! { dg-note {variable 'parm\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-11 } 81 if (.not. acc_is_present(p, c_sizeof(p))) stop 11 82 if (.not. acc_is_present(parr, 1)) stop 12 83 ! Not inside a host_data construct, so still the host pointer. 84 if (transfer(c_loc(p), host_p) /= host_p) stop 13 85 if (transfer(c_loc(parr), host_parr) /= host_parr) stop 14 86 87 !$acc host_data use_device(p, parr) 88 ! { dg-note {variable 'D\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-1 } 89 ! { dg-note {variable 'transfer\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-2 } 90 ! { dg-note {variable 'host_p\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-3 } 91 ! { dg-note {variable 'parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-4 } 92 ! { dg-note {variable 'host_parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-5 } 93 ! { dg-note {variable 'D\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-6 } 94 ! { dg-note {variable 'transfer\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-7 } 95 ! { dg-note {variable 'parm\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-8 } 96#if ACC_MEM_SHARED 97 if (transfer(c_loc(p), host_p) /= host_p) stop 15 98 if (transfer(c_loc(parr), host_parr) /= host_parr) stop 16 99#else 100 ! The device address is different from host address. 101 if (transfer(c_loc(p), host_p) == host_p) stop 17 102 if (transfer(c_loc(parr), host_parr) == host_parr) stop 18 103#endif 104 !$acc end host_data 105 106 !$acc host_data use_device(p, parr) if_present 107 ! { dg-note {variable 'D\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-1 } 108 ! { dg-note {variable 'transfer\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-2 } 109 ! { dg-note {variable 'host_p\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-3 } 110 ! { dg-note {variable 'parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-4 } 111 ! { dg-note {variable 'host_parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-5 } 112 ! { dg-note {variable 'parm\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-6 } 113 ! { dg-note {variable 'D\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-7 } 114 ! { dg-note {variable 'transfer\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-8 } 115#if ACC_MEM_SHARED 116 if (transfer(c_loc(p), host_p) /= host_p) stop 19 117 if (transfer(c_loc(parr), host_parr) /= host_parr) stop 20 118#else 119 ! is present now, so this is the same as above. 120 if (transfer(c_loc(p), host_p) == host_p) stop 21 121 if (transfer(c_loc(parr), host_parr) == host_parr) stop 22 122#endif 123 !$acc end host_data 124 125 !$acc host_data use_device(p, parr) if(cond) 126 ! { dg-note {variable 'D\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-1 } 127 ! { dg-note {variable 'transfer\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-2 } 128 ! { dg-note {variable 'host_p\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-3 } 129 ! { dg-note {variable 'parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-4 } 130 ! { dg-note {variable 'host_parr\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-5 } 131 ! { dg-note {variable 'parm\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } .-6 } 132 ! { dg-note {variable 'D\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-7 } 133 ! { dg-note {variable 'transfer\.[0-9]+' declared in block is candidate for adjusting OpenACC privatization level} "TODO" { target *-*-* } .-8 } 134#if ACC_MEM_SHARED 135 if (transfer(c_loc(p), host_p) /= host_p) stop 23 136 if (transfer(c_loc(parr), host_parr) /= host_parr) stop 24 137#else 138 ! is the device pointer iff cond is true. 139 if ((transfer(c_loc(p), host_p) /= host_p) .neqv. cond) stop 25 140 if ((transfer(c_loc(parr), host_parr) /= host_parr) .neqv. cond) stop 26 141#endif 142 !$acc end host_data 143 !$acc end data 144 !$acc end data 145end subroutine foo 146end 147