1! The "use_device_addr" was added to the "target data" directive in OpenMP 5.0. 2! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %s -o - | FileCheck %s 3! RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=50 %s -o - | FileCheck %s 4 5! This tests primary goal is to check the promotion of non-CPTR arguments from 6! use_device_ptr to use_device_addr works, without breaking any functionality. 7 8!CHECK: func.func @{{.*}}only_use_device_ptr() 9 10!CHECK: omp.target_data use_device_addr(%{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}} : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.llvm_ptr<!fir.ref<!fir.array<?xf32>>>, !fir.llvm_ptr<!fir.ref<!fir.array<?xi32>>>) use_device_ptr(%{{.*}} -> %{{.*}} : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) { 11subroutine only_use_device_ptr 12 use iso_c_binding 13 integer, pointer, dimension(:) :: array 14 real, pointer :: pa(:) 15 type(c_ptr) :: cptr 16 17 !$omp target data use_device_ptr(pa, cptr, array) 18 !$omp end target data 19 end subroutine 20 21!CHECK: func.func @{{.*}}mix_use_device_ptr_and_addr() 22!CHECK: omp.target_data use_device_addr(%{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}} : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.llvm_ptr<!fir.ref<!fir.array<?xi32>>>, !fir.llvm_ptr<!fir.ref<!fir.array<?xf32>>>) use_device_ptr({{.*}} : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) { 23subroutine mix_use_device_ptr_and_addr 24 use iso_c_binding 25 integer, pointer, dimension(:) :: array 26 real, pointer :: pa(:) 27 type(c_ptr) :: cptr 28 29 !$omp target data use_device_ptr(pa, cptr) use_device_addr(array) 30 !$omp end target data 31 end subroutine 32 33 !CHECK: func.func @{{.*}}only_use_device_addr() 34 !CHECK: omp.target_data use_device_addr(%{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}} : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.llvm_ptr<!fir.ref<!fir.array<?xf32>>>, !fir.llvm_ptr<!fir.ref<!fir.array<?xi32>>>) { 35 subroutine only_use_device_addr 36 use iso_c_binding 37 integer, pointer, dimension(:) :: array 38 real, pointer :: pa(:) 39 type(c_ptr) :: cptr 40 41 !$omp target data use_device_addr(pa, cptr, array) 42 !$omp end target data 43 end subroutine 44 45 !CHECK: func.func @{{.*}}mix_use_device_ptr_and_addr_and_map() 46 !CHECK: omp.target_data map_entries(%{{.*}}, %{{.*}} : !fir.ref<i32>, !fir.ref<i32>) use_device_addr(%{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}}, %{{.*}} -> %{{.*}} : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.llvm_ptr<!fir.ref<!fir.array<?xi32>>>, !fir.llvm_ptr<!fir.ref<!fir.array<?xf32>>>) use_device_ptr(%{{.*}} : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) { 47 subroutine mix_use_device_ptr_and_addr_and_map 48 use iso_c_binding 49 integer :: i, j 50 integer, pointer, dimension(:) :: array 51 real, pointer :: pa(:) 52 type(c_ptr) :: cptr 53 54 !$omp target data use_device_ptr(pa, cptr) use_device_addr(array) map(tofrom: i, j) 55 !$omp end target data 56 end subroutine 57 58 !CHECK: func.func @{{.*}}only_use_map() 59 !CHECK: omp.target_data map_entries(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.llvm_ptr<!fir.ref<!fir.array<?xf32>>>, !fir.llvm_ptr<!fir.ref<!fir.array<?xi32>>>) { 60 subroutine only_use_map 61 use iso_c_binding 62 integer, pointer, dimension(:) :: array 63 real, pointer :: pa(:) 64 type(c_ptr) :: cptr 65 66 !$omp target data map(pa, cptr, array) 67 !$omp end target data 68 end subroutine 69