xref: /llvm-project/flang/test/Lower/array-constructor-2.f90 (revision f35f863a88f83332bef9605ef4cfe4f05c066efb)
1*f35f863aSjeanPerier! RUN: bbc -hlfir=false --use-desc-for-alloc=false %s -o - | FileCheck %s
2518a837eSValentin Clement
3518a837eSValentin Clement!  Constant array ctor.
4518a837eSValentin Clement! CHECK-LABEL: func @_QPtest1(
5518a837eSValentin Clementsubroutine test1(a, b)
6518a837eSValentin Clement  real :: a(3)
7518a837eSValentin Clement  integer :: b(4)
8518a837eSValentin Clement  integer, parameter :: constant_array(4) = [6, 7, 42, 9]
9518a837eSValentin Clement
10518a837eSValentin Clement  ! Array ctors for constant arrays should be outlined as constant globals.
11518a837eSValentin Clement
12518a837eSValentin Clement  !  Look at inline constructor case
13be5747e5SSlava Zakharin  ! CHECK: %{{.*}} = fir.address_of(@_QQro.3xr4.0) : !fir.ref<!fir.array<3xf32>>
14518a837eSValentin Clement  a = (/ 1.0, 2.0, 3.0 /)
15518a837eSValentin Clement
16518a837eSValentin Clement  !  Look at PARAMETER case
17be5747e5SSlava Zakharin  ! CHECK: %{{.*}} = fir.address_of(@_QQro.4xi4.1) : !fir.ref<!fir.array<4xi32>>
18518a837eSValentin Clement  b = constant_array
19518a837eSValentin Clementend subroutine test1
20518a837eSValentin Clement
21518a837eSValentin Clement!  Dynamic array ctor with constant extent.
22518a837eSValentin Clement! CHECK-LABEL: func @_QPtest2(
23518a837eSValentin Clement! CHECK-SAME: %[[a:[^:]*]]: !fir.ref<!fir.array<5xf32>>{{.*}}, %[[b:[^:]*]]: !fir.ref<f32>{{.*}})
24518a837eSValentin Clementsubroutine test2(a, b)
25518a837eSValentin Clement  real :: a(5), b
26518a837eSValentin Clement  real, external :: f
27518a837eSValentin Clement
28518a837eSValentin Clement  !  Look for the 5 store patterns
29518a837eSValentin Clement  ! CHECK: %[[tmp:.*]] = fir.allocmem !fir.array<5xf32>
304cc9437aSTom Eccles  ! CHECK: %[[val:.*]] = fir.call @_QPf(%[[b]]) {{.*}}: (!fir.ref<f32>) -> f32
31518a837eSValentin Clement  ! CHECK: %[[loc:.*]] = fir.coordinate_of %{{.*}}, %{{.*}} : (!fir.heap<!fir.array<5xf32>>, index) -> !fir.ref<f32>
32518a837eSValentin Clement  ! CHECK: fir.store %[[val]] to %[[loc]] : !fir.ref<f32>
334cc9437aSTom Eccles  ! CHECK: fir.call @_QPf(%{{.*}}) {{.*}}: (!fir.ref<f32>) -> f32
34518a837eSValentin Clement  ! CHECK: fir.coordinate_of %{{.*}}, %{{.*}} : (!fir.heap<!fir.array<5xf32>>, index) -> !fir.ref<f32>
35518a837eSValentin Clement  ! CHECK: fir.store
36518a837eSValentin Clement  ! CHECK: fir.call @_QPf(
37518a837eSValentin Clement  ! CHECK: fir.coordinate_of %
38518a837eSValentin Clement  ! CHECK: fir.store
39518a837eSValentin Clement  ! CHECK: fir.call @_QPf(
40518a837eSValentin Clement  ! CHECK: fir.coordinate_of %
41518a837eSValentin Clement  ! CHECK: fir.store
42518a837eSValentin Clement  ! CHECK: fir.call @_QPf(
43518a837eSValentin Clement  ! CHECK: fir.coordinate_of %
44518a837eSValentin Clement  ! CHECK: fir.store
45518a837eSValentin Clement
46518a837eSValentin Clement  !  After the ctor done, loop to copy result to `a`
47518a837eSValentin Clement  ! CHECK-DAG: fir.array_coor %[[tmp:.*]](%
48518a837eSValentin Clement  ! CHECK-DAG: %[[ai:.*]] = fir.array_coor %[[a]](%
49518a837eSValentin Clement  ! CHECK: fir.store %{{.*}} to %[[ai]] : !fir.ref<f32>
503348c083SValentin Clement  ! CHECK: fir.freemem %[[tmp]] : !fir.heap<!fir.array<5xf32>>
51518a837eSValentin Clement
52518a837eSValentin Clement  a = [f(b), f(b+1), f(b+2), f(b+5), f(b+11)]
53518a837eSValentin Clementend subroutine test2
54518a837eSValentin Clement
55518a837eSValentin Clement!  Dynamic array ctor with dynamic extent.
56518a837eSValentin Clement! CHECK-LABEL: func @_QPtest3(
57518a837eSValentin Clement! CHECK-SAME: %[[a:.*]]: !fir.box<!fir.array<?xf32>>{{.*}})
58518a837eSValentin Clementsubroutine test3(a)
59518a837eSValentin Clement  real :: a(:)
60518a837eSValentin Clement  real, allocatable :: b(:), c(:)
61518a837eSValentin Clement  interface
62518a837eSValentin Clement    subroutine test3b(x)
63518a837eSValentin Clement      real, allocatable :: x(:)
64518a837eSValentin Clement    end subroutine test3b
65518a837eSValentin Clement  end interface
66518a837eSValentin Clement  interface
67518a837eSValentin Clement    function test3c
68518a837eSValentin Clement      real, allocatable :: test3c(:)
69518a837eSValentin Clement    end function test3c
70518a837eSValentin Clement  end interface
71518a837eSValentin Clement
72518a837eSValentin Clement  ! CHECK: fir.call @_QPtest3b
73518a837eSValentin Clement  ! CHECK: %{{.*}}:3 = fir.box_dims %{{.*}}, %{{.*}} : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)
74518a837eSValentin Clement  ! CHECK: %{{.*}} = fir.box_addr %{{.*}} : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>
75518a837eSValentin Clement  ! CHECK: %[[tmp:.*]] = fir.allocmem f32, %c32
76518a837eSValentin Clement  call test3b(b)
77518a837eSValentin Clement  ! CHECK: %[[hp1:.*]] = fir.allocmem !fir.array<?xf32>, %{{.*}} {uniq_name = ".array.expr"}
78518a837eSValentin Clement  ! CHECK-DAG: %[[rep:.*]] = fir.convert %{{.*}} : (!fir.heap<f32>) -> !fir.ref<i8>
79518a837eSValentin Clement  ! CHECK-DAG: %[[res:.*]] = fir.convert %{{.*}} : (index) -> i64
804cc9437aSTom Eccles  ! CHECK: %{{.*}} = fir.call @realloc(%[[rep]], %[[res]]) {{.*}}: (!fir.ref<i8>, i64) -> !fir.ref<i8>
814cc9437aSTom Eccles  ! CHECK: fir.call @llvm.memcpy.p0.p0.i64(%{{.*}}, %{{.*}}, %{{.*}}, %false{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
82518a837eSValentin Clement  ! CHECK: fir.call @_QPtest3c
83518a837eSValentin Clement  ! CHECK: fir.save_result
84518a837eSValentin Clement  ! CHECK: %[[tmp2:.*]] = fir.allocmem !fir.array<?xf32>, %{{.*}}#1 {uniq_name = ".array.expr"}
85518a837eSValentin Clement  ! CHECK: fir.call @realloc
86f09b0c84SNikita Popov  ! CHECK: fir.call @llvm.memcpy.p0.p0.i64(%
87518a837eSValentin Clement  ! CHECK: fir.array_coor %[[tmp:.*]](%{{.*}}) %{{.*}} : (!fir.heap<!fir.array<?xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
88518a837eSValentin Clement  ! CHECK-NEXT: fir.load
89518a837eSValentin Clement  ! CHECK-NEXT: fir.array_coor %arg0 %{{.*}} : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32>
90518a837eSValentin Clement  ! CHECK-NEXT: fir.store
91518a837eSValentin Clement  ! CHECK: fir.freemem %[[tmp]]
92518a837eSValentin Clement  ! CHECK: fir.freemem %[[tmp2]]
93518a837eSValentin Clement  ! CHECK: %[[alli:.*]] = fir.box_addr %{{.*}} : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>
94518a837eSValentin Clement  ! CHECK: fir.freemem %[[alli]]
95518a837eSValentin Clement  ! CHECK: fir.freemem %[[hp1]]
96518a837eSValentin Clement  a = (/ b, test3c() /)
97518a837eSValentin Clementend subroutine test3
98518a837eSValentin Clement
99518a837eSValentin Clement! CHECK-LABEL: func @_QPtest4(
100518a837eSValentin Clementsubroutine test4(a, b, n1, m1)
101518a837eSValentin Clement  real :: a(:)
102518a837eSValentin Clement  real :: b(:,:)
103518a837eSValentin Clement  integer, external :: f1, f2, f3
104518a837eSValentin Clement
105518a837eSValentin Clement  !  Dynamic array ctor with dynamic extent using implied do loops.
106518a837eSValentin Clement  ! CHECK-DAG: fir.alloca index {bindc_name = ".buff.pos"}
107518a837eSValentin Clement  ! CHECK-DAG: fir.alloca index {bindc_name = ".buff.size"}
108518a837eSValentin Clement  ! CHECK-DAG: %[[c32:.*]] = arith.constant 32 : index
109518a837eSValentin Clement  ! CHECK: fir.allocmem f32, %[[c32]]
1104cc9437aSTom Eccles  ! CHECK: fir.call @_QPf1(%{{.*}}) {{.*}}: (!fir.ref<i32>) -> i32
1114cc9437aSTom Eccles  ! CHECK: fir.call @_QPf2(%arg2) {{.*}}: (!fir.ref<i32>) -> i32
1124cc9437aSTom Eccles  ! CHECK: fir.call @_QPf3(%{{.*}}) {{.*}}: (!fir.ref<i32>) -> i32
113518a837eSValentin Clement  ! CHECK: %[[q:.*]] = fir.coordinate_of %arg1, %{{.*}}, %{{.*}} : (!fir.box<!fir.array<?x?xf32>>, i64, i64) -> !fir.ref<f32>
114518a837eSValentin Clement  ! CHECK: %[[q2:.*]] = fir.load %[[q]] : !fir.ref<f32>
115518a837eSValentin Clement  ! CHECK: fir.store %[[q2]] to %{{.*}} : !fir.ref<f32>
1163348c083SValentin Clement  ! CHECK: fir.freemem %{{.*}} : !fir.heap<!fir.array<?xf32>>
117518a837eSValentin Clement  ! CHECK-NEXT: return
118518a837eSValentin Clement  a = [ ((b(i,j), j=f1(i),f2(n1),f3(m1+i)), i=1,n1,m1) ]
119518a837eSValentin Clementend subroutine test4
120518a837eSValentin Clement
121518a837eSValentin Clement! CHECK-LABEL: func @_QPtest5(
122518a837eSValentin Clement! CHECK-SAME: %[[a:[^:]*]]: !fir.box<!fir.array<?xf32>>{{.*}}, %[[array2:[^:]*]]: !fir.ref<!fir.array<2xf32>>{{.*}})
123518a837eSValentin Clementsubroutine test5(a, array2)
124518a837eSValentin Clement  real :: a(:)
125518a837eSValentin Clement  real, parameter :: const_array1(2) = [ 1.0, 2.0 ]
126518a837eSValentin Clement  real :: array2(2)
127518a837eSValentin Clement
128518a837eSValentin Clement  !  Array ctor with runtime element values and constant extents.
129518a837eSValentin Clement  !  Concatenation of array values of constant extent.
130518a837eSValentin Clement  ! CHECK: %[[res:.*]] = fir.allocmem !fir.array<4xf32>
131be5747e5SSlava Zakharin  ! CHECK: fir.address_of(@_QQro.2xr4.2) : !fir.ref<!fir.array<2xf32>>
132518a837eSValentin Clement  ! CHECK: %[[tmp1:.*]] = fir.allocmem !fir.array<2xf32>
1334cc9437aSTom Eccles  ! CHECK: fir.call @llvm.memcpy.p0.p0.i64(%{{.*}}, %{{.*}}, %{{.*}}, %false{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
134518a837eSValentin Clement  ! CHECK: %[[tmp2:.*]] = fir.allocmem !fir.array<2xf32>
135518a837eSValentin Clement  ! CHECK: = fir.array_coor %[[array2]](%{{.*}}) %{{.*}} : (!fir.ref<!fir.array<2xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
136518a837eSValentin Clement  ! CHECK: = fir.array_coor %[[tmp2]](%{{.*}}) %{{.*}} : (!fir.heap<!fir.array<2xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
1374cc9437aSTom Eccles  ! CHECK: fir.call @llvm.memcpy.p0.p0.i64(%{{.*}}, %{{.*}}, %{{.*}}, %false{{.*}}) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
138518a837eSValentin Clement  ! CHECK: = fir.array_coor %{{.*}}(%{{.*}}) %{{.*}} : (!fir.heap<!fir.array<4xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
139518a837eSValentin Clement  ! CHECK: = fir.array_coor %[[a]] %{{.*}} : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32>
1403348c083SValentin Clement  ! CHECK-DAG: fir.freemem %{{.*}} : !fir.heap<!fir.array<4xf32>>
1413348c083SValentin Clement  ! CHECK-DAG: fir.freemem %[[tmp2]] : !fir.heap<!fir.array<2xf32>>
1423348c083SValentin Clement  ! CHECK-DAG: fir.freemem %[[tmp1]] : !fir.heap<!fir.array<2xf32>>
143518a837eSValentin Clement  ! CHECK: return
144518a837eSValentin Clement  a = [ const_array1, array2 ]
145518a837eSValentin Clementend subroutine test5
146518a837eSValentin Clement
147518a837eSValentin Clement! CHECK-LABEL: func @_QPtest6(
148518a837eSValentin Clementsubroutine test6(c, d, e)
14975f9b189SPeter Klausler  character(5) :: c(2)
150518a837eSValentin Clement  character(5) :: d, e
151518a837eSValentin Clement  ! CHECK: = fir.allocmem !fir.array<2x!fir.char<1,5>>
152518a837eSValentin Clement  ! CHECK: fir.call @realloc
153518a837eSValentin Clement  ! CHECK: %[[t:.*]] = fir.coordinate_of %{{.*}}, %{{.*}} : (!fir.heap<!fir.array<2x!fir.char<1,5>>>, index) -> !fir.ref<!fir.char<1,5>>
154518a837eSValentin Clement  ! CHECK: %[[to:.*]] = fir.convert %[[t]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
1554cc9437aSTom Eccles  ! CHECK: fir.call @llvm.memcpy.p0.p0.i64(%[[to]], %{{.*}}, %{{.*}}, %false) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
156518a837eSValentin Clement  ! CHECK: fir.call @realloc
157518a837eSValentin Clement  ! CHECK: %[[t:.*]] = fir.coordinate_of %{{.*}}, %{{.*}} : (!fir.heap<!fir.array<2x!fir.char<1,5>>>, index) -> !fir.ref<!fir.char<1,5>>
158518a837eSValentin Clement  ! CHECK: %[[to:.*]] = fir.convert %[[t]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<i8>
1594cc9437aSTom Eccles  ! CHECK: fir.call @llvm.memcpy.p0.p0.i64(%[[to]], %{{.*}}, %{{.*}}, %false) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> ()
1603348c083SValentin Clement  ! CHECK: fir.freemem %{{.*}} : !fir.heap<!fir.array<2x!fir.char<1,5>>>
161518a837eSValentin Clement  c = (/ d, e /)
162518a837eSValentin Clementend subroutine test6
163518a837eSValentin Clement
164518a837eSValentin Clement! CHECK-LABEL: func @_QPtest7(
165518a837eSValentin Clement! CHECK: %[[i:.*]] = fir.convert %{{.*}} : (index) -> i8
166518a837eSValentin Clement! CHECK: %[[und:.*]] = fir.undefined !fir.char<1>
167518a837eSValentin Clement! CHECK: %[[scalar:.*]] = fir.insert_value %[[und]], %[[i]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1>
168518a837eSValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: !fir.heap<!fir.char<1>>):  // 2 preds
169518a837eSValentin Clement! CHECK: fir.store %[[scalar]] to %{{.*}} : !fir.ref<!fir.char<1>>
170518a837eSValentin Clementsubroutine test7(a, n)
171518a837eSValentin Clement  character(1) :: a(n)
172518a837eSValentin Clement  a = (/ (CHAR(i), i=1,n) /)
173518a837eSValentin Clementend subroutine test7
174518a837eSValentin Clement
175be5747e5SSlava Zakharin! CHECK: fir.global internal @_QQro.3xr4.0(dense<[1.000000e+00, 2.000000e+00, 3.000000e+00]> : tensor<3xf32>) constant : !fir.array<3xf32>
176518a837eSValentin Clement
177be5747e5SSlava Zakharin! CHECK: fir.global internal @_QQro.4xi4.1(dense<[6, 7, 42, 9]> : tensor<4xi32>) constant : !fir.array<4xi32>
178