xref: /llvm-project/flang/test/Lower/OpenMP/use-device-ptr-to-use-device-addr.f90 (revision d84d0caf28902843e0aae7ac435daed9aa04e3e2)
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