xref: /llvm-project/flang/test/Lower/OpenMP/map-component-ref.f90 (revision e508bacce45d4fb2ba07d02c55391b858000c3b3)
1! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
2! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s
3
4! CHECK-LABEL: func.func @_QPfoo1
5! CHECK: %[[V0:[0-9]+]] = fir.alloca !fir.type<_QFfoo1Tt0{a0:i32,a1:i32}> {bindc_name = "a", uniq_name = "_QFfoo1Ea"}
6! CHECK: %[[V1:[0-9]+]]:2 = hlfir.declare %[[V0]] {uniq_name = "_QFfoo1Ea"} : (!fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>>) -> (!fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>>, !fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>>)
7! CHECK: %[[V2:[0-9]+]] = hlfir.designate %[[V1]]#0{"a1"}   : (!fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>>) -> !fir.ref<i32>
8! CHECK: %[[V3:[0-9]+]] = omp.map.info var_ptr(%[[V2]] : !fir.ref<i32>, i32) map_clauses(tofrom) capture(ByRef) -> !fir.ref<i32> {name = "a%a1"}
9! CHECK: %[[V4:[0-9]+]] = omp.map.info var_ptr(%[[V1]]#1 : !fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>>, !fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>) map_clauses(tofrom) capture(ByRef) members(%[[V3]] : [1] : !fir.ref<i32>) -> !fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>> {name = "a", partial_map = true}
10! CHECK: omp.target map_entries(%[[V4]] -> %arg0, %[[V3]] -> %arg1 : !fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>>, !fir.ref<i32>) {
11! CHECK:   %[[V5:[0-9]+]]:2 = hlfir.declare %arg0 {uniq_name = "_QFfoo1Ea"} : (!fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>>) -> (!fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>>, !fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>>)
12! CHECK:   %c0_i32 = arith.constant 0 : i32
13! CHECK:   %[[V6:[0-9]+]] = hlfir.designate %[[V5]]#0{"a1"}   : (!fir.ref<!fir.type<_QFfoo1Tt0{a0:i32,a1:i32}>>) -> !fir.ref<i32>
14! CHECK:   hlfir.assign %c0_i32 to %[[V6]] : i32, !fir.ref<i32>
15! CHECK:   omp.terminator
16! CHECK: }
17
18subroutine foo1()
19  implicit none
20
21  type t0
22    integer :: a0, a1
23  end type
24
25  type(t0) :: a
26
27  !$omp target map(a%a1)
28  a%a1 = 0
29  !$omp end target
30end
31
32
33! CHECK-LABEL: func.func @_QPfoo2
34! CHECK-DAG: omp.map.info var_ptr(%{{[0-9]+}} : {{.*}} map_clauses(to) capture(ByRef) bounds(%{{[0-9]+}}) -> {{.*}} {name = "t%b(1_8)%a(1)"}
35! CHECK-DAG: omp.map.info var_ptr(%{{[0-9]+}} : {{.*}} map_clauses(from) capture(ByRef) bounds(%{{[0-9]+}}) -> {{.*}} {name = "u%b(1_8)%a(1)"}
36subroutine foo2()
37  implicit none
38
39  type t0
40    integer :: a(10)
41  end type
42
43  type t1
44    type(t0) :: b(10)
45  end type
46
47  type(t1) :: t, u
48
49!$omp target map(to: t%b(1)%a(1)) map(from: u%b(1)%a(1))
50  t%b(1)%a(1) = u%b(1)%a(1)
51!$omp end target
52
53end
54