69 lines · plain
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 %s3! RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=50 %s -o - | FileCheck %s4 5! This tests primary goal is to check the promotion of non-CPTR arguments from6! 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_ptr12 use iso_c_binding13 integer, pointer, dimension(:) :: array14 real, pointer :: pa(:)15 type(c_ptr) :: cptr16 17 !$omp target data use_device_ptr(pa, cptr, array)18 !$omp end target data19 end subroutine20 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_addr24 use iso_c_binding25 integer, pointer, dimension(:) :: array26 real, pointer :: pa(:)27 type(c_ptr) :: cptr28 29 !$omp target data use_device_ptr(pa, cptr) use_device_addr(array)30 !$omp end target data31 end subroutine32 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_addr36 use iso_c_binding37 integer, pointer, dimension(:) :: array38 real, pointer :: pa(:)39 type(c_ptr) :: cptr40 41 !$omp target data use_device_addr(pa, cptr, array)42 !$omp end target data43 end subroutine44 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_map48 use iso_c_binding49 integer :: i, j50 integer, pointer, dimension(:) :: array51 real, pointer :: pa(:)52 type(c_ptr) :: cptr53 54 !$omp target data use_device_ptr(pa, cptr) use_device_addr(array) map(tofrom: i, j)55 !$omp end target data56 end subroutine57 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_map61 use iso_c_binding62 integer, pointer, dimension(:) :: array63 real, pointer :: pa(:)64 type(c_ptr) :: cptr65 66 !$omp target data map(pa, cptr, array)67 !$omp end target data68 end subroutine69