1d6d9a8b8SValentin Clement! RUN: bbc -emit-fir %s -o - | FileCheck %s 2d6d9a8b8SValentin Clement 3d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest1 4d6d9a8b8SValentin Clementsubroutine test1(a,b,c,n) 5d6d9a8b8SValentin Clement integer :: n 6d6d9a8b8SValentin Clement real, intent(out) :: a(n) 7d6d9a8b8SValentin Clement real, intent(in) :: b(n), c(n) 8d6d9a8b8SValentin Clement ! CHECK-DAG: %[[A:.*]] = fir.array_load %arg0(% 9d6d9a8b8SValentin Clement ! CHECK-DAG: %[[B:.*]] = fir.array_load %arg1(% 10d6d9a8b8SValentin Clement ! CHECK-DAG: %[[C:.*]] = fir.array_load %arg2(% 11d6d9a8b8SValentin Clement ! CHECK: %[[T:.*]] = fir.do_loop 12d6d9a8b8SValentin Clement ! CHECK-DAG: %[[Bi:.*]] = fir.array_fetch %[[B]] 13d6d9a8b8SValentin Clement ! CHECK-DAG: %[[Ci:.*]] = fir.array_fetch %[[C]] 14d6d9a8b8SValentin Clement ! CHECK: %[[rv:.*]] = arith.addf %[[Bi]], %[[Ci]] 15d6d9a8b8SValentin Clement ! CHECK: fir.array_update %{{.*}}, %[[rv]], % 16d6d9a8b8SValentin Clement a = b + c 17d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[A]], %[[T]] to %arg0 18d6d9a8b8SValentin Clementend subroutine test1 19d6d9a8b8SValentin Clement 20d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest1b 21d6d9a8b8SValentin Clementsubroutine test1b(a,b,c,d,n) 22d6d9a8b8SValentin Clement integer :: n 23d6d9a8b8SValentin Clement real, intent(out) :: a(n) 24d6d9a8b8SValentin Clement real, intent(in) :: b(n), c(n), d(n) 25d6d9a8b8SValentin Clement ! CHECK-DAG: %[[A:.*]] = fir.array_load %arg0(% 26d6d9a8b8SValentin Clement ! CHECK-DAG: %[[B:.*]] = fir.array_load %arg1(% 27d6d9a8b8SValentin Clement ! CHECK-DAG: %[[C:.*]] = fir.array_load %arg2(% 28d6d9a8b8SValentin Clement ! CHECK-DAG: %[[D:.*]] = fir.array_load %arg3(% 29d6d9a8b8SValentin Clement ! CHECK: %[[T:.*]] = fir.do_loop 30d6d9a8b8SValentin Clement ! CHECK-DAG: %[[Bi:.*]] = fir.array_fetch %[[B]] 31d6d9a8b8SValentin Clement ! CHECK-DAG: %[[Ci:.*]] = fir.array_fetch %[[C]] 32d6d9a8b8SValentin Clement ! CHECK: %[[rv1:.*]] = arith.addf %[[Bi]], %[[Ci]] 33d6d9a8b8SValentin Clement ! CHECK: %[[Di:.*]] = fir.array_fetch %[[D]] 34d6d9a8b8SValentin Clement ! CHECK: %[[rv:.*]] = arith.addf %[[rv1]], %[[Di]] 35d6d9a8b8SValentin Clement ! CHECK: fir.array_update %{{.*}}, %[[rv]], % 36d6d9a8b8SValentin Clement a = b + c + d 37d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[A]], %[[T]] to %arg0 38d6d9a8b8SValentin Clementend subroutine test1b 39d6d9a8b8SValentin Clement 40d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest2( 41d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>>{{.*}}, %[[VAL_1:.*]]: !fir.box<!fir.array<?xf32>>{{.*}}, %[[VAL_2:.*]]: !fir.box<!fir.array<?xf32>>{{.*}}) { 42d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = arith.constant 0 : index 43d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]]:3 = fir.box_dims %[[VAL_0]], %[[VAL_3]] : (!fir.box<!fir.array<?xf32>>, index) -> (index, index, index) 44d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?xf32>>) -> !fir.array<?xf32> 45d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xf32>>) -> !fir.array<?xf32> 46d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = fir.array_load %[[VAL_2]] : (!fir.box<!fir.array<?xf32>>) -> !fir.array<?xf32> 47d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 1 : index 48d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.constant 0 : index 49d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.subi %[[VAL_4]]#1, %[[VAL_8]] : index 50d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.do_loop %[[VAL_12:.*]] = %[[VAL_9]] to %[[VAL_10]] step %[[VAL_8]] unordered iter_args(%[[VAL_13:.*]] = %[[VAL_5]]) -> (!fir.array<?xf32>) { 51d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.array_fetch %[[VAL_6]], %[[VAL_12]] : (!fir.array<?xf32>, index) -> f32 52d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.array_fetch %[[VAL_7]], %[[VAL_12]] : (!fir.array<?xf32>, index) -> f32 53d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.addf %[[VAL_14]], %[[VAL_15]] : f32 54d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.array_update %[[VAL_13]], %[[VAL_16]], %[[VAL_12]] : (!fir.array<?xf32>, f32, index) -> !fir.array<?xf32> 55d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_17]] : !fir.array<?xf32> 56d6d9a8b8SValentin Clement! CHECK: } 57d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_5]], %[[VAL_18:.*]] to %[[VAL_0]] : !fir.array<?xf32>, !fir.array<?xf32>, !fir.box<!fir.array<?xf32>> 58d6d9a8b8SValentin Clement! CHECK: return 59d6d9a8b8SValentin Clement! CHECK: } 60d6d9a8b8SValentin Clementsubroutine test2(a,b,c) 61d6d9a8b8SValentin Clement real, intent(out) :: a(:) 62d6d9a8b8SValentin Clement real, intent(in) :: b(:), c(:) 63d6d9a8b8SValentin Clement a = b + c 64d6d9a8b8SValentin Clementend subroutine test2 65d6d9a8b8SValentin Clement 66d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest3 67d6d9a8b8SValentin Clementsubroutine test3(a,b,c,n) 68d6d9a8b8SValentin Clement integer :: n 69d6d9a8b8SValentin Clement real, intent(out) :: a(n) 70d6d9a8b8SValentin Clement real, intent(in) :: b(n), c 71d6d9a8b8SValentin Clement ! CHECK-DAG: %[[A:.*]] = fir.array_load %arg0(% 72d6d9a8b8SValentin Clement ! CHECK-DAG: %[[B:.*]] = fir.array_load %arg1(% 73d6d9a8b8SValentin Clement ! CHECK-DAG: %[[C:.*]] = fir.load %arg2 74d6d9a8b8SValentin Clement ! CHECK: %[[T:.*]] = fir.do_loop 75d6d9a8b8SValentin Clement ! CHECK: %[[Bi:.*]] = fir.array_fetch %[[B]] 76d6d9a8b8SValentin Clement ! CHECK: %[[rv:.*]] = arith.addf %[[Bi]], %[[C]] 77d6d9a8b8SValentin Clement ! CHECK: %[[Ti:.*]] = fir.array_update %{{.*}}, %[[rv]], % 78d6d9a8b8SValentin Clement ! CHECK: fir.result %[[Ti]] 79d6d9a8b8SValentin Clement a = b + c 80d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[A]], %[[T]] to %arg0 81d6d9a8b8SValentin Clementend subroutine test3 82d6d9a8b8SValentin Clement 83d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest4 84d6d9a8b8SValentin Clementsubroutine test4(a,b,c) 85d6d9a8b8SValentin Clement! TODO: this declaration fails in CallInterface lowering 86d6d9a8b8SValentin Clement! real, allocatable, intent(out) :: a(:) 87d6d9a8b8SValentin Clement real :: a(100) ! FIXME: fake it for now 88d6d9a8b8SValentin Clement real, intent(in) :: b(:), c 89d6d9a8b8SValentin Clement ! CHECK-DAG: %[[A:.*]] = fir.array_load %arg0(% 90d6d9a8b8SValentin Clement ! CHECK-DAG: %[[B:.*]] = fir.array_load %arg1 91d6d9a8b8SValentin Clement ! CHECK: fir.do_loop 92d6d9a8b8SValentin Clement ! CHECK: fir.array_fetch %[[B]], % 93d6d9a8b8SValentin Clement ! CHECK: fir.array_update 94d6d9a8b8SValentin Clement a = b + c 95d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[A]], %{{.*}} to %arg0 96d6d9a8b8SValentin Clementend subroutine test4 97d6d9a8b8SValentin Clement 98d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest5 99d6d9a8b8SValentin Clementsubroutine test5(a,b,c) 100d6d9a8b8SValentin Clement! TODO: this declaration fails in CallInterface lowering 101d6d9a8b8SValentin Clement! real, allocatable, intent(out) :: a(:) 102d6d9a8b8SValentin Clement! real, pointer, intent(in) :: b(:) 103d6d9a8b8SValentin Clement real :: a(100), b(100) ! FIXME: fake it for now 104d6d9a8b8SValentin Clement real, intent(in) :: c 105d6d9a8b8SValentin Clement ! CHECK-DAG: %[[A:.*]] = fir.array_load %arg0(% 106d6d9a8b8SValentin Clement ! CHECK-DAG: %[[B:.*]] = fir.array_load %arg1(% 107d6d9a8b8SValentin Clement ! CHECK: fir.do_loop 108d6d9a8b8SValentin Clement ! CHECK: fir.array_fetch %[[B]], % 109d6d9a8b8SValentin Clement ! CHECK: fir.array_update 110d6d9a8b8SValentin Clement a = b + c 111d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[A]], %{{.*}} to %arg0 112d6d9a8b8SValentin Clementend subroutine test5 113d6d9a8b8SValentin Clement 114d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest6( 115d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<?xf32>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<?xf32>>{{.*}}, %[[VAL_2:.*]]: !fir.ref<f32>{{.*}}, %[[VAL_3:.*]]: !fir.ref<i32>{{.*}}, %[[VAL_4:.*]]: !fir.ref<i32>{{.*}}) { 116d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32> 117d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> i64 1185bc9ee1bSJean Perier! CHECK: %[[VAL_7A:.*]] = fir.convert %[[VAL_6]] : (i64) -> index 1195bc9ee1bSJean Perier! CHECK: %[[C0:.*]] = arith.constant 0 : index 1205bc9ee1bSJean Perier! CHECK: %[[CMP:.*]] = arith.cmpi sgt, %[[VAL_7A]], %[[C0]] : index 1215bc9ee1bSJean Perier! CHECK: %[[VAL_7:.*]] = arith.select %[[CMP]], %[[VAL_7A]], %[[C0]] : index 122d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32> 123d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i32) -> i64 1245bc9ee1bSJean Perier! CHECK: %[[VAL_10A:.*]] = fir.convert %[[VAL_9]] : (i64) -> index 1255bc9ee1bSJean Perier! CHECK: %[[C0_2:.*]] = arith.constant 0 : index 1265bc9ee1bSJean Perier! CHECK: %[[CMP_2:.*]] = arith.cmpi sgt, %[[VAL_10A]], %[[C0_2]] : index 1275bc9ee1bSJean Perier! CHECK: %[[VAL_10:.*]] = arith.select %[[CMP_2]], %[[VAL_10A]], %[[C0_2]] : index 128d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.constant 3 : i64 129d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (i64) -> index 130d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 4 : i64 131d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i64) -> index 132d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32> 133d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64 134d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index 135d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.constant 0 : index 136d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = arith.subi %[[VAL_17]], %[[VAL_12]] : index 137d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.addi %[[VAL_19]], %[[VAL_14]] : index 138d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.divsi %[[VAL_20]], %[[VAL_14]] : index 139d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.cmpi sgt, %[[VAL_21]], %[[VAL_18]] : index 140d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.select %[[VAL_22]], %[[VAL_21]], %[[VAL_18]] : index 141d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1> 142d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.slice %[[VAL_12]], %[[VAL_17]], %[[VAL_14]] : (index, index, index) -> !fir.slice<1> 143d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.array_load %[[VAL_0]](%[[VAL_24]]) {{\[}}%[[VAL_25]]] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<?xf32> 144d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = fir.shape %[[VAL_10]] : (index) -> !fir.shape<1> 145d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = fir.array_load %[[VAL_1]](%[[VAL_27]]) : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.array<?xf32> 146d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = fir.load %[[VAL_2]] : !fir.ref<f32> 147d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = arith.constant 1 : index 148d6d9a8b8SValentin Clement! CHECK: %[[VAL_31:.*]] = arith.constant 0 : index 149d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.subi %[[VAL_23]], %[[VAL_30]] : index 150d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.do_loop %[[VAL_34:.*]] = %[[VAL_31]] to %[[VAL_32]] step %[[VAL_30]] unordered iter_args(%[[VAL_35:.*]] = %[[VAL_26]]) -> (!fir.array<?xf32>) { 151d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = fir.array_fetch %[[VAL_28]], %[[VAL_34]] : (!fir.array<?xf32>, index) -> f32 152d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = arith.addf %[[VAL_36]], %[[VAL_29]] : f32 153d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = fir.array_update %[[VAL_35]], %[[VAL_37]], %[[VAL_34]] : (!fir.array<?xf32>, f32, index) -> !fir.array<?xf32> 154d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_38]] : !fir.array<?xf32> 155d6d9a8b8SValentin Clement! CHECK: } 156d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_26]], %[[VAL_39:.*]] to %[[VAL_0]]{{\[}}%[[VAL_25]]] : !fir.array<?xf32>, !fir.array<?xf32>, !fir.ref<!fir.array<?xf32>>, !fir.slice<1> 157d6d9a8b8SValentin Clement! CHECK: return 158d6d9a8b8SValentin Clement! CHECK: } 159d6d9a8b8SValentin Clement 160d6d9a8b8SValentin Clementsubroutine test6(a,b,c,n,m) 161d6d9a8b8SValentin Clement integer :: n, m 162d6d9a8b8SValentin Clement real, intent(out) :: a(n) 163d6d9a8b8SValentin Clement real, intent(in) :: b(m), c 164d6d9a8b8SValentin Clement a(3:n:4) = b + c 165d6d9a8b8SValentin Clementend subroutine test6 166d6d9a8b8SValentin Clement 167d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest6a( 168d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10x50xf32>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<10xf32>>{{.*}}) { 169d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]] = arith.constant 10 : index 170d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = arith.constant 50 : index 171d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index 172d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 173d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.array_load %[[VAL_1]](%[[VAL_5]]) : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> !fir.array<10xf32> 174d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 1 : index 175d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 4 : i64 176d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.undefined index 177d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_8]] : (i64) -> index 178d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.subi %[[VAL_10]], %[[VAL_7]] : index 179d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant 41 : i64 180d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i64) -> index 181d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.constant 1 : i64 182d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (i64) -> index 183d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.constant 50 : i64 184d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index 185d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.shape %[[VAL_2]], %[[VAL_3]] : (index, index) -> !fir.shape<2> 186d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.slice %[[VAL_8]], %[[VAL_9]], %[[VAL_9]], %[[VAL_13]], %[[VAL_17]], %[[VAL_15]] : (i64, index, index, index, index, index) -> !fir.slice<2> 187d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.array_load %[[VAL_0]](%[[VAL_18]]) {{\[}}%[[VAL_19]]] : (!fir.ref<!fir.array<10x50xf32>>, !fir.shape<2>, !fir.slice<2>) -> !fir.array<10x50xf32> 188d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.constant 1 : index 189d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.constant 0 : index 190d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.subi %[[VAL_4]], %[[VAL_21]] : index 191d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.do_loop %[[VAL_25:.*]] = %[[VAL_22]] to %[[VAL_23]] step %[[VAL_21]] unordered iter_args(%[[VAL_26:.*]] = %[[VAL_6]]) -> (!fir.array<10xf32>) { 192d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = fir.array_fetch %[[VAL_20]], %[[VAL_11]], %[[VAL_25]] : (!fir.array<10x50xf32>, index, index) -> f32 193d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = fir.array_update %[[VAL_26]], %[[VAL_27]], %[[VAL_25]] : (!fir.array<10xf32>, f32, index) -> !fir.array<10xf32> 194d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_28]] : !fir.array<10xf32> 195d6d9a8b8SValentin Clement! CHECK: } 196d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_6]], %[[VAL_29:.*]] to %[[VAL_1]] : !fir.array<10xf32>, !fir.array<10xf32>, !fir.ref<!fir.array<10xf32>> 197d6d9a8b8SValentin Clement! CHECK: return 198d6d9a8b8SValentin Clement! CHECK: } 199d6d9a8b8SValentin Clement 200d6d9a8b8SValentin Clementsubroutine test6a(a,b) 201d6d9a8b8SValentin Clement ! copy part of 1 row to b. a's projection has rank 1. 202d6d9a8b8SValentin Clement real :: a(10,50) 203d6d9a8b8SValentin Clement real :: b(10) 204d6d9a8b8SValentin Clement b = a(4,41:50) 205d6d9a8b8SValentin Clementend subroutine test6a 206d6d9a8b8SValentin Clement 207d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest6b( 208d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10x50xf32>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<10xf32>>{{.*}}) { 209d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]] = arith.constant 10 : index 210d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = arith.constant 50 : index 211d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index 212d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = arith.constant 1 : index 213d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 4 : i64 214d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = fir.undefined index 215d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_6]] : (i64) -> index 216d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.subi %[[VAL_8]], %[[VAL_5]] : index 217d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.constant 41 : i64 218d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index 219d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant 1 : i64 220d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i64) -> index 221d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.constant 50 : i64 222d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (i64) -> index 223d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.constant 0 : index 224d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = arith.subi %[[VAL_15]], %[[VAL_11]] : index 225d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.addi %[[VAL_17]], %[[VAL_13]] : index 226d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = arith.divsi %[[VAL_18]], %[[VAL_13]] : index 227d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.cmpi sgt, %[[VAL_19]], %[[VAL_16]] : index 228d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.select %[[VAL_20]], %[[VAL_19]], %[[VAL_16]] : index 229d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = fir.shape %[[VAL_2]], %[[VAL_3]] : (index, index) -> !fir.shape<2> 230d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = fir.slice %[[VAL_6]], %[[VAL_7]], %[[VAL_7]], %[[VAL_11]], %[[VAL_15]], %[[VAL_13]] : (i64, index, index, index, index, index) -> !fir.slice<2> 231d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.array_load %[[VAL_0]](%[[VAL_22]]) {{\[}}%[[VAL_23]]] : (!fir.ref<!fir.array<10x50xf32>>, !fir.shape<2>, !fir.slice<2>) -> !fir.array<10x50xf32> 232d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 233d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.array_load %[[VAL_1]](%[[VAL_25]]) : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> !fir.array<10xf32> 234d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant 1 : index 235d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.constant 0 : index 236d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.subi %[[VAL_21]], %[[VAL_27]] : index 237d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = fir.do_loop %[[VAL_31:.*]] = %[[VAL_28]] to %[[VAL_29]] step %[[VAL_27]] unordered iter_args(%[[VAL_32:.*]] = %[[VAL_24]]) -> (!fir.array<10x50xf32>) { 238d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.array_fetch %[[VAL_26]], %[[VAL_31]] : (!fir.array<10xf32>, index) -> f32 239d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.array_update %[[VAL_32]], %[[VAL_33]], %[[VAL_9]], %[[VAL_31]] : (!fir.array<10x50xf32>, f32, index, index) -> !fir.array<10x50xf32> 240d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_34]] : !fir.array<10x50xf32> 241d6d9a8b8SValentin Clement! CHECK: } 242d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_24]], %[[VAL_35:.*]] to %[[VAL_0]]{{\[}}%[[VAL_23]]] : !fir.array<10x50xf32>, !fir.array<10x50xf32>, !fir.ref<!fir.array<10x50xf32>>, !fir.slice<2> 243d6d9a8b8SValentin Clement! CHECK: return 244d6d9a8b8SValentin Clement! CHECK: } 245d6d9a8b8SValentin Clement 246d6d9a8b8SValentin Clementsubroutine test6b(a,b) 247d6d9a8b8SValentin Clement ! copy b to columns 41 to 50 of row 4 of a 248d6d9a8b8SValentin Clement real :: a(10,50) 249d6d9a8b8SValentin Clement real :: b(10) 250d6d9a8b8SValentin Clement a(4,41:50) = b 251d6d9a8b8SValentin Clementend subroutine test6b 252d6d9a8b8SValentin Clement 253d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest7( 254d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<?xf32>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<?xf32>>{{.*}}, %[[VAL_2:.*]]: !fir.ref<i32>{{.*}}) { 255d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 256d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> i64 2575bc9ee1bSJean Perier! CHECK: %[[VAL_5A:.*]] = fir.convert %[[VAL_4]] : (i64) -> index 2585bc9ee1bSJean Perier! CHECK: %[[C0:.*]] = arith.constant 0 : index 2595bc9ee1bSJean Perier! CHECK: %[[CMP:.*]] = arith.cmpi sgt, %[[VAL_5A]], %[[C0]] : index 2605bc9ee1bSJean Perier! CHECK: %[[VAL_5:.*]] = arith.select %[[CMP]], %[[VAL_5A]], %[[C0]] : index 261d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 262d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> i64 2635bc9ee1bSJean Perier! CHECK: %[[VAL_8A:.*]] = fir.convert %[[VAL_7]] : (i64) -> index 2645bc9ee1bSJean Perier! CHECK: %[[C0_2:.*]] = arith.constant 0 : index 2655bc9ee1bSJean Perier! CHECK: %[[CMP_2:.*]] = arith.cmpi sgt, %[[VAL_8A]], %[[C0_2]] : index 2665bc9ee1bSJean Perier! CHECK: %[[VAL_8:.*]] = arith.select %[[CMP_2]], %[[VAL_8A]], %[[C0_2]] : index 267d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1> 268d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.array_load %[[VAL_0]](%[[VAL_9]]) : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.array<?xf32> 269d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1> 270d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.array_load %[[VAL_0]](%[[VAL_11]]) : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.array<?xf32> 271d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = fir.shape %[[VAL_8]] : (index) -> !fir.shape<1> 272d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.array_load %[[VAL_1]](%[[VAL_13]]) : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.array<?xf32> 273d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.constant 1 : index 274d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.constant 0 : index 275d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = arith.subi %[[VAL_5]], %[[VAL_15]] : index 276d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.do_loop %[[VAL_19:.*]] = %[[VAL_16]] to %[[VAL_17]] step %[[VAL_15]] unordered iter_args(%[[VAL_20:.*]] = %[[VAL_10]]) -> (!fir.array<?xf32>) { 277d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = fir.array_fetch %[[VAL_12]], %[[VAL_19]] : (!fir.array<?xf32>, index) -> f32 278d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = fir.array_fetch %[[VAL_14]], %[[VAL_19]] : (!fir.array<?xf32>, index) -> f32 279d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.addf %[[VAL_21]], %[[VAL_22]] : f32 280d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.array_update %[[VAL_20]], %[[VAL_23]], %[[VAL_19]] : (!fir.array<?xf32>, f32, index) -> !fir.array<?xf32> 281d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_24]] : !fir.array<?xf32> 282d6d9a8b8SValentin Clement! CHECK: } 283d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_10]], %[[VAL_25:.*]] to %[[VAL_0]] : !fir.array<?xf32>, !fir.array<?xf32>, !fir.ref<!fir.array<?xf32>> 284d6d9a8b8SValentin Clement! CHECK: return 285d6d9a8b8SValentin Clement! CHECK: } 286d6d9a8b8SValentin Clement 287d6d9a8b8SValentin Clement! This is NOT a conflict. `a` appears on both the lhs and rhs here, but there 288d6d9a8b8SValentin Clement! are no loop-carried dependences and no copy is needed. 289d6d9a8b8SValentin Clementsubroutine test7(a,b,n) 290d6d9a8b8SValentin Clement integer :: n 291d6d9a8b8SValentin Clement real, intent(inout) :: a(n) 292d6d9a8b8SValentin Clement real, intent(in) :: b(n) 293d6d9a8b8SValentin Clement a = a + b 294d6d9a8b8SValentin Clementend subroutine test7 295d6d9a8b8SValentin Clement 296d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest8( 297d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<100xi32>>{{.*}}) { 298d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]] = arith.constant 100 : index 299d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.shape %[[VAL_2]] : (index) -> !fir.shape<1> 300d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = fir.array_load %[[VAL_0]](%[[VAL_3]]) : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>) -> !fir.array<100xi32> 301d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = arith.constant 1 : i64 302d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 1 : i64 303d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.subi %[[VAL_5]], %[[VAL_6]] : i64 304d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_7]] : (!fir.ref<!fir.array<100xi32>>, i64) -> !fir.ref<i32> 305d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.load %[[VAL_8]] : !fir.ref<i32> 306d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.constant 1 : index 307d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.constant 0 : index 308d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.subi %[[VAL_2]], %[[VAL_10]] : index 309d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = fir.do_loop %[[VAL_14:.*]] = %[[VAL_11]] to %[[VAL_12]] step %[[VAL_10]] unordered iter_args(%[[VAL_15:.*]] = %[[VAL_4]]) -> (!fir.array<100xi32>) { 310d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.array_update %[[VAL_15]], %[[VAL_9]], %[[VAL_14]] : (!fir.array<100xi32>, i32, index) -> !fir.array<100xi32> 311d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_16]] : !fir.array<100xi32> 312d6d9a8b8SValentin Clement! CHECK: } 313d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_4]], %[[VAL_17:.*]] to %[[VAL_0]] : !fir.array<100xi32>, !fir.array<100xi32>, !fir.ref<!fir.array<100xi32>> 314d6d9a8b8SValentin Clement! CHECK: return 315d6d9a8b8SValentin Clement! CHECK: } 316d6d9a8b8SValentin Clement 317d6d9a8b8SValentin Clementsubroutine test8(a,b) 318d6d9a8b8SValentin Clement integer :: a(100), b(100) 319d6d9a8b8SValentin Clement a = b(1) 320d6d9a8b8SValentin Clementend subroutine test8 321d6d9a8b8SValentin Clement 322d6d9a8b8SValentin Clementsubroutine test10(a,b,c,d) 323d6d9a8b8SValentin Clement interface 324d6d9a8b8SValentin Clement ! Function takea an array and yields an array 325d6d9a8b8SValentin Clement function foo(a) result(res) 326d6d9a8b8SValentin Clement real :: a(:) ! FIXME: must be before res or semantics fails 327d6d9a8b8SValentin Clement ! as `size(a,1)` fails to resolve to the argument 328d6d9a8b8SValentin Clement real, dimension(size(a,1)) :: res 329d6d9a8b8SValentin Clement end function foo 330d6d9a8b8SValentin Clement end interface 331d6d9a8b8SValentin Clement interface 332d6d9a8b8SValentin Clement ! Function takes an array and yields a scalar 333d6d9a8b8SValentin Clement real function bar(a) 334d6d9a8b8SValentin Clement real :: a(:) 335d6d9a8b8SValentin Clement end function bar 336d6d9a8b8SValentin Clement end interface 337d6d9a8b8SValentin Clement real :: a(:), b(:), c(:), d(:) 338d6d9a8b8SValentin Clement! a = b + foo(c + foo(d + bar(a))) 339d6d9a8b8SValentin Clementend subroutine test10 340d6d9a8b8SValentin Clement 341d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest11( 342d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}, %[[VAL_2:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}, %[[VAL_3:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}) { 343d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 100 : index 344d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = arith.constant 100 : index 345d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 100 : index 346d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 100 : index 347d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 348d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.array_load %[[VAL_0]](%[[VAL_8]]) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 349d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1> 350d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.array_load %[[VAL_1]](%[[VAL_10]]) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 351d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant 100 : index 352d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1> 353d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.array_load %[[VAL_2]](%[[VAL_14]]) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 354d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1> 355d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.array_load %[[VAL_3]](%[[VAL_16]]) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 356d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.allocmem !fir.array<100xf32> 357d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.shape %[[VAL_12]] : (index) -> !fir.shape<1> 358d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.array_load %[[VAL_18]](%[[VAL_19]]) : (!fir.heap<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 359d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.constant 1 : index 360d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.constant 0 : index 361d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.subi %[[VAL_12]], %[[VAL_21]] : index 362d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.do_loop %[[VAL_25:.*]] = %[[VAL_22]] to %[[VAL_23]] step %[[VAL_21]] unordered iter_args(%[[VAL_26:.*]] = %[[VAL_20]]) -> (!fir.array<100xf32>) { 363d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = fir.array_fetch %[[VAL_15]], %[[VAL_25]] : (!fir.array<100xf32>, index) -> f32 364d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = fir.array_fetch %[[VAL_17]], %[[VAL_25]] : (!fir.array<100xf32>, index) -> f32 365d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.addf %[[VAL_27]], %[[VAL_28]] : f32 366d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = fir.array_update %[[VAL_26]], %[[VAL_29]], %[[VAL_25]] : (!fir.array<100xf32>, f32, index) -> !fir.array<100xf32> 367d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_30]] : !fir.array<100xf32> 368d6d9a8b8SValentin Clement! CHECK: } 369d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_20]], %[[VAL_31:.*]] to %[[VAL_18]] : !fir.array<100xf32>, !fir.array<100xf32>, !fir.heap<!fir.array<100xf32>> 370d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = fir.convert %[[VAL_18]] : (!fir.heap<!fir.array<100xf32>>) -> !fir.ref<!fir.array<100xf32>> 371d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.call @_QPbar(%[[VAL_32]]) : (!fir.ref<!fir.array<100xf32>>) -> f32 372d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = arith.constant 1 : index 373d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = arith.constant 0 : index 374d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = arith.subi %[[VAL_4]], %[[VAL_34]] : index 375d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = fir.do_loop %[[VAL_38:.*]] = %[[VAL_35]] to %[[VAL_36]] step %[[VAL_34]] unordered iter_args(%[[VAL_39:.*]] = %[[VAL_9]]) -> (!fir.array<100xf32>) { 376d6d9a8b8SValentin Clement! CHECK: %[[VAL_40:.*]] = fir.array_fetch %[[VAL_11]], %[[VAL_38]] : (!fir.array<100xf32>, index) -> f32 377d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = arith.addf %[[VAL_40]], %[[VAL_33]] : f32 378d6d9a8b8SValentin Clement! CHECK: %[[VAL_42:.*]] = fir.array_update %[[VAL_39]], %[[VAL_41]], %[[VAL_38]] : (!fir.array<100xf32>, f32, index) -> !fir.array<100xf32> 379d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_42]] : !fir.array<100xf32> 380d6d9a8b8SValentin Clement! CHECK: } 381d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_9]], %[[VAL_43:.*]] to %[[VAL_0]] : !fir.array<100xf32>, !fir.array<100xf32>, !fir.ref<!fir.array<100xf32>> 382d6d9a8b8SValentin Clement! CHECK: fir.freemem %[[VAL_18]] 383d6d9a8b8SValentin Clement! CHECK: return 384d6d9a8b8SValentin Clement! CHECK: } 385d6d9a8b8SValentin Clement 386d6d9a8b8SValentin Clementsubroutine test11(a,b,c,d) 387d6d9a8b8SValentin Clement real, external :: bar 388d6d9a8b8SValentin Clement real :: a(100), b(100), c(100), d(100) 389d6d9a8b8SValentin Clement a = b + bar(c + d) 390d6d9a8b8SValentin Clementend subroutine test11 391d6d9a8b8SValentin Clement 392d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest12 393d6d9a8b8SValentin Clementsubroutine test12(a,b,c,d,n,m) 394d6d9a8b8SValentin Clement integer :: n, m 395d6d9a8b8SValentin Clement ! CHECK: %[[n:.*]] = fir.load %arg4 396d6d9a8b8SValentin Clement ! CHECK: %[[m:.*]] = fir.load %arg5 397d6d9a8b8SValentin Clement ! CHECK: %[[sha:.*]] = fir.shape % 398d6d9a8b8SValentin Clement ! CHECK: %[[A:.*]] = fir.array_load %arg0(%[[sha]]) 399d6d9a8b8SValentin Clement ! CHECK: %[[shb:.*]] = fir.shape % 400d6d9a8b8SValentin Clement ! CHECK: %[[B:.*]] = fir.array_load %arg1(%[[shb]]) 401d6d9a8b8SValentin Clement ! CHECK: %[[C:.*]] = fir.array_load %arg2(% 402d6d9a8b8SValentin Clement ! CHECK: %[[D:.*]] = fir.array_load %arg3(% 403d6d9a8b8SValentin Clement ! CHECK: %[[tmp:.*]] = fir.allocmem !fir.array<?xf32>, %{{.*}} {{{.*}}uniq_name = ".array.expr"} 404d6d9a8b8SValentin Clement ! CHECK: %[[T:.*]] = fir.array_load %[[tmp]](% 405d6d9a8b8SValentin Clement real, external :: bar 406d6d9a8b8SValentin Clement real :: a(n), b(n), c(m), d(m) 407d6d9a8b8SValentin Clement ! CHECK: %[[LOOP:.*]] = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%{{.*}} = %[[T]]) 408d6d9a8b8SValentin Clement ! CHECK-DAG: fir.array_fetch %[[C]] 409d6d9a8b8SValentin Clement ! CHECK-DAG: fir.array_fetch %[[D]] 410d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[T]], %[[LOOP]] 411d6d9a8b8SValentin Clement ! CHECK: %[[CALL:.*]] = fir.call @_QPbar 412d6d9a8b8SValentin Clement ! CHECK: %[[LOOP2:.*]] = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%{{.*}} = %[[A]]) 413d6d9a8b8SValentin Clement ! CHECK: fir.array_fetch %[[B]] 414d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[A]], %[[LOOP2]] to %arg0 415d6d9a8b8SValentin Clement a = b + bar(c + d) 4163348c083SValentin Clement ! CHECK: fir.freemem %[[tmp]] : !fir.heap<!fir.array<?xf32>> 417d6d9a8b8SValentin Clementend subroutine test12 418d6d9a8b8SValentin Clement 419d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest13 420d6d9a8b8SValentin Clementsubroutine test13(a,b,c,d,n,m,i) 421d6d9a8b8SValentin Clement real :: a(n), b(m) 422d6d9a8b8SValentin Clement complex :: c(n), d(m) 423d6d9a8b8SValentin Clement ! CHECK: %[[A_shape:.*]] = fir.shape % 424d6d9a8b8SValentin Clement ! CHECK: %[[A:.*]] = fir.array_load %arg0(%[[A_shape]]) 425d6d9a8b8SValentin Clement ! CHECK: %[[B_shape:.*]] = fir.shape % 426d6d9a8b8SValentin Clement ! CHECK: %[[B_slice:.*]] = fir.slice % 427d6d9a8b8SValentin Clement ! CHECK: %[[B:.*]] = fir.array_load %arg1(%[[B_shape]]) [%[[B_slice]]] 428d6d9a8b8SValentin Clement ! CHECK: %[[C_shape:.*]] = fir.shape % 429d6d9a8b8SValentin Clement ! CHECK: %[[C_slice:.*]] = fir.slice %{{.*}}, %{{.*}}, %{{.*}} path % 430d6d9a8b8SValentin Clement ! CHECK: %[[C:.*]] = fir.array_load %arg2(%[[C_shape]]) [%[[C_slice]]] 431d6d9a8b8SValentin Clement ! CHECK: %[[D_shape:.*]] = fir.shape % 432d6d9a8b8SValentin Clement ! CHECK: %[[D_slice:.*]] = fir.slice %{{.*}}, %{{.*}}, %{{.*}} path % 433d6d9a8b8SValentin Clement ! CHECK: %[[D:.*]] = fir.array_load %arg3(%[[D_shape]]) [%[[D_slice]]] 434d6d9a8b8SValentin Clement ! CHECK: = arith.constant -6.2598534E+18 : f32 435d6d9a8b8SValentin Clement ! CHECK: %[[A_result:.*]] = fir.do_loop %{{.*}} = %{{.*}} iter_args(%[[A_in:.*]] = %[[A]]) -> 436d6d9a8b8SValentin Clement ! CHECK: fir.array_fetch %[[B]], 437d6d9a8b8SValentin Clement ! CHECK: fir.array_fetch %[[C]], 438d6d9a8b8SValentin Clement ! CHECK: fir.array_fetch %[[D]], 439d6d9a8b8SValentin Clement ! CHECK: fir.array_update %[[A_in]], 440d6d9a8b8SValentin Clement a = b(i:i+2*n-2:2) + c%im - d(i:i+2*n-2:2)%re + x'deadbeef' 441d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[A]], %[[A_result]] to %arg0 442d6d9a8b8SValentin Clementend subroutine test13 443d6d9a8b8SValentin Clement 444d6d9a8b8SValentin Clement! Test elemental call to function f 445d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest14( 446d6d9a8b8SValentin Clement! CHECK-SAME: %[[a:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}, %[[b:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}) 447d6d9a8b8SValentin Clementsubroutine test14(a,b) 448d6d9a8b8SValentin Clement ! CHECK: %[[barr:.*]] = fir.array_load %[[b]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 449d6d9a8b8SValentin Clement interface 450d6d9a8b8SValentin Clement real elemental function f1(i) 451d6d9a8b8SValentin Clement real, intent(in) :: i 452d6d9a8b8SValentin Clement end function f1 453d6d9a8b8SValentin Clement end interface 454d6d9a8b8SValentin Clement real :: a(100), b(100) 455d6d9a8b8SValentin Clement ! CHECK: %[[loop:.*]] = fir.do_loop %[[i:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[bth:.*]] = %[[barr]]) -> (!fir.array<100xf32>) { 456d6d9a8b8SValentin Clement ! CHECK: %[[ishift:.*]] = arith.addi %[[i]], %c1{{.*}} : index 457d6d9a8b8SValentin Clement ! CHECK: %[[tmp:.*]] = fir.array_coor %[[a]](%{{.*}}) %[[ishift]] : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, index) -> !fir.ref<f32> 458d6d9a8b8SValentin Clement ! CHECK: %[[fres:.*]] = fir.call @_QPf1(%[[tmp]]) : (!fir.ref<f32>) -> f32 459d6d9a8b8SValentin Clement ! CHECK: %[[res:.*]] = fir.array_update %[[bth]], %[[fres]], %[[i]] : (!fir.array<100xf32>, f32, index) -> !fir.array<100xf32> 460d6d9a8b8SValentin Clement ! CHECK: fir.result %[[res]] : !fir.array<100xf32> 461d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[barr]], %[[loop]] to %[[b]] 462d6d9a8b8SValentin Clement b = f1(a) 463d6d9a8b8SValentin Clementend subroutine test14 464d6d9a8b8SValentin Clement 465d6d9a8b8SValentin Clement! Test elemental intrinsic function (abs) 466d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest15( 467d6d9a8b8SValentin Clement! CHECK-SAME: %[[a:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}, %[[b:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}) 468d6d9a8b8SValentin Clementsubroutine test15(a,b) 469d6d9a8b8SValentin Clement ! CHECK-DAG: %[[barr:.*]] = fir.array_load %[[b]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 470d6d9a8b8SValentin Clement ! CHECK-DAG: %[[aarr:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 471d6d9a8b8SValentin Clement real :: a(100), b(100) 472d6d9a8b8SValentin Clement ! CHECK: %[[loop:.*]] = fir.do_loop %[[i:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[bth:.*]] = %[[barr]]) -> (!fir.array<100xf32>) { 473d6d9a8b8SValentin Clement ! CHECK: %[[val:.*]] = fir.array_fetch %[[aarr]], %[[i]] : (!fir.array<100xf32>, index) -> f32 474*f5759addSSlava Zakharin ! CHECK: %[[fres:.*]] = math.abs %[[val]] : f32 475d6d9a8b8SValentin Clement ! CHECK: %[[res:.*]] = fir.array_update %[[bth]], %[[fres]], %[[i]] : (!fir.array<100xf32>, f32, index) -> !fir.array<100xf32> 476d6d9a8b8SValentin Clement ! CHECK: fir.result %[[res]] : !fir.array<100xf32> 477d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[barr]], %[[loop]] to %[[b]] 478d6d9a8b8SValentin Clement b = abs(a) 479d6d9a8b8SValentin Clementend subroutine test15 480d6d9a8b8SValentin Clement 481d6d9a8b8SValentin Clement! Test elemental call to function f2 with VALUE attribute 482d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest16( 483d6d9a8b8SValentin Clement! CHECK-SAME: %[[a:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}, %[[b:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}) 484d6d9a8b8SValentin Clementsubroutine test16(a,b) 485d6d9a8b8SValentin Clement ! CHECK: %[[tmp:.*]] = fir.alloca f32 {adapt.valuebyref 486d6d9a8b8SValentin Clement ! CHECK-DAG: %[[aarr:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 487d6d9a8b8SValentin Clement ! CHECK-DAG: %[[barr:.*]] = fir.array_load %[[b]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 488d6d9a8b8SValentin Clement interface 489d6d9a8b8SValentin Clement real elemental function f2(i) 490d6d9a8b8SValentin Clement real, VALUE :: i 491d6d9a8b8SValentin Clement end function f2 492d6d9a8b8SValentin Clement end interface 493d6d9a8b8SValentin Clement real :: a(100), b(100) 494d6d9a8b8SValentin Clement ! CHECK: %[[loop:.*]] = fir.do_loop %[[i:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[bth:.*]] = %[[barr]]) -> (!fir.array<100xf32>) { 495d6d9a8b8SValentin Clement ! CHECK: %[[val:.*]] = fir.array_fetch %[[aarr]], %[[i]] : (!fir.array<100xf32>, index) -> f32 496d6d9a8b8SValentin Clement ! CHECK: fir.store %[[val]] to %[[tmp]] 497d6d9a8b8SValentin Clement ! CHECK: %[[fres:.*]] = fir.call @_QPf2(%[[tmp]]) : (!fir.ref<f32>) -> f32 498d6d9a8b8SValentin Clement ! CHECK: %[[res:.*]] = fir.array_update %[[bth]], %[[fres]], %[[i]] : (!fir.array<100xf32>, f32, index) -> !fir.array<100xf32> 499d6d9a8b8SValentin Clement ! CHECK: fir.result %[[res]] : !fir.array<100xf32> 500d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[barr]], %[[loop]] to %[[b]] 501d6d9a8b8SValentin Clement b = f2(a) 502d6d9a8b8SValentin Clementend subroutine test16 503d6d9a8b8SValentin Clement 504d6d9a8b8SValentin Clement! Test elemental impure call to function f3. 505d6d9a8b8SValentin Clement! 506d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest17( 507d6d9a8b8SValentin Clement! CHECK-SAME: %[[a:[^:]+]]: !fir.ref<!fir.array<100xf32>>{{.*}}, %[[b:[^:]+]]: !fir.ref<!fir.array<100xf32>>{{.*}}, %[[c:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}) 508d6d9a8b8SValentin Clementsubroutine test17(a,b,c) 509d6d9a8b8SValentin Clement ! CHECK-DAG: %[[aarr:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 510d6d9a8b8SValentin Clement ! CHECK-DAG: %[[barr:.*]] = fir.array_load %[[b]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shapeshift<1>) -> !fir.array<100xf32> 511d6d9a8b8SValentin Clement interface 512d6d9a8b8SValentin Clement real elemental impure function f3(i,j,k) 513d6d9a8b8SValentin Clement real, intent(inout) :: i, j, k 514d6d9a8b8SValentin Clement end function f3 515d6d9a8b8SValentin Clement end interface 516d6d9a8b8SValentin Clement real :: a(100), b(2:101), c(3:102) 517d6d9a8b8SValentin Clement ! CHECK: %[[loop:.*]] = fir.do_loop %[[i:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[bth:.*]] = %[[barr]]) -> (!fir.array<100xf32>) { 518d6d9a8b8SValentin Clement ! CHECK-DAG: %[[val:.*]] = fir.array_fetch %[[aarr]], %[[i]] : (!fir.array<100xf32>, index) -> f32 519d6d9a8b8SValentin Clement ! CHECK-DAG: %[[ic:.*]] = arith.addi %[[i]], %c3{{.*}} : index 520d6d9a8b8SValentin Clement ! CHECK-DAG: %[[ccoor:.*]] = fir.array_coor %[[c]](%{{.*}}) %[[ic]] : (!fir.ref<!fir.array<100xf32>>, !fir.shapeshift<1>, index) -> !fir.ref<f32> 521d6d9a8b8SValentin Clement ! CHECK-DAG: %[[ib:.*]] = arith.addi %[[i]], %c2{{.*}} : index 522d6d9a8b8SValentin Clement ! CHECK-DAG: %[[bcoor:.*]] = fir.array_coor %[[b]](%{{.*}}) %[[ib]] : (!fir.ref<!fir.array<100xf32>>, !fir.shapeshift<1>, index) -> !fir.ref<f32> 523d6d9a8b8SValentin Clement ! CHECK-DAG: %[[ia:.*]] = arith.addi %[[i]], %c1{{.*}} : index 524d6d9a8b8SValentin Clement ! CHECK-DAG: %[[acoor:.*]] = fir.array_coor %[[a]](%{{.*}}) %[[ia]] : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, index) -> !fir.ref<f32> 525d6d9a8b8SValentin Clement ! CHECK: %[[fres:.*]] = fir.call @_QPf3(%[[ccoor]], %[[bcoor]], %[[acoor]]) : (!fir.ref<f32>, !fir.ref<f32>, !fir.ref<f32>) -> f32 526d6d9a8b8SValentin Clement ! CHECK: %[[fadd:.*]] = arith.addf %[[val]], %[[fres]] : f32 527d6d9a8b8SValentin Clement ! CHECK: %[[res:.*]] = fir.array_update %[[bth]], %[[fadd]], %[[i]] : (!fir.array<100xf32>, f32, index) -> !fir.array<100xf32> 528d6d9a8b8SValentin Clement 529d6d9a8b8SValentin Clement ! See 10.1.4.p2 note 1. The expression below is illegal if `f3` defines the 530d6d9a8b8SValentin Clement ! argument `a` for this statement. Since, this cannot be proven statically by 531d6d9a8b8SValentin Clement ! the compiler, the constraint is left to the user. The compiler may give a 532d6d9a8b8SValentin Clement ! warning that `k` is neither VALUE nor INTENT(IN) and the actual argument, 533d6d9a8b8SValentin Clement ! `a`, appears elsewhere in the same statement. 534d6d9a8b8SValentin Clement b = a + f3(c, b, a) 535d6d9a8b8SValentin Clement 536d6d9a8b8SValentin Clement ! CHECK: fir.result %[[res]] : !fir.array<100xf32> 537d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[barr]], %[[loop]] to %[[b]] 538d6d9a8b8SValentin Clementend subroutine test17 539d6d9a8b8SValentin Clement 540d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest18() { 541d6d9a8b8SValentin Clement! CHECK: %[[VAL_0:.*]] = arith.constant 10 : index 542d6d9a8b8SValentin Clement! CHECK: %[[VAL_1:.*]] = arith.constant 10 : index 543d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.array<10x10xi32> {bindc_name = "array", fir.target, uniq_name = "_QFtest18Earray"} 544d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFtest18Ei"} 545d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = fir.alloca !fir.box<!fir.ptr<!fir.array<?xi32>>> {bindc_name = "row_i", uniq_name = "_QFtest18Erow_i"} 546d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.zero_bits !fir.ptr<!fir.array<?xi32>> 547d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 0 : index 548d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1> 549d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.embox %[[VAL_5]](%[[VAL_7]]) : (!fir.ptr<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>> 550d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_8]] to %[[VAL_4]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> 551d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.constant 1 : index 552d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32> 553d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i32) -> i64 554d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.undefined index 555d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 1 : i64 556d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i64) -> index 557d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.addi %[[VAL_9]], %[[VAL_1]] : index 558d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.subi %[[VAL_15]], %[[VAL_9]] : index 559d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.shape %[[VAL_0]], %[[VAL_1]] : (index, index) -> !fir.shape<2> 560d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.slice %[[VAL_11]], %[[VAL_12]], %[[VAL_12]], %[[VAL_9]], %[[VAL_16]], %[[VAL_14]] : (i64, index, index, index, index, index) -> !fir.slice<2> 561d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.embox %[[VAL_2]](%[[VAL_17]]) {{\[}}%[[VAL_18]]] : (!fir.ref<!fir.array<10x10xi32>>, !fir.shape<2>, !fir.slice<2>) -> !fir.box<!fir.array<?xi32>> 562d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.rebox %[[VAL_19]] : (!fir.box<!fir.array<?xi32>>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>> 563d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_20]] to %[[VAL_4]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> 564d6d9a8b8SValentin Clement! CHECK: return 565d6d9a8b8SValentin Clement! CHECK: } 566d6d9a8b8SValentin Clement 567d6d9a8b8SValentin Clementsubroutine test18 568d6d9a8b8SValentin Clement integer, target :: array(10,10) 569d6d9a8b8SValentin Clement integer, pointer :: row_i(:) 570d6d9a8b8SValentin Clement row_i => array(i, :) 571d6d9a8b8SValentin Clementend subroutine test18 572d6d9a8b8SValentin Clement 573d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest_column_and_row_order( 574d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<2x3xf32>>{{.*}}) { 575d6d9a8b8SValentin Clement! CHECK: %[[VAL_1:.*]] = arith.constant 2 : index 576d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]] = arith.constant 3 : index 577d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.shape %[[VAL_1]], %[[VAL_2]] : (index, index) -> !fir.shape<2> 578d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = fir.array_load %[[VAL_0]](%[[VAL_3]]) : (!fir.ref<!fir.array<2x3xf32>>, !fir.shape<2>) -> !fir.array<2x3xf32> 579d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = arith.constant 42 : i32 580d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> f32 581d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 1 : index 582d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 0 : index 583d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.subi %[[VAL_1]], %[[VAL_7]] : index 584d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.subi %[[VAL_2]], %[[VAL_7]] : index 585d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.do_loop %[[VAL_12:.*]] = %[[VAL_8]] to %[[VAL_10]] step %[[VAL_7]] unordered iter_args(%[[VAL_13:.*]] = %[[VAL_4]]) -> (!fir.array<2x3xf32>) { 586d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.do_loop %[[VAL_15:.*]] = %[[VAL_8]] to %[[VAL_9]] step %[[VAL_7]] unordered iter_args(%[[VAL_16:.*]] = %[[VAL_13]]) -> (!fir.array<2x3xf32>) { 587d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.array_update %[[VAL_16]], %[[VAL_6]], %[[VAL_15]], %[[VAL_12]] : (!fir.array<2x3xf32>, f32, index, index) -> !fir.array<2x3xf32> 588d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_17]] : !fir.array<2x3xf32> 589d6d9a8b8SValentin Clement! CHECK: } 590d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_18:.*]] : !fir.array<2x3xf32> 591d6d9a8b8SValentin Clement! CHECK: } 592d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_4]], %[[VAL_19:.*]] to %[[VAL_0]] : !fir.array<2x3xf32>, !fir.array<2x3xf32>, !fir.ref<!fir.array<2x3xf32>> 593d6d9a8b8SValentin Clement! CHECK: return 594d6d9a8b8SValentin Clement! CHECK: } 595d6d9a8b8SValentin Clement 596d6d9a8b8SValentin Clementsubroutine test_column_and_row_order(x) 597d6d9a8b8SValentin Clement real :: x(2,3) 598d6d9a8b8SValentin Clement x = 42 599d6d9a8b8SValentin Clementend subroutine 600d6d9a8b8SValentin Clement 601d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest_assigning_to_assumed_shape_slices( 602d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>>{{.*}}) { 603d6d9a8b8SValentin Clement! CHECK: %[[VAL_1:.*]] = arith.constant 1 : index 604d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]] = arith.constant 2 : i64 605d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (i64) -> index 606d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 0 : index 607d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:3 = fir.box_dims %[[VAL_0]], %[[VAL_4]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index) 608d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.addi %[[VAL_1]], %[[VAL_5]]#1 : index 609d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.subi %[[VAL_6]], %[[VAL_1]] : index 610d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 0 : index 611d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.subi %[[VAL_7]], %[[VAL_1]] : index 612d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.addi %[[VAL_9]], %[[VAL_3]] : index 613d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.divsi %[[VAL_10]], %[[VAL_3]] : index 614d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.cmpi sgt, %[[VAL_11]], %[[VAL_8]] : index 615d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.select %[[VAL_12]], %[[VAL_11]], %[[VAL_8]] : index 616d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.slice %[[VAL_1]], %[[VAL_7]], %[[VAL_3]] : (index, index, index) -> !fir.slice<1> 617d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.array_load %[[VAL_0]] {{\[}}%[[VAL_14]]] : (!fir.box<!fir.array<?xi32>>, !fir.slice<1>) -> !fir.array<?xi32> 618d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.constant 42 : i32 619d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = arith.constant 1 : index 620d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.constant 0 : index 621d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = arith.subi %[[VAL_13]], %[[VAL_17]] : index 622d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.do_loop %[[VAL_21:.*]] = %[[VAL_18]] to %[[VAL_19]] step %[[VAL_17]] unordered iter_args(%[[VAL_22:.*]] = %[[VAL_15]]) -> (!fir.array<?xi32>) { 623d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = fir.array_update %[[VAL_22]], %[[VAL_16]], %[[VAL_21]] : (!fir.array<?xi32>, i32, index) -> !fir.array<?xi32> 624d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_23]] : !fir.array<?xi32> 625d6d9a8b8SValentin Clement! CHECK: } 626d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_15]], %[[VAL_24:.*]] to %[[VAL_0]]{{\[}}%[[VAL_14]]] : !fir.array<?xi32>, !fir.array<?xi32>, !fir.box<!fir.array<?xi32>>, !fir.slice<1> 627d6d9a8b8SValentin Clement! CHECK: return 628d6d9a8b8SValentin Clement! CHECK: } 629d6d9a8b8SValentin Clement 630d6d9a8b8SValentin Clementsubroutine test_assigning_to_assumed_shape_slices(x) 631d6d9a8b8SValentin Clement integer :: x(:) 632d6d9a8b8SValentin Clement x(::2) = 42 633d6d9a8b8SValentin Clementend subroutine 634d6d9a8b8SValentin Clement 635d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19a( 636d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}) { 637d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 638d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,10>>> 639d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index 640d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 641d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,10>>> 642d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 10 : index 643d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 644d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.array_load %[[VAL_3]](%[[VAL_8]]) : (!fir.ref<!fir.array<10x!fir.char<1,10>>>, !fir.shape<1>) -> !fir.array<10x!fir.char<1,10>> 645d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1> 646d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.array_load %[[VAL_6]](%[[VAL_10]]) : (!fir.ref<!fir.array<10x!fir.char<1,10>>>, !fir.shape<1>) -> !fir.array<10x!fir.char<1,10>> 647d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant 1 : index 648d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 0 : index 649d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.subi %[[VAL_4]], %[[VAL_12]] : index 650d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.do_loop %[[VAL_16:.*]] = %[[VAL_13]] to %[[VAL_14]] step %[[VAL_12]] unordered iter_args(%[[VAL_17:.*]] = %[[VAL_9]]) -> (!fir.array<10x!fir.char<1,10>>) { 651d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.array_access %[[VAL_11]], %[[VAL_16]] : (!fir.array<10x!fir.char<1,10>>, index) -> !fir.ref<!fir.char<1,10>> 652d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.array_access %[[VAL_17]], %[[VAL_16]] : (!fir.array<10x!fir.char<1,10>>, index) -> !fir.ref<!fir.char<1,10>> 653d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.constant 10 : index 654d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.constant 1 : i64 655d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = fir.convert %[[VAL_20]] : (index) -> i64 656d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.muli %[[VAL_21]], %[[VAL_22]] : i64 657d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = arith.constant false 658d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<i8> 659d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_18]] : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<i8> 660f09b0c84SNikita Popov! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_25]], %[[VAL_26]], %[[VAL_23]], %[[VAL_24]]) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 661d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = fir.array_amend %[[VAL_17]], %[[VAL_19]] : (!fir.array<10x!fir.char<1,10>>, !fir.ref<!fir.char<1,10>>) -> !fir.array<10x!fir.char<1,10>> 662d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_27]] : !fir.array<10x!fir.char<1,10>> 663d6d9a8b8SValentin Clement! CHECK: } 664d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_9]], %[[VAL_28:.*]] to %[[VAL_3]] : !fir.array<10x!fir.char<1,10>>, !fir.array<10x!fir.char<1,10>>, !fir.ref<!fir.array<10x!fir.char<1,10>>> 665d6d9a8b8SValentin Clement! CHECK: return 666d6d9a8b8SValentin Clement! CHECK: } 667d6d9a8b8SValentin Clement 668d6d9a8b8SValentin Clementsubroutine test19a(a,b) 669d6d9a8b8SValentin Clement character(LEN=10) a(10) 670d6d9a8b8SValentin Clement character(LEN=10) b(10) 671d6d9a8b8SValentin Clement a = b 672d6d9a8b8SValentin Clementend subroutine test19a 673d6d9a8b8SValentin Clement 674d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19b( 675d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<2>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<2>{{.*}}) { 676d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<2>) -> (!fir.ref<!fir.char<2,?>>, index) 677d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<2,?>>) -> !fir.ref<!fir.array<20x!fir.char<2,8>>> 678d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 20 : index 679d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<2>) -> (!fir.ref<!fir.char<2,?>>, index) 680d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 10 : index 681d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.char<2,?>>) -> !fir.ref<!fir.array<20x!fir.char<2,10>>> 682d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 20 : index 683d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 684d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.array_load %[[VAL_3]](%[[VAL_9]]) : (!fir.ref<!fir.array<20x!fir.char<2,8>>>, !fir.shape<1>) -> !fir.array<20x!fir.char<2,8>> 685d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.shape %[[VAL_8]] : (index) -> !fir.shape<1> 686d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.array_load %[[VAL_7]](%[[VAL_11]]) : (!fir.ref<!fir.array<20x!fir.char<2,10>>>, !fir.shape<1>) -> !fir.array<20x!fir.char<2,10>> 687d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 1 : index 688d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.constant 0 : index 689d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.subi %[[VAL_4]], %[[VAL_13]] : index 690d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.do_loop %[[VAL_17:.*]] = %[[VAL_14]] to %[[VAL_15]] step %[[VAL_13]] unordered iter_args(%[[VAL_18:.*]] = %[[VAL_10]]) -> (!fir.array<20x!fir.char<2,8>>) { 691d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.array_access %[[VAL_12]], %[[VAL_17]] : (!fir.array<20x!fir.char<2,10>>, index) -> !fir.ref<!fir.char<2,10>> 692d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.array_access %[[VAL_18]], %[[VAL_17]] : (!fir.array<20x!fir.char<2,8>>, index) -> !fir.ref<!fir.char<2,8>> 693d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.constant 8 : index 694d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.cmpi slt, %[[VAL_21]], %[[VAL_6]] : index 695d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.select %[[VAL_22]], %[[VAL_21]], %[[VAL_6]] : index 696d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = arith.constant 2 : i64 697d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_23]] : (index) -> i64 698d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = arith.muli %[[VAL_24]], %[[VAL_25]] : i64 699d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant false 700d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_20]] : (!fir.ref<!fir.char<2,8>>) -> !fir.ref<i8> 701d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<!fir.char<2,10>>) -> !fir.ref<i8> 702f09b0c84SNikita Popov! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_28]], %[[VAL_29]], %[[VAL_26]], %[[VAL_27]]) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 703d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = arith.constant 1 : index 704d6d9a8b8SValentin Clement! CHECK: %[[VAL_31:.*]] = arith.subi %[[VAL_21]], %[[VAL_30]] : index 705d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.constant 32 : i16 706d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.undefined !fir.char<2> 707d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.insert_value %[[VAL_33]], %[[VAL_32]], [0 : index] : (!fir.char<2>, i16) -> !fir.char<2> 708d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = arith.constant 1 : index 709d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_36:.*]] = %[[VAL_23]] to %[[VAL_31]] step %[[VAL_35]] { 710d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = fir.convert %[[VAL_20]] : (!fir.ref<!fir.char<2,8>>) -> !fir.ref<!fir.array<8x!fir.char<2>>> 711d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = fir.coordinate_of %[[VAL_37]], %[[VAL_36]] : (!fir.ref<!fir.array<8x!fir.char<2>>>, index) -> !fir.ref<!fir.char<2>> 712d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_34]] to %[[VAL_38]] : !fir.ref<!fir.char<2>> 713d6d9a8b8SValentin Clement! CHECK: } 714d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = fir.array_amend %[[VAL_18]], %[[VAL_20]] : (!fir.array<20x!fir.char<2,8>>, !fir.ref<!fir.char<2,8>>) -> !fir.array<20x!fir.char<2,8>> 715d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_39]] : !fir.array<20x!fir.char<2,8>> 716d6d9a8b8SValentin Clement! CHECK: } 717d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_10]], %[[VAL_40:.*]] to %[[VAL_3]] : !fir.array<20x!fir.char<2,8>>, !fir.array<20x!fir.char<2,8>>, !fir.ref<!fir.array<20x!fir.char<2,8>>> 718d6d9a8b8SValentin Clement! CHECK: return 719d6d9a8b8SValentin Clement! CHECK: } 720d6d9a8b8SValentin Clement 721d6d9a8b8SValentin Clementsubroutine test19b(a,b) 722d6d9a8b8SValentin Clement character(KIND=2, LEN=8) a(20) 723d6d9a8b8SValentin Clement character(KIND=2, LEN=10) b(20) 724d6d9a8b8SValentin Clement a = b 725d6d9a8b8SValentin Clementend subroutine test19b 726d6d9a8b8SValentin Clement 727d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19c( 728d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<4>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<4>{{.*}}, %[[VAL_2:.*]]: !fir.ref<i32>{{.*}}) { 729d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<4>) -> (!fir.ref<!fir.char<4,?>>, index) 730d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index 731d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<30x!fir.char<4,10>>> 732d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 30 : index 733d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<4>) -> (!fir.ref<!fir.char<4,?>>, index) 734d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 735d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.constant 0 : i32 736d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.cmpi sgt, %[[VAL_8]], %[[VAL_9]] : i32 737d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.select %[[VAL_10]], %[[VAL_8]], %[[VAL_9]] : i32 738d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<30x!fir.char<4,?>>> 739d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 30 : index 740d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.shape %[[VAL_13]] : (index) -> !fir.shape<1> 741d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.array_load %[[VAL_12]](%[[VAL_14]]) typeparams %[[VAL_11]] : (!fir.ref<!fir.array<30x!fir.char<4,?>>>, !fir.shape<1>, i32) -> !fir.array<30x!fir.char<4,?>> 742d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1> 743d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.array_load %[[VAL_5]](%[[VAL_16]]) : (!fir.ref<!fir.array<30x!fir.char<4,10>>>, !fir.shape<1>) -> !fir.array<30x!fir.char<4,10>> 744d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.constant 1 : index 745d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = arith.constant 0 : index 746d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.subi %[[VAL_13]], %[[VAL_18]] : index 747d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = fir.do_loop %[[VAL_22:.*]] = %[[VAL_19]] to %[[VAL_20]] step %[[VAL_18]] unordered iter_args(%[[VAL_23:.*]] = %[[VAL_15]]) -> (!fir.array<30x!fir.char<4,?>>) { 748d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.array_access %[[VAL_17]], %[[VAL_22]] : (!fir.array<30x!fir.char<4,10>>, index) -> !fir.ref<!fir.char<4,10>> 749d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.array_access %[[VAL_23]], %[[VAL_22]] typeparams %[[VAL_11]] : (!fir.array<30x!fir.char<4,?>>, index, i32) -> !fir.ref<!fir.char<4,?>> 750d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_11]] : (i32) -> index 751d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.cmpi slt, %[[VAL_26]], %[[VAL_4]] : index 752d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.select %[[VAL_27]], %[[VAL_26]], %[[VAL_4]] : index 753d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.constant 4 : i64 754d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_28]] : (index) -> i64 755d6d9a8b8SValentin Clement! CHECK: %[[VAL_31:.*]] = arith.muli %[[VAL_29]], %[[VAL_30]] : i64 756d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.constant false 757d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_25]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<i8> 758d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.convert %[[VAL_24]] : (!fir.ref<!fir.char<4,10>>) -> !fir.ref<i8> 759f09b0c84SNikita Popov! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_33]], %[[VAL_34]], %[[VAL_31]], %[[VAL_32]]) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 760d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = arith.constant 1 : i32 761d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = arith.subi %[[VAL_11]], %[[VAL_35]] : i32 762d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = arith.constant 32 : i32 763d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = fir.undefined !fir.char<4> 764d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = fir.insert_value %[[VAL_38]], %[[VAL_37]], [0 : index] : (!fir.char<4>, i32) -> !fir.char<4> 765d6d9a8b8SValentin Clement! CHECK: %[[VAL_40:.*]] = arith.constant 1 : index 766d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = fir.convert %[[VAL_36]] : (i32) -> index 767d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_42:.*]] = %[[VAL_28]] to %[[VAL_41]] step %[[VAL_40]] { 768d6d9a8b8SValentin Clement! CHECK: %[[VAL_43:.*]] = fir.convert %[[VAL_25]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<?x!fir.char<4>>> 769d6d9a8b8SValentin Clement! CHECK: %[[VAL_44:.*]] = fir.coordinate_of %[[VAL_43]], %[[VAL_42]] : (!fir.ref<!fir.array<?x!fir.char<4>>>, index) -> !fir.ref<!fir.char<4>> 770d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_39]] to %[[VAL_44]] : !fir.ref<!fir.char<4>> 771d6d9a8b8SValentin Clement! CHECK: } 772d6d9a8b8SValentin Clement! CHECK: %[[VAL_45:.*]] = fir.array_amend %[[VAL_23]], %[[VAL_25]] : (!fir.array<30x!fir.char<4,?>>, !fir.ref<!fir.char<4,?>>) -> !fir.array<30x!fir.char<4,?>> 773d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_45]] : !fir.array<30x!fir.char<4,?>> 774d6d9a8b8SValentin Clement! CHECK: } 775d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_15]], %[[VAL_46:.*]] to %[[VAL_12]] typeparams %[[VAL_11]] : !fir.array<30x!fir.char<4,?>>, !fir.array<30x!fir.char<4,?>>, !fir.ref<!fir.array<30x!fir.char<4,?>>>, i32 776d6d9a8b8SValentin Clement! CHECK: return 777d6d9a8b8SValentin Clement! CHECK: } 778d6d9a8b8SValentin Clement 779d6d9a8b8SValentin Clementsubroutine test19c(a,b,i) 780d6d9a8b8SValentin Clement character(KIND=4, LEN=i) a(30) 781d6d9a8b8SValentin Clement character(KIND=4, LEN=10) b(30) 782d6d9a8b8SValentin Clement a = b 783d6d9a8b8SValentin Clementend subroutine test19c 784d6d9a8b8SValentin Clement 785d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19d( 786d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_2:.*]]: !fir.ref<i32>{{.*}}, %[[VAL_3:.*]]: !fir.ref<i32>{{.*}}) { 787d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 788d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 789d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i32 790d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.cmpi sgt, %[[VAL_5]], %[[VAL_6]] : i32 791d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.select %[[VAL_7]], %[[VAL_5]], %[[VAL_6]] : i32 792d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_4]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<40x!fir.char<1,?>>> 793d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.constant 40 : index 794d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 795d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32> 796d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 0 : i32 797d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.cmpi sgt, %[[VAL_12]], %[[VAL_13]] : i32 798d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.select %[[VAL_14]], %[[VAL_12]], %[[VAL_13]] : i32 799d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_11]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<40x!fir.char<1,?>>> 800d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = arith.constant 40 : index 801d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.shape %[[VAL_10]] : (index) -> !fir.shape<1> 802d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.array_load %[[VAL_9]](%[[VAL_18]]) typeparams %[[VAL_8]] : (!fir.ref<!fir.array<40x!fir.char<1,?>>>, !fir.shape<1>, i32) -> !fir.array<40x!fir.char<1,?>> 803d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.shape %[[VAL_17]] : (index) -> !fir.shape<1> 804d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = fir.array_load %[[VAL_16]](%[[VAL_20]]) typeparams %[[VAL_15]] : (!fir.ref<!fir.array<40x!fir.char<1,?>>>, !fir.shape<1>, i32) -> !fir.array<40x!fir.char<1,?>> 805d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.constant 1 : index 806d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.constant 0 : index 807d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = arith.subi %[[VAL_10]], %[[VAL_22]] : index 808d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.do_loop %[[VAL_26:.*]] = %[[VAL_23]] to %[[VAL_24]] step %[[VAL_22]] unordered iter_args(%[[VAL_27:.*]] = %[[VAL_19]]) -> (!fir.array<40x!fir.char<1,?>>) { 809d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = fir.array_access %[[VAL_21]], %[[VAL_26]] typeparams %[[VAL_15]] : (!fir.array<40x!fir.char<1,?>>, index, i32) -> !fir.ref<!fir.char<1,?>> 810d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = fir.array_access %[[VAL_27]], %[[VAL_26]] typeparams %[[VAL_8]] : (!fir.array<40x!fir.char<1,?>>, index, i32) -> !fir.ref<!fir.char<1,?>> 811d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_8]] : (i32) -> index 812d6d9a8b8SValentin Clement! CHECK: %[[VAL_31:.*]] = fir.convert %[[VAL_15]] : (i32) -> index 813d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.cmpi slt, %[[VAL_30]], %[[VAL_31]] : index 814d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = arith.select %[[VAL_32]], %[[VAL_30]], %[[VAL_31]] : index 815d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = arith.constant 1 : i64 816d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_33]] : (index) -> i64 817d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = arith.muli %[[VAL_34]], %[[VAL_35]] : i64 818d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = arith.constant false 819d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = fir.convert %[[VAL_29]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 820d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = fir.convert %[[VAL_28]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 821f09b0c84SNikita Popov! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_38]], %[[VAL_39]], %[[VAL_36]], %[[VAL_37]]) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 822d6d9a8b8SValentin Clement! CHECK: %[[VAL_40:.*]] = arith.constant 1 : i32 823d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = arith.subi %[[VAL_8]], %[[VAL_40]] : i32 824d6d9a8b8SValentin Clement! CHECK: %[[VAL_42:.*]] = arith.constant 32 : i8 825d6d9a8b8SValentin Clement! CHECK: %[[VAL_43:.*]] = fir.undefined !fir.char<1> 826d6d9a8b8SValentin Clement! CHECK: %[[VAL_44:.*]] = fir.insert_value %[[VAL_43]], %[[VAL_42]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 827d6d9a8b8SValentin Clement! CHECK: %[[VAL_45:.*]] = arith.constant 1 : index 828d6d9a8b8SValentin Clement! CHECK: %[[VAL_46:.*]] = fir.convert %[[VAL_41]] : (i32) -> index 829d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_47:.*]] = %[[VAL_33]] to %[[VAL_46]] step %[[VAL_45]] { 830d6d9a8b8SValentin Clement! CHECK: %[[VAL_48:.*]] = fir.convert %[[VAL_29]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 831d6d9a8b8SValentin Clement! CHECK: %[[VAL_49:.*]] = fir.coordinate_of %[[VAL_48]], %[[VAL_47]] : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 832d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_44]] to %[[VAL_49]] : !fir.ref<!fir.char<1>> 833d6d9a8b8SValentin Clement! CHECK: } 834d6d9a8b8SValentin Clement! CHECK: %[[VAL_50:.*]] = fir.array_amend %[[VAL_27]], %[[VAL_29]] : (!fir.array<40x!fir.char<1,?>>, !fir.ref<!fir.char<1,?>>) -> !fir.array<40x!fir.char<1,?>> 835d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_50]] : !fir.array<40x!fir.char<1,?>> 836d6d9a8b8SValentin Clement! CHECK: } 837d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_19]], %[[VAL_51:.*]] to %[[VAL_9]] typeparams %[[VAL_8]] : !fir.array<40x!fir.char<1,?>>, !fir.array<40x!fir.char<1,?>>, !fir.ref<!fir.array<40x!fir.char<1,?>>>, i32 838d6d9a8b8SValentin Clement! CHECK: return 839d6d9a8b8SValentin Clement! CHECK: } 840d6d9a8b8SValentin Clement 841d6d9a8b8SValentin Clementsubroutine test19d(a,b,i,j) 842d6d9a8b8SValentin Clement character(i) a(40) 843d6d9a8b8SValentin Clement character(j) b(40) 844d6d9a8b8SValentin Clement a = b 845d6d9a8b8SValentin Clementend subroutine test19d 846d6d9a8b8SValentin Clement 847d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19e( 848d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}) { 849d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 850d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<50x!fir.char<1,?>>> 851d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 50 : index 852d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 853d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<50x!fir.char<1,?>>> 854d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 50 : index 855d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 856d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.array_load %[[VAL_3]](%[[VAL_8]]) typeparams %[[VAL_2]]#1 : (!fir.ref<!fir.array<50x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.array<50x!fir.char<1,?>> 857d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1> 858d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.array_load %[[VAL_6]](%[[VAL_10]]) typeparams %[[VAL_5]]#1 : (!fir.ref<!fir.array<50x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.array<50x!fir.char<1,?>> 859d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant 1 : index 860d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 0 : index 861d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.subi %[[VAL_4]], %[[VAL_12]] : index 862d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.do_loop %[[VAL_16:.*]] = %[[VAL_13]] to %[[VAL_14]] step %[[VAL_12]] unordered iter_args(%[[VAL_17:.*]] = %[[VAL_9]]) -> (!fir.array<50x!fir.char<1,?>>) { 863d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.array_access %[[VAL_11]], %[[VAL_16]] typeparams %[[VAL_5]]#1 : (!fir.array<50x!fir.char<1,?>>, index, index) -> !fir.ref<!fir.char<1,?>> 864d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.array_access %[[VAL_17]], %[[VAL_16]] typeparams %[[VAL_2]]#1 : (!fir.array<50x!fir.char<1,?>>, index, index) -> !fir.ref<!fir.char<1,?>> 865d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.cmpi slt, %[[VAL_2]]#1, %[[VAL_5]]#1 : index 866d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.select %[[VAL_20]], %[[VAL_2]]#1, %[[VAL_5]]#1 : index 867d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.constant 1 : i64 868d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_21]] : (index) -> i64 869d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = arith.muli %[[VAL_22]], %[[VAL_23]] : i64 870d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = arith.constant false 871d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 872d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_18]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 873f09b0c84SNikita Popov! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_26]], %[[VAL_27]], %[[VAL_24]], %[[VAL_25]]) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 874d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.constant 1 : index 875d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.subi %[[VAL_2]]#1, %[[VAL_28]] : index 876d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = arith.constant 32 : i8 877d6d9a8b8SValentin Clement! CHECK: %[[VAL_31:.*]] = fir.undefined !fir.char<1> 878d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = fir.insert_value %[[VAL_31]], %[[VAL_30]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 879d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = arith.constant 1 : index 880d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_34:.*]] = %[[VAL_21]] to %[[VAL_29]] step %[[VAL_33]] { 881d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 882d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = fir.coordinate_of %[[VAL_35]], %[[VAL_34]] : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 883d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_32]] to %[[VAL_36]] : !fir.ref<!fir.char<1>> 884d6d9a8b8SValentin Clement! CHECK: } 885d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = fir.array_amend %[[VAL_17]], %[[VAL_19]] : (!fir.array<50x!fir.char<1,?>>, !fir.ref<!fir.char<1,?>>) -> !fir.array<50x!fir.char<1,?>> 886d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_37]] : !fir.array<50x!fir.char<1,?>> 887d6d9a8b8SValentin Clement! CHECK: } 888d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_9]], %[[VAL_38:.*]] to %[[VAL_3]] typeparams %[[VAL_2]]#1 : !fir.array<50x!fir.char<1,?>>, !fir.array<50x!fir.char<1,?>>, !fir.ref<!fir.array<50x!fir.char<1,?>>>, index 889d6d9a8b8SValentin Clement! CHECK: return 890d6d9a8b8SValentin Clement! CHECK: } 891d6d9a8b8SValentin Clement 892d6d9a8b8SValentin Clementsubroutine test19e(a,b) 893d6d9a8b8SValentin Clement character(*) a(50) 894d6d9a8b8SValentin Clement character(*) b(50) 895d6d9a8b8SValentin Clement a = b 896d6d9a8b8SValentin Clementend subroutine test19e 897d6d9a8b8SValentin Clement 898d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19f( 899d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}) { 900d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 901d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<60x!fir.char<1,?>>> 902d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 60 : index 903d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 904d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<60x!fir.char<1,?>>> 905d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 60 : index 906d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 907d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.array_load %[[VAL_3]](%[[VAL_8]]) typeparams %[[VAL_2]]#1 : (!fir.ref<!fir.array<60x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.array<60x!fir.char<1,?>> 908d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.address_of(@_QQcl.70726566697820) : !fir.ref<!fir.char<1,7>> 909d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.constant 7 : index 910d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1> 911d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = fir.array_load %[[VAL_6]](%[[VAL_12]]) typeparams %[[VAL_5]]#1 : (!fir.ref<!fir.array<60x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.array<60x!fir.char<1,?>> 912d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.constant 1 : index 913d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.constant 0 : index 914d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.subi %[[VAL_4]], %[[VAL_14]] : index 915d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.do_loop %[[VAL_18:.*]] = %[[VAL_15]] to %[[VAL_16]] step %[[VAL_14]] unordered iter_args(%[[VAL_19:.*]] = %[[VAL_9]]) -> (!fir.array<60x!fir.char<1,?>>) { 916d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.array_access %[[VAL_13]], %[[VAL_18]] typeparams %[[VAL_5]]#1 : (!fir.array<60x!fir.char<1,?>>, index, index) -> !fir.ref<!fir.char<1,?>> 917d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.addi %[[VAL_11]], %[[VAL_5]]#1 : index 918d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_21]] : index) {bindc_name = ".chrtmp"} 919d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.constant 1 : i64 920d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.convert %[[VAL_11]] : (index) -> i64 921d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = arith.muli %[[VAL_23]], %[[VAL_24]] : i64 922d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = arith.constant false 923d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_22]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 924d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_10]] : (!fir.ref<!fir.char<1,7>>) -> !fir.ref<i8> 925f09b0c84SNikita Popov! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_27]], %[[VAL_28]], %[[VAL_25]], %[[VAL_26]]) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 926d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.constant 1 : index 927d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = arith.subi %[[VAL_21]], %[[VAL_29]] : index 928d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_31:.*]] = %[[VAL_11]] to %[[VAL_30]] step %[[VAL_29]] { 929d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.subi %[[VAL_31]], %[[VAL_11]] : index 930d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_20]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 931d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.coordinate_of %[[VAL_33]], %[[VAL_32]] : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 932d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = fir.load %[[VAL_34]] : !fir.ref<!fir.char<1>> 933d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_22]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 934d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = fir.coordinate_of %[[VAL_36]], %[[VAL_31]] : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 935d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_35]] to %[[VAL_37]] : !fir.ref<!fir.char<1>> 936d6d9a8b8SValentin Clement! CHECK: } 937d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = fir.array_access %[[VAL_19]], %[[VAL_18]] typeparams %[[VAL_2]]#1 : (!fir.array<60x!fir.char<1,?>>, index, index) -> !fir.ref<!fir.char<1,?>> 938d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = arith.cmpi slt, %[[VAL_2]]#1, %[[VAL_21]] : index 939d6d9a8b8SValentin Clement! CHECK: %[[VAL_40:.*]] = arith.select %[[VAL_39]], %[[VAL_2]]#1, %[[VAL_21]] : index 940d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = arith.constant 1 : i64 941d6d9a8b8SValentin Clement! CHECK: %[[VAL_42:.*]] = fir.convert %[[VAL_40]] : (index) -> i64 942d6d9a8b8SValentin Clement! CHECK: %[[VAL_43:.*]] = arith.muli %[[VAL_41]], %[[VAL_42]] : i64 943d6d9a8b8SValentin Clement! CHECK: %[[VAL_44:.*]] = arith.constant false 944d6d9a8b8SValentin Clement! CHECK: %[[VAL_45:.*]] = fir.convert %[[VAL_38]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 945d6d9a8b8SValentin Clement! CHECK: %[[VAL_46:.*]] = fir.convert %[[VAL_22]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 946f09b0c84SNikita Popov! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_45]], %[[VAL_46]], %[[VAL_43]], %[[VAL_44]]) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 947d6d9a8b8SValentin Clement! CHECK: %[[VAL_47:.*]] = arith.constant 1 : index 948d6d9a8b8SValentin Clement! CHECK: %[[VAL_48:.*]] = arith.subi %[[VAL_2]]#1, %[[VAL_47]] : index 949d6d9a8b8SValentin Clement! CHECK: %[[VAL_49:.*]] = arith.constant 32 : i8 950d6d9a8b8SValentin Clement! CHECK: %[[VAL_50:.*]] = fir.undefined !fir.char<1> 951d6d9a8b8SValentin Clement! CHECK: %[[VAL_51:.*]] = fir.insert_value %[[VAL_50]], %[[VAL_49]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 952d6d9a8b8SValentin Clement! CHECK: %[[VAL_52:.*]] = arith.constant 1 : index 953d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_53:.*]] = %[[VAL_40]] to %[[VAL_48]] step %[[VAL_52]] { 954d6d9a8b8SValentin Clement! CHECK: %[[VAL_54:.*]] = fir.convert %[[VAL_38]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 955d6d9a8b8SValentin Clement! CHECK: %[[VAL_55:.*]] = fir.coordinate_of %[[VAL_54]], %[[VAL_53]] : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 956d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_51]] to %[[VAL_55]] : !fir.ref<!fir.char<1>> 957d6d9a8b8SValentin Clement! CHECK: } 958d6d9a8b8SValentin Clement! CHECK: %[[VAL_56:.*]] = fir.array_amend %[[VAL_19]], %[[VAL_38]] : (!fir.array<60x!fir.char<1,?>>, !fir.ref<!fir.char<1,?>>) -> !fir.array<60x!fir.char<1,?>> 959d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_56]] : !fir.array<60x!fir.char<1,?>> 960d6d9a8b8SValentin Clement! CHECK: } 961d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_9]], %[[VAL_57:.*]] to %[[VAL_3]] typeparams %[[VAL_2]]#1 : !fir.array<60x!fir.char<1,?>>, !fir.array<60x!fir.char<1,?>>, !fir.ref<!fir.array<60x!fir.char<1,?>>>, index 962d6d9a8b8SValentin Clement! CHECK: return 963d6d9a8b8SValentin Clement! CHECK: } 964d6d9a8b8SValentin Clement 965d6d9a8b8SValentin Clementsubroutine test19f(a,b) 966d6d9a8b8SValentin Clement character(*) a(60) 967d6d9a8b8SValentin Clement character(*) b(60) 968d6d9a8b8SValentin Clement a = "prefix " // b 969d6d9a8b8SValentin Clementend subroutine test19f 970d6d9a8b8SValentin Clement 971d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19g( 972d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<4>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<2>{{.*}}, %[[VAL_2:.*]]: !fir.ref<i32>{{.*}}) { 973d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<2>) -> (!fir.ref<!fir.char<2,?>>, index) 974d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 13 : index 975d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.ref<!fir.char<2,?>>) -> !fir.ref<!fir.array<140x!fir.char<2,13>>> 976d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 140 : index 977d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<4>) -> (!fir.ref<!fir.char<4,?>>, index) 978d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 979d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.constant 0 : i32 980d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.cmpi sgt, %[[VAL_8]], %[[VAL_9]] : i32 981d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.select %[[VAL_10]], %[[VAL_8]], %[[VAL_9]] : i32 982d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<70x!fir.char<4,?>>> 983d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 70 : index 984d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.shape %[[VAL_13]] : (index) -> !fir.shape<1> 985d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.array_load %[[VAL_12]](%[[VAL_14]]) typeparams %[[VAL_11]] : (!fir.ref<!fir.array<70x!fir.char<4,?>>>, !fir.shape<1>, i32) -> !fir.array<70x!fir.char<4,?>> 986d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.constant 1 : i64 987d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index 988d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.constant 2 : i64 989d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i64) -> index 990d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.constant 140 : i64 991d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> index 992d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1> 993d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = fir.slice %[[VAL_17]], %[[VAL_21]], %[[VAL_19]] : (index, index, index) -> !fir.slice<1> 994d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.array_load %[[VAL_5]](%[[VAL_22]]) {{\[}}%[[VAL_23]]] : (!fir.ref<!fir.array<140x!fir.char<2,13>>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<140x!fir.char<2,13>> 995d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 996d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i32) -> i64 997d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant 1 : index 998d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.constant 0 : index 999d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.subi %[[VAL_13]], %[[VAL_27]] : index 1000d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = fir.do_loop %[[VAL_31:.*]] = %[[VAL_28]] to %[[VAL_29]] step %[[VAL_27]] unordered iter_args(%[[VAL_32:.*]] = %[[VAL_15]]) -> (!fir.array<70x!fir.char<4,?>>) { 1001d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.array_access %[[VAL_24]], %[[VAL_31]] : (!fir.array<140x!fir.char<2,13>>, index) -> !fir.ref<!fir.char<2,13>> 1002d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.alloca !fir.char<4,?>(%[[VAL_4]] : index) 1003d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = arith.cmpi slt, %[[VAL_4]], %[[VAL_4]] : index 1004d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = arith.select %[[VAL_35]], %[[VAL_4]], %[[VAL_4]] : index 1005d6d9a8b8SValentin Clement! CHECK: fir.char_convert %[[VAL_33]] for %[[VAL_36]] to %[[VAL_34]] : !fir.ref<!fir.char<2,13>>, index, !fir.ref<!fir.char<4,?>> 1006d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = arith.constant 1 : index 1007d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = arith.subi %[[VAL_4]], %[[VAL_37]] : index 1008d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = arith.constant 32 : i32 1009d6d9a8b8SValentin Clement! CHECK: %[[VAL_40:.*]] = fir.undefined !fir.char<4> 1010d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = fir.insert_value %[[VAL_40]], %[[VAL_39]], [0 : index] : (!fir.char<4>, i32) -> !fir.char<4> 1011d6d9a8b8SValentin Clement! CHECK: %[[VAL_42:.*]] = arith.constant 1 : index 1012d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_43:.*]] = %[[VAL_36]] to %[[VAL_38]] step %[[VAL_42]] { 1013d6d9a8b8SValentin Clement! CHECK: %[[VAL_44:.*]] = fir.convert %[[VAL_34]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<?x!fir.char<4>>> 1014d6d9a8b8SValentin Clement! CHECK: %[[VAL_45:.*]] = fir.coordinate_of %[[VAL_44]], %[[VAL_43]] : (!fir.ref<!fir.array<?x!fir.char<4>>>, index) -> !fir.ref<!fir.char<4>> 1015d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_41]] to %[[VAL_45]] : !fir.ref<!fir.char<4>> 1016d6d9a8b8SValentin Clement! CHECK: } 1017d6d9a8b8SValentin Clement! CHECK: %[[VAL_46:.*]] = fir.array_access %[[VAL_32]], %[[VAL_31]] typeparams %[[VAL_11]] : (!fir.array<70x!fir.char<4,?>>, index, i32) -> !fir.ref<!fir.char<4,?>> 1018d6d9a8b8SValentin Clement! CHECK: %[[VAL_47:.*]] = fir.convert %[[VAL_11]] : (i32) -> index 1019d6d9a8b8SValentin Clement! CHECK: %[[VAL_48:.*]] = fir.convert %[[VAL_26]] : (i64) -> index 1020d6d9a8b8SValentin Clement! CHECK: %[[VAL_49:.*]] = arith.cmpi slt, %[[VAL_47]], %[[VAL_48]] : index 1021d6d9a8b8SValentin Clement! CHECK: %[[VAL_50:.*]] = arith.select %[[VAL_49]], %[[VAL_47]], %[[VAL_48]] : index 1022d6d9a8b8SValentin Clement! CHECK: %[[VAL_51:.*]] = arith.constant 4 : i64 1023d6d9a8b8SValentin Clement! CHECK: %[[VAL_52:.*]] = fir.convert %[[VAL_50]] : (index) -> i64 1024d6d9a8b8SValentin Clement! CHECK: %[[VAL_53:.*]] = arith.muli %[[VAL_51]], %[[VAL_52]] : i64 1025d6d9a8b8SValentin Clement! CHECK: %[[VAL_54:.*]] = arith.constant false 1026d6d9a8b8SValentin Clement! CHECK: %[[VAL_55:.*]] = fir.convert %[[VAL_46]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<i8> 1027d6d9a8b8SValentin Clement! CHECK: %[[VAL_56:.*]] = fir.convert %[[VAL_34]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<i8> 1028f09b0c84SNikita Popov! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_55]], %[[VAL_56]], %[[VAL_53]], %[[VAL_54]]) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 1029d6d9a8b8SValentin Clement! CHECK: %[[VAL_57:.*]] = arith.constant 1 : i32 1030d6d9a8b8SValentin Clement! CHECK: %[[VAL_58:.*]] = arith.subi %[[VAL_11]], %[[VAL_57]] : i32 1031d6d9a8b8SValentin Clement! CHECK: %[[VAL_59:.*]] = arith.constant 32 : i32 1032d6d9a8b8SValentin Clement! CHECK: %[[VAL_60:.*]] = fir.undefined !fir.char<4> 1033d6d9a8b8SValentin Clement! CHECK: %[[VAL_61:.*]] = fir.insert_value %[[VAL_60]], %[[VAL_59]], [0 : index] : (!fir.char<4>, i32) -> !fir.char<4> 1034d6d9a8b8SValentin Clement! CHECK: %[[VAL_62:.*]] = arith.constant 1 : index 1035d6d9a8b8SValentin Clement! CHECK: %[[VAL_63:.*]] = fir.convert %[[VAL_58]] : (i32) -> index 1036d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_64:.*]] = %[[VAL_50]] to %[[VAL_63]] step %[[VAL_62]] { 1037d6d9a8b8SValentin Clement! CHECK: %[[VAL_65:.*]] = fir.convert %[[VAL_46]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<?x!fir.char<4>>> 1038d6d9a8b8SValentin Clement! CHECK: %[[VAL_66:.*]] = fir.coordinate_of %[[VAL_65]], %[[VAL_64]] : (!fir.ref<!fir.array<?x!fir.char<4>>>, index) -> !fir.ref<!fir.char<4>> 1039d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_61]] to %[[VAL_66]] : !fir.ref<!fir.char<4>> 1040d6d9a8b8SValentin Clement! CHECK: } 1041d6d9a8b8SValentin Clement! CHECK: %[[VAL_67:.*]] = fir.array_amend %[[VAL_32]], %[[VAL_46]] : (!fir.array<70x!fir.char<4,?>>, !fir.ref<!fir.char<4,?>>) -> !fir.array<70x!fir.char<4,?>> 1042d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_67]] : !fir.array<70x!fir.char<4,?>> 1043d6d9a8b8SValentin Clement! CHECK: } 1044d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_15]], %[[VAL_68:.*]] to %[[VAL_12]] typeparams %[[VAL_11]] : !fir.array<70x!fir.char<4,?>>, !fir.array<70x!fir.char<4,?>>, !fir.ref<!fir.array<70x!fir.char<4,?>>>, i32 1045d6d9a8b8SValentin Clement! CHECK: return 1046d6d9a8b8SValentin Clement! CHECK: } 1047d6d9a8b8SValentin Clement 1048d6d9a8b8SValentin Clementsubroutine test19g(a,b,i) 1049d6d9a8b8SValentin Clement character(kind=4,len=i) a(70) 1050d6d9a8b8SValentin Clement character(kind=2,len=13) b(140) 1051d6d9a8b8SValentin Clement a = b(1:140:2) 1052d6d9a8b8SValentin Clementend subroutine test19g 1053d6d9a8b8SValentin Clement 1054d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19h( 1055d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_2:.*]]: !fir.ref<i32>{{.*}}, %[[VAL_3:.*]]: !fir.ref<i32>{{.*}}) { 1056d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 1057d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 1058d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i32 1059d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.cmpi sgt, %[[VAL_5]], %[[VAL_6]] : i32 1060d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.select %[[VAL_7]], %[[VAL_5]], %[[VAL_6]] : i32 1061d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_4]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<70x!fir.char<1,?>>> 1062d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.constant 70 : index 1063d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 1064d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_11]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1,?>>> 1065d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32> 1066d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i32) -> i64 10675bc9ee1bSJean Perier! CHECK: %[[VAL_15A:.*]] = fir.convert %[[VAL_14]] : (i64) -> index 10685bc9ee1bSJean Perier! CHECK: %[[C0:.*]] = arith.constant 0 : index 10695bc9ee1bSJean Perier! CHECK: %[[CMP:.*]] = arith.cmpi sgt, %[[VAL_15A]], %[[C0]] : index 10705bc9ee1bSJean Perier! CHECK: %[[VAL_15:.*]] = arith.select %[[CMP]], %[[VAL_15A]], %[[C0]] : index 1071d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.shape %[[VAL_10]] : (index) -> !fir.shape<1> 1072d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.array_load %[[VAL_9]](%[[VAL_16]]) typeparams %[[VAL_8]] : (!fir.ref<!fir.array<70x!fir.char<1,?>>>, !fir.shape<1>, i32) -> !fir.array<70x!fir.char<1,?>> 1073d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.constant 1 : i64 1074d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i64) -> index 1075d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.constant 2 : i64 1076d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> index 1077d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.constant 140 : i64 1078d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i64) -> index 1079d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.shape %[[VAL_15]] : (index) -> !fir.shape<1> 1080d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.slice %[[VAL_19]], %[[VAL_23]], %[[VAL_21]] : (index, index, index) -> !fir.slice<1> 1081d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.array_load %[[VAL_12]](%[[VAL_24]]) {{\[}}%[[VAL_25]]] typeparams %[[VAL_11]]#1 : (!fir.ref<!fir.array<?x!fir.char<1,?>>>, !fir.shape<1>, !fir.slice<1>, index) -> !fir.array<?x!fir.char<1,?>> 1082d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant 1 : index 1083d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.constant 0 : index 1084d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.subi %[[VAL_10]], %[[VAL_27]] : index 1085d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = fir.do_loop %[[VAL_31:.*]] = %[[VAL_28]] to %[[VAL_29]] step %[[VAL_27]] unordered iter_args(%[[VAL_32:.*]] = %[[VAL_17]]) -> (!fir.array<70x!fir.char<1,?>>) { 1086d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.array_access %[[VAL_26]], %[[VAL_31]] typeparams %[[VAL_11]]#1 : (!fir.array<?x!fir.char<1,?>>, index, index) -> !fir.ref<!fir.char<1,?>> 1087d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.array_access %[[VAL_32]], %[[VAL_31]] typeparams %[[VAL_8]] : (!fir.array<70x!fir.char<1,?>>, index, i32) -> !fir.ref<!fir.char<1,?>> 1088d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_8]] : (i32) -> index 1089d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = arith.cmpi slt, %[[VAL_35]], %[[VAL_11]]#1 : index 1090d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = arith.select %[[VAL_36]], %[[VAL_35]], %[[VAL_11]]#1 : index 1091d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = arith.constant 1 : i64 1092d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = fir.convert %[[VAL_37]] : (index) -> i64 1093d6d9a8b8SValentin Clement! CHECK: %[[VAL_40:.*]] = arith.muli %[[VAL_38]], %[[VAL_39]] : i64 1094d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = arith.constant false 1095d6d9a8b8SValentin Clement! CHECK: %[[VAL_42:.*]] = fir.convert %[[VAL_34]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 1096d6d9a8b8SValentin Clement! CHECK: %[[VAL_43:.*]] = fir.convert %[[VAL_33]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 1097f09b0c84SNikita Popov! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_42]], %[[VAL_43]], %[[VAL_40]], %[[VAL_41]]) : (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 1098d6d9a8b8SValentin Clement! CHECK: %[[VAL_44:.*]] = arith.constant 1 : i32 1099d6d9a8b8SValentin Clement! CHECK: %[[VAL_45:.*]] = arith.subi %[[VAL_8]], %[[VAL_44]] : i32 1100d6d9a8b8SValentin Clement! CHECK: %[[VAL_46:.*]] = arith.constant 32 : i8 1101d6d9a8b8SValentin Clement! CHECK: %[[VAL_47:.*]] = fir.undefined !fir.char<1> 1102d6d9a8b8SValentin Clement! CHECK: %[[VAL_48:.*]] = fir.insert_value %[[VAL_47]], %[[VAL_46]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 1103d6d9a8b8SValentin Clement! CHECK: %[[VAL_49:.*]] = arith.constant 1 : index 1104d6d9a8b8SValentin Clement! CHECK: %[[VAL_50:.*]] = fir.convert %[[VAL_45]] : (i32) -> index 1105d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_51:.*]] = %[[VAL_37]] to %[[VAL_50]] step %[[VAL_49]] { 1106d6d9a8b8SValentin Clement! CHECK: %[[VAL_52:.*]] = fir.convert %[[VAL_34]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 1107d6d9a8b8SValentin Clement! CHECK: %[[VAL_53:.*]] = fir.coordinate_of %[[VAL_52]], %[[VAL_51]] : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 1108d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_48]] to %[[VAL_53]] : !fir.ref<!fir.char<1>> 1109d6d9a8b8SValentin Clement! CHECK: } 1110d6d9a8b8SValentin Clement! CHECK: %[[VAL_54:.*]] = fir.array_amend %[[VAL_32]], %[[VAL_34]] : (!fir.array<70x!fir.char<1,?>>, !fir.ref<!fir.char<1,?>>) -> !fir.array<70x!fir.char<1,?>> 1111d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_54]] : !fir.array<70x!fir.char<1,?>> 1112d6d9a8b8SValentin Clement! CHECK: } 1113d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_17]], %[[VAL_55:.*]] to %[[VAL_9]] typeparams %[[VAL_8]] : !fir.array<70x!fir.char<1,?>>, !fir.array<70x!fir.char<1,?>>, !fir.ref<!fir.array<70x!fir.char<1,?>>>, i32 1114d6d9a8b8SValentin Clement! CHECK: return 1115d6d9a8b8SValentin Clement! CHECK: } 1116d6d9a8b8SValentin Clement 1117d6d9a8b8SValentin Clementsubroutine test19h(a,b,i,j) 1118d6d9a8b8SValentin Clement character(i) a(70) 1119d6d9a8b8SValentin Clement character(*) b(j) 1120d6d9a8b8SValentin Clement a = b(1:140:2) 1121d6d9a8b8SValentin Clementend subroutine test19h 1122d6d9a8b8SValentin Clement 1123d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest_elemental_character_intrinsic( 1124d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}) { 1125d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 1126d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,?>>> 1127d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index 1128d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 1129d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,?>>> 1130d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 2 : index 1131d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 10 : index 1132d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.constant -1 : i32 1133d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.address_of(@_QQcl.{{.*}}) : !fir.ref<!fir.char<1, 1134d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8> 1135d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant {{.*}} : i32 1136d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[VAL_9]], %[[VAL_11]], %[[VAL_12]]) : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8> 1137d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.constant 10 : index 1138d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 1139d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.shape_shift %[[VAL_7]], %[[VAL_8]] : (index, index) -> !fir.shapeshift<1> 1140d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.allocmem !fir.array<10xi32> 1141d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.shape %[[VAL_15]] : (index) -> !fir.shape<1> 1142d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.array_load %[[VAL_18]](%[[VAL_19]]) : (!fir.heap<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32> 1143d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.constant 1 : index 1144d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.constant 0 : index 1145d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.subi %[[VAL_15]], %[[VAL_21]] : index 1146d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.do_loop %[[VAL_25:.*]] = %[[VAL_22]] to %[[VAL_23]] step %[[VAL_21]] unordered iter_args(%[[VAL_26:.*]] = %[[VAL_20]]) -> (!fir.array<10xi32>) { 1147d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant 1 : index 1148d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.addi %[[VAL_25]], %[[VAL_27]] : index 1149d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = fir.array_coor %[[VAL_3]](%[[VAL_16]]) %[[VAL_28]] typeparams %[[VAL_2]]#1 : (!fir.ref<!fir.array<10x!fir.char<1,?>>>, !fir.shape<1>, index, index) -> !fir.ref<!fir.char<1,?>> 1150d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = arith.addi %[[VAL_25]], %[[VAL_7]] : index 1151d6d9a8b8SValentin Clement! CHECK: %[[VAL_31:.*]] = fir.array_coor %[[VAL_6]](%[[VAL_17]]) %[[VAL_30]] typeparams %[[VAL_5]]#1 : (!fir.ref<!fir.array<10x!fir.char<1,?>>>, !fir.shapeshift<1>, index, index) -> !fir.ref<!fir.char<1,?>> 1152d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.constant false 1153d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_29]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 1154d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.convert %[[VAL_2]]#1 : (index) -> i64 1155d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_31]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 1156d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_5]]#1 : (index) -> i64 1157d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = fir.call @_FortranAScan1(%[[VAL_33]], %[[VAL_34]], %[[VAL_35]], %[[VAL_36]], %[[VAL_32]]) : (!fir.ref<i8>, i64, !fir.ref<i8>, i64, i1) -> i64 1158d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = fir.convert %[[VAL_37]] : (i64) -> i32 1159d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = fir.array_update %[[VAL_26]], %[[VAL_38]], %[[VAL_25]] : (!fir.array<10xi32>, i32, index) -> !fir.array<10xi32> 1160d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_39]] : !fir.array<10xi32> 1161d6d9a8b8SValentin Clement! CHECK: } 1162d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_20]], %[[VAL_40:.*]] to %[[VAL_18]] : !fir.array<10xi32>, !fir.array<10xi32>, !fir.heap<!fir.array<10xi32>> 1163d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = fir.shape %[[VAL_15]] : (index) -> !fir.shape<1> 1164d6d9a8b8SValentin Clement! CHECK: %[[VAL_42:.*]] = fir.embox %[[VAL_18]](%[[VAL_41]]) : (!fir.heap<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<10xi32>> 1165d6d9a8b8SValentin Clement! CHECK: %[[VAL_43:.*]] = fir.convert %[[VAL_42]] : (!fir.box<!fir.array<10xi32>>) -> !fir.box<none> 1166d6d9a8b8SValentin Clement! CHECK: %[[VAL_44:.*]] = fir.call @_FortranAioOutputDescriptor(%[[VAL_13]], %[[VAL_43]]) : (!fir.ref<i8>, !fir.box<none>) -> i1 11673348c083SValentin Clement! CHECK: fir.freemem %[[VAL_18]] : !fir.heap<!fir.array<10xi32>> 1168d6d9a8b8SValentin Clement! CHECK: %[[VAL_45:.*]] = fir.call @_FortranAioEndIoStatement(%[[VAL_13]]) : (!fir.ref<i8>) -> i32 1169d6d9a8b8SValentin Clement! CHECK: return 1170d6d9a8b8SValentin Clement! CHECK: } 1171d6d9a8b8SValentin Clement 1172d6d9a8b8SValentin Clementsubroutine test_elemental_character_intrinsic(c1, c2) 1173d6d9a8b8SValentin Clement character(*) :: c1(10), c2(2:11) 1174d6d9a8b8SValentin Clement print *, scan(c1, c2) 1175d6d9a8b8SValentin Clementend subroutine 1176d6d9a8b8SValentin Clement 1177d6d9a8b8SValentin Clement! CHECK: func private @_QPbar( 1178