xref: /llvm-project/flang/test/Lower/OpenMP/use-device-ptr-to-use-device-addr.f90 (revision d84d0caf28902843e0aae7ac435daed9aa04e3e2)
1deafb36fSKrzysztof Parzyszek! The "use_device_addr" was added to the "target data" directive in OpenMP 5.0.
2deafb36fSKrzysztof Parzyszek! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %s -o - | FileCheck %s
3deafb36fSKrzysztof Parzyszek! RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=50 %s -o - | FileCheck %s
4096ee4e1Sagozillon
59ba41031SAkash Banerjee! This tests primary goal is to check the promotion of non-CPTR arguments from
69ba41031SAkash Banerjee! use_device_ptr to use_device_addr works, without breaking any functionality.
7096ee4e1Sagozillon
8096ee4e1Sagozillon!CHECK: func.func @{{.*}}only_use_device_ptr()
9*d84d0cafSagozillon
10*d84d0cafSagozillon!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}>>) {
11096ee4e1Sagozillonsubroutine only_use_device_ptr
12096ee4e1Sagozillon    use iso_c_binding
13096ee4e1Sagozillon    integer, pointer, dimension(:) :: array
14096ee4e1Sagozillon    real, pointer :: pa(:)
15096ee4e1Sagozillon    type(c_ptr) :: cptr
16096ee4e1Sagozillon
17096ee4e1Sagozillon       !$omp target data use_device_ptr(pa, cptr, array)
18096ee4e1Sagozillon       !$omp end target data
19096ee4e1Sagozillon     end subroutine
20096ee4e1Sagozillon
21096ee4e1Sagozillon!CHECK: func.func @{{.*}}mix_use_device_ptr_and_addr()
22*d84d0cafSagozillon!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}>>) {
23096ee4e1Sagozillonsubroutine mix_use_device_ptr_and_addr
24096ee4e1Sagozillon    use iso_c_binding
25096ee4e1Sagozillon    integer, pointer, dimension(:) :: array
26096ee4e1Sagozillon    real, pointer :: pa(:)
27096ee4e1Sagozillon    type(c_ptr) :: cptr
28096ee4e1Sagozillon
29096ee4e1Sagozillon       !$omp target data use_device_ptr(pa, cptr) use_device_addr(array)
30096ee4e1Sagozillon       !$omp end target data
31096ee4e1Sagozillon     end subroutine
32096ee4e1Sagozillon
33096ee4e1Sagozillon     !CHECK: func.func @{{.*}}only_use_device_addr()
34*d84d0cafSagozillon     !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>>>) {
35096ee4e1Sagozillon     subroutine only_use_device_addr
36096ee4e1Sagozillon        use iso_c_binding
37096ee4e1Sagozillon        integer, pointer, dimension(:) :: array
38096ee4e1Sagozillon        real, pointer :: pa(:)
39096ee4e1Sagozillon        type(c_ptr) :: cptr
40096ee4e1Sagozillon
41096ee4e1Sagozillon       !$omp target data use_device_addr(pa, cptr, array)
42096ee4e1Sagozillon       !$omp end target data
43096ee4e1Sagozillon     end subroutine
44096ee4e1Sagozillon
45096ee4e1Sagozillon     !CHECK: func.func @{{.*}}mix_use_device_ptr_and_addr_and_map()
46*d84d0cafSagozillon     !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}>>) {
47096ee4e1Sagozillon     subroutine mix_use_device_ptr_and_addr_and_map
48096ee4e1Sagozillon        use iso_c_binding
49096ee4e1Sagozillon        integer :: i, j
50096ee4e1Sagozillon        integer, pointer, dimension(:) :: array
51096ee4e1Sagozillon        real, pointer :: pa(:)
52096ee4e1Sagozillon        type(c_ptr) :: cptr
53096ee4e1Sagozillon
54096ee4e1Sagozillon       !$omp target data use_device_ptr(pa, cptr) use_device_addr(array) map(tofrom: i, j)
55096ee4e1Sagozillon       !$omp end target data
56096ee4e1Sagozillon     end subroutine
57096ee4e1Sagozillon
58096ee4e1Sagozillon     !CHECK: func.func @{{.*}}only_use_map()
59*d84d0cafSagozillon     !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>>>) {
60096ee4e1Sagozillon     subroutine only_use_map
61096ee4e1Sagozillon        use iso_c_binding
62096ee4e1Sagozillon        integer, pointer, dimension(:) :: array
63096ee4e1Sagozillon        real, pointer :: pa(:)
64096ee4e1Sagozillon        type(c_ptr) :: cptr
65096ee4e1Sagozillon
66096ee4e1Sagozillon       !$omp target data map(pa, cptr, array)
67096ee4e1Sagozillon       !$omp end target data
68096ee4e1Sagozillon     end subroutine
69