xref: /llvm-project/flang/test/Lower/pointer-initial-target-2.f90 (revision c1654c38e8b82a075613fd60f19a179b1c7df2a2)
1a1425019SValentin Clement! Test lowering of pointer initial target
2f35f863aSjeanPerier! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
3a1425019SValentin Clement
4a1425019SValentin Clement! This tests focus on the scope context of initial data target.
5a1425019SValentin Clement! More complete tests regarding the initial data target expression
6a1425019SValentin Clement! are done in pointer-initial-target.f90.
7a1425019SValentin Clement
82c8cb9acSJean Perier! Test pointer initial data target with pointer in common blocks
92c8cb9acSJean Perierblock data
102c8cb9acSJean Perier  real, pointer :: p
112c8cb9acSJean Perier  real, save, target :: b
122c8cb9acSJean Perier  common /a/ p
132c8cb9acSJean Perier  data p /b/
14*c1654c38SValentin Clement (バレンタイン クレメン)! CHECK-LABEL: fir.global @a_ {alignment = 8 : i64} : tuple<!fir.box<!fir.ptr<f32>>>
1587e25210SjeanPerier  ! CHECK: %[[undef:.*]] = fir.zero_bits tuple<!fir.box<!fir.ptr<f32>>>
162c8cb9acSJean Perier  ! CHECK: %[[b:.*]] = fir.address_of(@_QEb) : !fir.ref<f32>
17de2811eeSJean Perier  ! CHECK: %[[box:.*]] = fir.embox %[[b]] : (!fir.ref<f32>) -> !fir.box<f32>
18de2811eeSJean Perier  ! CHECK: %[[rebox:.*]] = fir.rebox %[[box]] : (!fir.box<f32>) -> !fir.box<!fir.ptr<f32>>
19de2811eeSJean Perier  ! CHECK: %[[a:.*]] = fir.insert_value %[[undef]], %[[rebox]], [0 : index] : (tuple<!fir.box<!fir.ptr<f32>>>, !fir.box<!fir.ptr<f32>>) -> tuple<!fir.box<!fir.ptr<f32>>>
202c8cb9acSJean Perier  ! CHECK: fir.has_value %[[a]] : tuple<!fir.box<!fir.ptr<f32>>>
212c8cb9acSJean Perierend block data
222c8cb9acSJean Perier
232c8cb9acSJean Perier! Test two common depending on each others because of initial data
242c8cb9acSJean Perier! targets
252c8cb9acSJean Perierblock data tied
262c8cb9acSJean Perier  real, target :: x1 = 42
272c8cb9acSJean Perier  real, target :: x2 = 43
282c8cb9acSJean Perier  real, pointer :: p1 => x2
292c8cb9acSJean Perier  real, pointer :: p2 => x1
302c8cb9acSJean Perier  common /c1/ x1, p1
312c8cb9acSJean Perier  common /c2/ x2, p2
32*c1654c38SValentin Clement (バレンタイン クレメン)! CHECK-LABEL: fir.global @c1_ {alignment = 8 : i64} : tuple<f32, !fir.array<4xi8>, !fir.box<!fir.ptr<f32>>>
336ffea74fSjeanPerier  ! CHECK: fir.address_of(@c2_) : !fir.ref<tuple<f32, !fir.array<4xi8>, !fir.box<!fir.ptr<f32>>>>
34*c1654c38SValentin Clement (バレンタイン クレメン)! CHECK-LABEL: fir.global @c2_ {alignment = 8 : i64} : tuple<f32, !fir.array<4xi8>, !fir.box<!fir.ptr<f32>>>
356ffea74fSjeanPerier  ! CHECK: fir.address_of(@c1_) : !fir.ref<tuple<f32, !fir.array<4xi8>, !fir.box<!fir.ptr<f32>>>>
362c8cb9acSJean Perierend block data
372c8cb9acSJean Perier
382c8cb9acSJean Perier! Test pointer in a common with initial target in the same common.
393077d614SPeter Klauslerblock data bdsnake
402c8cb9acSJean Perier  integer, target :: b = 42
412c8cb9acSJean Perier  integer, pointer :: p => b
422c8cb9acSJean Perier  common /snake/ p, b
43*c1654c38SValentin Clement (バレンタイン クレメン)! CHECK-LABEL: fir.global @snake_ {alignment = 8 : i64} : tuple<!fir.box<!fir.ptr<i32>>, i32>
4487e25210SjeanPerier  ! CHECK: %[[tuple0:.*]] = fir.zero_bits tuple<!fir.box<!fir.ptr<i32>>, i32>
456ffea74fSjeanPerier  ! CHECK: %[[snakeAddr:.*]] = fir.address_of(@snake_) : !fir.ref<tuple<!fir.box<!fir.ptr<i32>>, i32>>
462c8cb9acSJean Perier  ! CHECK: %[[byteView:.*]] = fir.convert %[[snakeAddr:.*]] : (!fir.ref<tuple<!fir.box<!fir.ptr<i32>>, i32>>) -> !fir.ref<!fir.array<?xi8>>
472c8cb9acSJean Perier  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[byteView]], %c24{{.*}} : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
482c8cb9acSJean Perier  ! CHECK: %[[bAddr:.*]] = fir.convert %[[coor]] : (!fir.ref<i8>) -> !fir.ref<i32>
49de2811eeSJean Perier  ! CHECK: %[[box:.*]] = fir.embox %[[bAddr]] : (!fir.ref<i32>) -> !fir.box<i32>
50de2811eeSJean Perier  ! CHECK: %[[rebox:.*]] = fir.rebox %[[box]] : (!fir.box<i32>) -> !fir.box<!fir.ptr<i32>>
51de2811eeSJean Perier  ! CHECK: %[[tuple1:.*]] = fir.insert_value %[[tuple0]], %[[rebox]], [0 : index] : (tuple<!fir.box<!fir.ptr<i32>>, i32>, !fir.box<!fir.ptr<i32>>) -> tuple<!fir.box<!fir.ptr<i32>>, i32>
522c8cb9acSJean Perier  ! CHECK: %[[tuple2:.*]] = fir.insert_value %[[tuple1]], %c42{{.*}}, [1 : index] : (tuple<!fir.box<!fir.ptr<i32>>, i32>, i32) -> tuple<!fir.box<!fir.ptr<i32>>, i32>
532c8cb9acSJean Perier  ! CHECK: fir.has_value %[[tuple2]] : tuple<!fir.box<!fir.ptr<i32>>, i32>
542c8cb9acSJean Perierend block data
552c8cb9acSJean Perier
56a1425019SValentin Clement! Test pointer initial data target in modules
57a1425019SValentin Clementmodule some_mod
58a1425019SValentin Clement  real, target :: x(100)
59a1425019SValentin Clement  real, pointer :: p(:) => x
60a1425019SValentin Clement! CHECK-LABEL: fir.global @_QMsome_modEp : !fir.box<!fir.ptr<!fir.array<?xf32>>> {
61a1425019SValentin Clement  ! CHECK: %[[x:.*]] = fir.address_of(@_QMsome_modEx) : !fir.ref<!fir.array<100xf32>>
62a1425019SValentin Clement  ! CHECK: %[[shape:.*]] = fir.shape %c100{{.*}} : (index) -> !fir.shape<1>
63de2811eeSJean Perier  ! CHECK: %[[box:.*]] = fir.embox %[[x]](%[[shape]]) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<100xf32>>
64de2811eeSJean Perier  ! CHECK: %[[rebox:.*]] = fir.rebox %[[box]] : (!fir.box<!fir.array<100xf32>>) -> !fir.box<!fir.ptr<!fir.array<?xf32>>>
65de2811eeSJean Perier  ! CHECK: fir.has_value %[[rebox]] : !fir.box<!fir.ptr<!fir.array<?xf32>>>
66a1425019SValentin Clementend module
67a1425019SValentin Clement
68a1425019SValentin Clement! Test initial data target in a common block
69a1425019SValentin Clementmodule some_mod_2
70a1425019SValentin Clement  real, target :: x(100), y(10:209)
71a1425019SValentin Clement  common /com/ x, y
72a1425019SValentin Clement  save :: /com/
73a1425019SValentin Clement  real, pointer :: p(:) => y
74a1425019SValentin Clement! CHECK-LABEL: fir.global @_QMsome_mod_2Ep : !fir.box<!fir.ptr<!fir.array<?xf32>>> {
756ffea74fSjeanPerier  ! CHECK: %[[c:.*]] = fir.address_of(@com_) : !fir.ref<!fir.array<1200xi8>>
76a1425019SValentin Clement  ! CHECK: %[[com:.*]] = fir.convert %[[c]] : (!fir.ref<!fir.array<1200xi8>>) -> !fir.ref<!fir.array<?xi8>>
77a1425019SValentin Clement  ! CHECK: %[[yRaw:.*]] = fir.coordinate_of %[[com]], %c400{{.*}} : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
78a1425019SValentin Clement  ! CHECK: %[[y:.*]] = fir.convert %[[yRaw]] : (!fir.ref<i8>) -> !fir.ref<!fir.array<200xf32>>
79a1425019SValentin Clement  ! CHECK: %[[shape:.*]] = fir.shape_shift %c10{{.*}}, %c200{{.*}} : (index, index) -> !fir.shapeshift<1>
80de2811eeSJean Perier  ! CHECK: %[[box:.*]] = fir.embox %[[y]](%[[shape]]) : (!fir.ref<!fir.array<200xf32>>, !fir.shapeshift<1>) -> !fir.box<!fir.array<200xf32>>
81de2811eeSJean Perier  ! CHECK: %[[shift:.*]] = fir.shift %c10{{.*}} : (index) -> !fir.shift<1>
82de2811eeSJean Perier  ! CHECK: %[[rebox:.*]] = fir.rebox %[[box]](%[[shift]]) : (!fir.box<!fir.array<200xf32>>, !fir.shift<1>) -> !fir.box<!fir.ptr<!fir.array<?xf32>>>
83de2811eeSJean Perier  ! CHECK: fir.has_value %[[rebox]] : !fir.box<!fir.ptr<!fir.array<?xf32>>>
84a1425019SValentin Clementend module
85