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