1f35f863aSjeanPerier! RUN: bbc -emit-fir -hlfir=false %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 534cc9437aSTom Eccles! 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 1524cc9437aSTom Eccles! 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 2794cc9437aSTom Eccles! 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 3654cc9437aSTom Eccles! 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>> 3714cc9437aSTom Eccles! 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 3774cc9437aSTom Eccles! 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> 4584cc9437aSTom Eccles ! 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 4744cc9437aSTom Eccles ! CHECK: %[[fres:.*]] = math.absf %[[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-DAG: %[[aarr:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 486d6d9a8b8SValentin Clement ! CHECK-DAG: %[[barr:.*]] = fir.array_load %[[b]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 487d6d9a8b8SValentin Clement interface 488d6d9a8b8SValentin Clement real elemental function f2(i) 489d6d9a8b8SValentin Clement real, VALUE :: i 490d6d9a8b8SValentin Clement end function f2 491d6d9a8b8SValentin Clement end interface 492d6d9a8b8SValentin Clement real :: a(100), b(100) 493d6d9a8b8SValentin Clement ! CHECK: %[[loop:.*]] = fir.do_loop %[[i:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[bth:.*]] = %[[barr]]) -> (!fir.array<100xf32>) { 494d6d9a8b8SValentin Clement ! CHECK: %[[val:.*]] = fir.array_fetch %[[aarr]], %[[i]] : (!fir.array<100xf32>, index) -> f32 4954cc9437aSTom Eccles ! CHECK: %[[fres:.*]] = fir.call @_QPf2(%[[val]]) {{.*}}: (f32) -> f32 496d6d9a8b8SValentin Clement ! CHECK: %[[res:.*]] = fir.array_update %[[bth]], %[[fres]], %[[i]] : (!fir.array<100xf32>, f32, index) -> !fir.array<100xf32> 497d6d9a8b8SValentin Clement ! CHECK: fir.result %[[res]] : !fir.array<100xf32> 498d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[barr]], %[[loop]] to %[[b]] 499d6d9a8b8SValentin Clement b = f2(a) 500d6d9a8b8SValentin Clementend subroutine test16 501d6d9a8b8SValentin Clement 502d6d9a8b8SValentin Clement! Test elemental impure call to function f3. 503d6d9a8b8SValentin Clement! 504d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest17( 505d6d9a8b8SValentin Clement! CHECK-SAME: %[[a:[^:]+]]: !fir.ref<!fir.array<100xf32>>{{.*}}, %[[b:[^:]+]]: !fir.ref<!fir.array<100xf32>>{{.*}}, %[[c:.*]]: !fir.ref<!fir.array<100xf32>>{{.*}}) 506d6d9a8b8SValentin Clementsubroutine test17(a,b,c) 507d6d9a8b8SValentin Clement ! CHECK-DAG: %[[aarr:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32> 508d6d9a8b8SValentin Clement ! CHECK-DAG: %[[barr:.*]] = fir.array_load %[[b]](%{{.*}}) : (!fir.ref<!fir.array<100xf32>>, !fir.shapeshift<1>) -> !fir.array<100xf32> 509d6d9a8b8SValentin Clement interface 510d6d9a8b8SValentin Clement real elemental impure function f3(i,j,k) 511d6d9a8b8SValentin Clement real, intent(inout) :: i, j, k 512d6d9a8b8SValentin Clement end function f3 513d6d9a8b8SValentin Clement end interface 514d6d9a8b8SValentin Clement real :: a(100), b(2:101), c(3:102) 515d6d9a8b8SValentin Clement ! CHECK: %[[loop:.*]] = fir.do_loop %[[i:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[bth:.*]] = %[[barr]]) -> (!fir.array<100xf32>) { 516d6d9a8b8SValentin Clement ! CHECK-DAG: %[[val:.*]] = fir.array_fetch %[[aarr]], %[[i]] : (!fir.array<100xf32>, index) -> f32 517d6d9a8b8SValentin Clement ! CHECK-DAG: %[[ic:.*]] = arith.addi %[[i]], %c3{{.*}} : index 518d6d9a8b8SValentin Clement ! CHECK-DAG: %[[ccoor:.*]] = fir.array_coor %[[c]](%{{.*}}) %[[ic]] : (!fir.ref<!fir.array<100xf32>>, !fir.shapeshift<1>, index) -> !fir.ref<f32> 519d6d9a8b8SValentin Clement ! CHECK-DAG: %[[ib:.*]] = arith.addi %[[i]], %c2{{.*}} : index 520d6d9a8b8SValentin Clement ! CHECK-DAG: %[[bcoor:.*]] = fir.array_coor %[[b]](%{{.*}}) %[[ib]] : (!fir.ref<!fir.array<100xf32>>, !fir.shapeshift<1>, index) -> !fir.ref<f32> 521d6d9a8b8SValentin Clement ! CHECK-DAG: %[[ia:.*]] = arith.addi %[[i]], %c1{{.*}} : index 522d6d9a8b8SValentin Clement ! CHECK-DAG: %[[acoor:.*]] = fir.array_coor %[[a]](%{{.*}}) %[[ia]] : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, index) -> !fir.ref<f32> 5234cc9437aSTom Eccles ! CHECK: %[[fres:.*]] = fir.call @_QPf3(%[[ccoor]], %[[bcoor]], %[[acoor]]) {{.*}}: (!fir.ref<f32>, !fir.ref<f32>, !fir.ref<f32>) -> f32 5244cc9437aSTom Eccles ! CHECK: %[[fadd:.*]] = arith.addf %[[val]], %[[fres]] {{.*}}: f32 525d6d9a8b8SValentin Clement ! CHECK: %[[res:.*]] = fir.array_update %[[bth]], %[[fadd]], %[[i]] : (!fir.array<100xf32>, f32, index) -> !fir.array<100xf32> 526d6d9a8b8SValentin Clement 527d6d9a8b8SValentin Clement ! See 10.1.4.p2 note 1. The expression below is illegal if `f3` defines the 528d6d9a8b8SValentin Clement ! argument `a` for this statement. Since, this cannot be proven statically by 529d6d9a8b8SValentin Clement ! the compiler, the constraint is left to the user. The compiler may give a 530d6d9a8b8SValentin Clement ! warning that `k` is neither VALUE nor INTENT(IN) and the actual argument, 531d6d9a8b8SValentin Clement ! `a`, appears elsewhere in the same statement. 532d6d9a8b8SValentin Clement b = a + f3(c, b, a) 533d6d9a8b8SValentin Clement 534d6d9a8b8SValentin Clement ! CHECK: fir.result %[[res]] : !fir.array<100xf32> 535d6d9a8b8SValentin Clement ! CHECK: fir.array_merge_store %[[barr]], %[[loop]] to %[[b]] 536d6d9a8b8SValentin Clementend subroutine test17 537d6d9a8b8SValentin Clement 538d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest18() { 539d6d9a8b8SValentin Clement! CHECK: %[[VAL_0:.*]] = arith.constant 10 : index 540d6d9a8b8SValentin Clement! CHECK: %[[VAL_1:.*]] = arith.constant 10 : index 541d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.array<10x10xi32> {bindc_name = "array", fir.target, uniq_name = "_QFtest18Earray"} 542d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFtest18Ei"} 543d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = fir.alloca !fir.box<!fir.ptr<!fir.array<?xi32>>> {bindc_name = "row_i", uniq_name = "_QFtest18Erow_i"} 544d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.zero_bits !fir.ptr<!fir.array<?xi32>> 545d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 0 : index 546d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1> 547d6d9a8b8SValentin 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>>> 548d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_8]] to %[[VAL_4]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> 549d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.constant 1 : index 550d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32> 551d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i32) -> i64 552d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.undefined index 553d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 1 : i64 554d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i64) -> index 555d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.addi %[[VAL_9]], %[[VAL_1]] : index 556d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.subi %[[VAL_15]], %[[VAL_9]] : index 557d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.shape %[[VAL_0]], %[[VAL_1]] : (index, index) -> !fir.shape<2> 558d6d9a8b8SValentin 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> 559d6d9a8b8SValentin 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>> 560d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.rebox %[[VAL_19]] : (!fir.box<!fir.array<?xi32>>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>> 561d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_20]] to %[[VAL_4]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> 562d6d9a8b8SValentin Clement! CHECK: return 563d6d9a8b8SValentin Clement! CHECK: } 564d6d9a8b8SValentin Clement 565d6d9a8b8SValentin Clementsubroutine test18 566d6d9a8b8SValentin Clement integer, target :: array(10,10) 567d6d9a8b8SValentin Clement integer, pointer :: row_i(:) 568d6d9a8b8SValentin Clement row_i => array(i, :) 569d6d9a8b8SValentin Clementend subroutine test18 570d6d9a8b8SValentin Clement 571d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest_column_and_row_order( 572d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<2x3xf32>>{{.*}}) { 573d6d9a8b8SValentin Clement! CHECK: %[[VAL_1:.*]] = arith.constant 2 : index 574d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]] = arith.constant 3 : index 575d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.shape %[[VAL_1]], %[[VAL_2]] : (index, index) -> !fir.shape<2> 576d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = fir.array_load %[[VAL_0]](%[[VAL_3]]) : (!fir.ref<!fir.array<2x3xf32>>, !fir.shape<2>) -> !fir.array<2x3xf32> 577b90ebbc5SPeter Klausler! CHECK: %[[VAL_6:.*]] = arith.constant 4.200000e+01 : f32 578d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 1 : index 579d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 0 : index 580d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.subi %[[VAL_1]], %[[VAL_7]] : index 581d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.subi %[[VAL_2]], %[[VAL_7]] : index 582d6d9a8b8SValentin 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>) { 583d6d9a8b8SValentin 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>) { 584d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.array_update %[[VAL_16]], %[[VAL_6]], %[[VAL_15]], %[[VAL_12]] : (!fir.array<2x3xf32>, f32, index, index) -> !fir.array<2x3xf32> 585d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_17]] : !fir.array<2x3xf32> 586d6d9a8b8SValentin Clement! CHECK: } 587d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_18:.*]] : !fir.array<2x3xf32> 588d6d9a8b8SValentin Clement! CHECK: } 589d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_4]], %[[VAL_19:.*]] to %[[VAL_0]] : !fir.array<2x3xf32>, !fir.array<2x3xf32>, !fir.ref<!fir.array<2x3xf32>> 590d6d9a8b8SValentin Clement! CHECK: return 591d6d9a8b8SValentin Clement! CHECK: } 592d6d9a8b8SValentin Clement 593d6d9a8b8SValentin Clementsubroutine test_column_and_row_order(x) 594d6d9a8b8SValentin Clement real :: x(2,3) 595d6d9a8b8SValentin Clement x = 42 596d6d9a8b8SValentin Clementend subroutine 597d6d9a8b8SValentin Clement 598d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest_assigning_to_assumed_shape_slices( 599d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>>{{.*}}) { 600d6d9a8b8SValentin Clement! CHECK: %[[VAL_1:.*]] = arith.constant 1 : index 601d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]] = arith.constant 2 : i64 602d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (i64) -> index 603d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 0 : index 604d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:3 = fir.box_dims %[[VAL_0]], %[[VAL_4]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index) 605d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.addi %[[VAL_1]], %[[VAL_5]]#1 : index 606d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.subi %[[VAL_6]], %[[VAL_1]] : index 607d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 0 : index 608d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.subi %[[VAL_7]], %[[VAL_1]] : index 609d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.addi %[[VAL_9]], %[[VAL_3]] : index 610d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.divsi %[[VAL_10]], %[[VAL_3]] : index 611d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.cmpi sgt, %[[VAL_11]], %[[VAL_8]] : index 612d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.select %[[VAL_12]], %[[VAL_11]], %[[VAL_8]] : index 613d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.slice %[[VAL_1]], %[[VAL_7]], %[[VAL_3]] : (index, index, index) -> !fir.slice<1> 614d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = fir.array_load %[[VAL_0]] {{\[}}%[[VAL_14]]] : (!fir.box<!fir.array<?xi32>>, !fir.slice<1>) -> !fir.array<?xi32> 615d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.constant 42 : i32 616d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = arith.constant 1 : index 617d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.constant 0 : index 618d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = arith.subi %[[VAL_13]], %[[VAL_17]] : index 619d6d9a8b8SValentin 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>) { 620d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = fir.array_update %[[VAL_22]], %[[VAL_16]], %[[VAL_21]] : (!fir.array<?xi32>, i32, index) -> !fir.array<?xi32> 621d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_23]] : !fir.array<?xi32> 622d6d9a8b8SValentin Clement! CHECK: } 623d6d9a8b8SValentin 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> 624d6d9a8b8SValentin Clement! CHECK: return 625d6d9a8b8SValentin Clement! CHECK: } 626d6d9a8b8SValentin Clement 627d6d9a8b8SValentin Clementsubroutine test_assigning_to_assumed_shape_slices(x) 628d6d9a8b8SValentin Clement integer :: x(:) 629d6d9a8b8SValentin Clement x(::2) = 42 630d6d9a8b8SValentin Clementend subroutine 631d6d9a8b8SValentin Clement 632d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19a( 633d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}) { 634d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 635d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,10>>> 636d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index 637d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 638d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,10>>> 639d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 10 : index 640d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 641d6d9a8b8SValentin 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>> 642d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1> 643d6d9a8b8SValentin 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>> 644d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant 1 : index 645d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 0 : index 646d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.subi %[[VAL_4]], %[[VAL_12]] : index 647d6d9a8b8SValentin 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>>) { 648d6d9a8b8SValentin 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>> 649d6d9a8b8SValentin 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>> 650d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.constant 10 : index 651d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.constant 1 : i64 652d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = fir.convert %[[VAL_20]] : (index) -> i64 653d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.muli %[[VAL_21]], %[[VAL_22]] : i64 654d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = arith.constant false 655d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<i8> 656d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_18]] : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<i8> 6574cc9437aSTom Eccles! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_25]], %[[VAL_26]], %[[VAL_23]], %[[VAL_24]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 658d6d9a8b8SValentin 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>> 659d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_27]] : !fir.array<10x!fir.char<1,10>> 660d6d9a8b8SValentin Clement! CHECK: } 661d6d9a8b8SValentin 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>>> 662d6d9a8b8SValentin Clement! CHECK: return 663d6d9a8b8SValentin Clement! CHECK: } 664d6d9a8b8SValentin Clement 665d6d9a8b8SValentin Clementsubroutine test19a(a,b) 666d6d9a8b8SValentin Clement character(LEN=10) a(10) 667d6d9a8b8SValentin Clement character(LEN=10) b(10) 668d6d9a8b8SValentin Clement a = b 669d6d9a8b8SValentin Clementend subroutine test19a 670d6d9a8b8SValentin Clement 671d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19b( 672d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<2>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<2>{{.*}}) { 673d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<2>) -> (!fir.ref<!fir.char<2,?>>, index) 674d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<2,?>>) -> !fir.ref<!fir.array<20x!fir.char<2,8>>> 675d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 20 : index 676d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<2>) -> (!fir.ref<!fir.char<2,?>>, index) 677d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.char<2,?>>) -> !fir.ref<!fir.array<20x!fir.char<2,10>>> 678c0cb8f73SjeanPerier! CHECK: %[[VAL_6:.*]] = arith.constant 10 : index 679d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 20 : index 680d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 681d6d9a8b8SValentin 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>> 682d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.shape %[[VAL_8]] : (index) -> !fir.shape<1> 683d6d9a8b8SValentin 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>> 684d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 1 : index 685d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.constant 0 : index 686d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.subi %[[VAL_4]], %[[VAL_13]] : index 687d6d9a8b8SValentin 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>>) { 688d6d9a8b8SValentin 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>> 689d6d9a8b8SValentin 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>> 690d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.constant 8 : index 691d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.cmpi slt, %[[VAL_21]], %[[VAL_6]] : index 692d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.select %[[VAL_22]], %[[VAL_21]], %[[VAL_6]] : index 693d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = arith.constant 2 : i64 694d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_23]] : (index) -> i64 695d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = arith.muli %[[VAL_24]], %[[VAL_25]] : i64 696d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant false 697d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_20]] : (!fir.ref<!fir.char<2,8>>) -> !fir.ref<i8> 698d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<!fir.char<2,10>>) -> !fir.ref<i8> 6994cc9437aSTom Eccles! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_28]], %[[VAL_29]], %[[VAL_26]], %[[VAL_27]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 700d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = arith.constant 1 : index 701d6d9a8b8SValentin Clement! CHECK: %[[VAL_31:.*]] = arith.subi %[[VAL_21]], %[[VAL_30]] : index 702d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.constant 32 : i16 703d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.undefined !fir.char<2> 704d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.insert_value %[[VAL_33]], %[[VAL_32]], [0 : index] : (!fir.char<2>, i16) -> !fir.char<2> 705d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = arith.constant 1 : index 706d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_36:.*]] = %[[VAL_23]] to %[[VAL_31]] step %[[VAL_35]] { 707d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = fir.convert %[[VAL_20]] : (!fir.ref<!fir.char<2,8>>) -> !fir.ref<!fir.array<8x!fir.char<2>>> 708d6d9a8b8SValentin 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>> 709d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_34]] to %[[VAL_38]] : !fir.ref<!fir.char<2>> 710d6d9a8b8SValentin Clement! CHECK: } 711d6d9a8b8SValentin 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>> 712d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_39]] : !fir.array<20x!fir.char<2,8>> 713d6d9a8b8SValentin Clement! CHECK: } 714d6d9a8b8SValentin 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>>> 715d6d9a8b8SValentin Clement! CHECK: return 716d6d9a8b8SValentin Clement! CHECK: } 717d6d9a8b8SValentin Clement 718d6d9a8b8SValentin Clementsubroutine test19b(a,b) 719d6d9a8b8SValentin Clement character(KIND=2, LEN=8) a(20) 720d6d9a8b8SValentin Clement character(KIND=2, LEN=10) b(20) 721d6d9a8b8SValentin Clement a = b 722d6d9a8b8SValentin Clementend subroutine test19b 723d6d9a8b8SValentin Clement 724d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19c( 725d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<4>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<4>{{.*}}, %[[VAL_2:.*]]: !fir.ref<i32>{{.*}}) { 726d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<4>) -> (!fir.ref<!fir.char<4,?>>, index) 727d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<30x!fir.char<4,10>>> 728c0cb8f73SjeanPerier! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index 729d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 30 : index 730d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<4>) -> (!fir.ref<!fir.char<4,?>>, index) 731c0cb8f73SjeanPerier! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<30x!fir.char<4,?>>> 732d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 733d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.constant 0 : i32 734d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.cmpi sgt, %[[VAL_8]], %[[VAL_9]] : i32 735d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.select %[[VAL_10]], %[[VAL_8]], %[[VAL_9]] : i32 736d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 30 : index 737d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.shape %[[VAL_13]] : (index) -> !fir.shape<1> 738d6d9a8b8SValentin 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,?>> 739d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1> 740d6d9a8b8SValentin 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>> 741d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.constant 1 : index 742d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = arith.constant 0 : index 743d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.subi %[[VAL_13]], %[[VAL_18]] : index 744d6d9a8b8SValentin 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,?>>) { 745d6d9a8b8SValentin 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>> 746d6d9a8b8SValentin 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,?>> 747d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_11]] : (i32) -> index 748d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.cmpi slt, %[[VAL_26]], %[[VAL_4]] : index 749d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.select %[[VAL_27]], %[[VAL_26]], %[[VAL_4]] : index 750d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.constant 4 : i64 751d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_28]] : (index) -> i64 752d6d9a8b8SValentin Clement! CHECK: %[[VAL_31:.*]] = arith.muli %[[VAL_29]], %[[VAL_30]] : i64 753d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.constant false 754d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_25]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<i8> 755d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.convert %[[VAL_24]] : (!fir.ref<!fir.char<4,10>>) -> !fir.ref<i8> 7564cc9437aSTom Eccles! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_33]], %[[VAL_34]], %[[VAL_31]], %[[VAL_32]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 757d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = arith.constant 1 : i32 758d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = arith.subi %[[VAL_11]], %[[VAL_35]] : i32 759d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = arith.constant 32 : i32 760d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = fir.undefined !fir.char<4> 761d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = fir.insert_value %[[VAL_38]], %[[VAL_37]], [0 : index] : (!fir.char<4>, i32) -> !fir.char<4> 762d6d9a8b8SValentin Clement! CHECK: %[[VAL_40:.*]] = arith.constant 1 : index 763d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = fir.convert %[[VAL_36]] : (i32) -> index 764d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_42:.*]] = %[[VAL_28]] to %[[VAL_41]] step %[[VAL_40]] { 765d6d9a8b8SValentin Clement! CHECK: %[[VAL_43:.*]] = fir.convert %[[VAL_25]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<?x!fir.char<4>>> 766d6d9a8b8SValentin 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>> 767d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_39]] to %[[VAL_44]] : !fir.ref<!fir.char<4>> 768d6d9a8b8SValentin Clement! CHECK: } 769d6d9a8b8SValentin 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,?>> 770d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_45]] : !fir.array<30x!fir.char<4,?>> 771d6d9a8b8SValentin Clement! CHECK: } 772d6d9a8b8SValentin 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 773d6d9a8b8SValentin Clement! CHECK: return 774d6d9a8b8SValentin Clement! CHECK: } 775d6d9a8b8SValentin Clement 776d6d9a8b8SValentin Clementsubroutine test19c(a,b,i) 777d6d9a8b8SValentin Clement character(KIND=4, LEN=i) a(30) 778d6d9a8b8SValentin Clement character(KIND=4, LEN=10) b(30) 779d6d9a8b8SValentin Clement a = b 780d6d9a8b8SValentin Clementend subroutine test19c 781d6d9a8b8SValentin Clement 782d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19d( 783d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_2:.*]]: !fir.ref<i32>{{.*}}, %[[VAL_3:.*]]: !fir.ref<i32>{{.*}}) { 784d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 785c0cb8f73SjeanPerier! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_4]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<40x!fir.char<1,?>>> 786d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 787d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i32 788d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.cmpi sgt, %[[VAL_5]], %[[VAL_6]] : i32 789d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.select %[[VAL_7]], %[[VAL_5]], %[[VAL_6]] : i32 790d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.constant 40 : index 791d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 792c0cb8f73SjeanPerier! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_11]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<40x!fir.char<1,?>>> 793d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32> 794d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 0 : i32 795d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.cmpi sgt, %[[VAL_12]], %[[VAL_13]] : i32 796d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.select %[[VAL_14]], %[[VAL_12]], %[[VAL_13]] : i32 797d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = arith.constant 40 : index 798d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.shape %[[VAL_10]] : (index) -> !fir.shape<1> 799d6d9a8b8SValentin 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,?>> 800d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.shape %[[VAL_17]] : (index) -> !fir.shape<1> 801d6d9a8b8SValentin 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,?>> 802d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.constant 1 : index 803d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.constant 0 : index 804d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = arith.subi %[[VAL_10]], %[[VAL_22]] : index 805d6d9a8b8SValentin 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,?>>) { 806d6d9a8b8SValentin 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,?>> 807d6d9a8b8SValentin 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,?>> 808d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_8]] : (i32) -> index 809d6d9a8b8SValentin Clement! CHECK: %[[VAL_31:.*]] = fir.convert %[[VAL_15]] : (i32) -> index 810d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.cmpi slt, %[[VAL_30]], %[[VAL_31]] : index 811d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = arith.select %[[VAL_32]], %[[VAL_30]], %[[VAL_31]] : index 812d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = arith.constant 1 : i64 813d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_33]] : (index) -> i64 814d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = arith.muli %[[VAL_34]], %[[VAL_35]] : i64 815d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = arith.constant false 816d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = fir.convert %[[VAL_29]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 817d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = fir.convert %[[VAL_28]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 8184cc9437aSTom Eccles! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_38]], %[[VAL_39]], %[[VAL_36]], %[[VAL_37]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 819d6d9a8b8SValentin Clement! CHECK: %[[VAL_40:.*]] = arith.constant 1 : i32 820d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = arith.subi %[[VAL_8]], %[[VAL_40]] : i32 821d6d9a8b8SValentin Clement! CHECK: %[[VAL_42:.*]] = arith.constant 32 : i8 822d6d9a8b8SValentin Clement! CHECK: %[[VAL_43:.*]] = fir.undefined !fir.char<1> 823d6d9a8b8SValentin Clement! CHECK: %[[VAL_44:.*]] = fir.insert_value %[[VAL_43]], %[[VAL_42]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 824d6d9a8b8SValentin Clement! CHECK: %[[VAL_45:.*]] = arith.constant 1 : index 825d6d9a8b8SValentin Clement! CHECK: %[[VAL_46:.*]] = fir.convert %[[VAL_41]] : (i32) -> index 826d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_47:.*]] = %[[VAL_33]] to %[[VAL_46]] step %[[VAL_45]] { 827d6d9a8b8SValentin Clement! CHECK: %[[VAL_48:.*]] = fir.convert %[[VAL_29]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 828d6d9a8b8SValentin 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>> 829d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_44]] to %[[VAL_49]] : !fir.ref<!fir.char<1>> 830d6d9a8b8SValentin Clement! CHECK: } 831d6d9a8b8SValentin 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,?>> 832d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_50]] : !fir.array<40x!fir.char<1,?>> 833d6d9a8b8SValentin Clement! CHECK: } 834d6d9a8b8SValentin 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 835d6d9a8b8SValentin Clement! CHECK: return 836d6d9a8b8SValentin Clement! CHECK: } 837d6d9a8b8SValentin Clement 838d6d9a8b8SValentin Clementsubroutine test19d(a,b,i,j) 839d6d9a8b8SValentin Clement character(i) a(40) 840d6d9a8b8SValentin Clement character(j) b(40) 841d6d9a8b8SValentin Clement a = b 842d6d9a8b8SValentin Clementend subroutine test19d 843d6d9a8b8SValentin Clement 844d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19e( 845d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}) { 846d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 847d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<50x!fir.char<1,?>>> 848d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 50 : index 849d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 850d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<50x!fir.char<1,?>>> 851d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 50 : index 852d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 853d6d9a8b8SValentin 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,?>> 854d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1> 855d6d9a8b8SValentin 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,?>> 856d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant 1 : index 857d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 0 : index 858d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.subi %[[VAL_4]], %[[VAL_12]] : index 859d6d9a8b8SValentin 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,?>>) { 860d6d9a8b8SValentin 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,?>> 861d6d9a8b8SValentin 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,?>> 862d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.cmpi slt, %[[VAL_2]]#1, %[[VAL_5]]#1 : index 863d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.select %[[VAL_20]], %[[VAL_2]]#1, %[[VAL_5]]#1 : index 864d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.constant 1 : i64 865d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_21]] : (index) -> i64 866d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = arith.muli %[[VAL_22]], %[[VAL_23]] : i64 867d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = arith.constant false 868d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 869d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_18]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 8704cc9437aSTom Eccles! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_26]], %[[VAL_27]], %[[VAL_24]], %[[VAL_25]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 871d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.constant 1 : index 872d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.subi %[[VAL_2]]#1, %[[VAL_28]] : index 873d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = arith.constant 32 : i8 874d6d9a8b8SValentin Clement! CHECK: %[[VAL_31:.*]] = fir.undefined !fir.char<1> 875d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = fir.insert_value %[[VAL_31]], %[[VAL_30]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 876d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = arith.constant 1 : index 877d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_34:.*]] = %[[VAL_21]] to %[[VAL_29]] step %[[VAL_33]] { 878d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 879d6d9a8b8SValentin 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>> 880d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_32]] to %[[VAL_36]] : !fir.ref<!fir.char<1>> 881d6d9a8b8SValentin Clement! CHECK: } 882d6d9a8b8SValentin 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,?>> 883d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_37]] : !fir.array<50x!fir.char<1,?>> 884d6d9a8b8SValentin Clement! CHECK: } 885d6d9a8b8SValentin 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 886d6d9a8b8SValentin Clement! CHECK: return 887d6d9a8b8SValentin Clement! CHECK: } 888d6d9a8b8SValentin Clement 889d6d9a8b8SValentin Clementsubroutine test19e(a,b) 890d6d9a8b8SValentin Clement character(*) a(50) 891d6d9a8b8SValentin Clement character(*) b(50) 892d6d9a8b8SValentin Clement a = b 893d6d9a8b8SValentin Clementend subroutine test19e 894d6d9a8b8SValentin Clement 895d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19f( 896d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}) { 897d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 898d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<60x!fir.char<1,?>>> 899d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 60 : index 900d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 901d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<60x!fir.char<1,?>>> 902d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 60 : index 903d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 904d6d9a8b8SValentin 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,?>> 905fd389f46SFabian Mora! CHECK: %[[VAL_10:.*]] = fir.address_of(@_QQclX70726566697820) : !fir.ref<!fir.char<1,7>> 906d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.constant 7 : index 907d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1> 908d6d9a8b8SValentin 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,?>> 909d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.constant 1 : index 910d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.constant 0 : index 911d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.subi %[[VAL_4]], %[[VAL_14]] : index 912d6d9a8b8SValentin 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,?>>) { 913d6d9a8b8SValentin 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,?>> 914d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.addi %[[VAL_11]], %[[VAL_5]]#1 : index 915d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_21]] : index) {bindc_name = ".chrtmp"} 916d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.constant 1 : i64 917d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.convert %[[VAL_11]] : (index) -> i64 918d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = arith.muli %[[VAL_23]], %[[VAL_24]] : i64 919d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = arith.constant false 920d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_22]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 921d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_10]] : (!fir.ref<!fir.char<1,7>>) -> !fir.ref<i8> 9224cc9437aSTom Eccles! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_27]], %[[VAL_28]], %[[VAL_25]], %[[VAL_26]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 923d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.constant 1 : index 924d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = arith.subi %[[VAL_21]], %[[VAL_29]] : index 925d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_31:.*]] = %[[VAL_11]] to %[[VAL_30]] step %[[VAL_29]] { 926d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.subi %[[VAL_31]], %[[VAL_11]] : index 927d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_20]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 928d6d9a8b8SValentin 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>> 929d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = fir.load %[[VAL_34]] : !fir.ref<!fir.char<1>> 930d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_22]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 931d6d9a8b8SValentin 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>> 932d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_35]] to %[[VAL_37]] : !fir.ref<!fir.char<1>> 933d6d9a8b8SValentin Clement! CHECK: } 934d6d9a8b8SValentin 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,?>> 935d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = arith.cmpi slt, %[[VAL_2]]#1, %[[VAL_21]] : index 936d6d9a8b8SValentin Clement! CHECK: %[[VAL_40:.*]] = arith.select %[[VAL_39]], %[[VAL_2]]#1, %[[VAL_21]] : index 937d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = arith.constant 1 : i64 938d6d9a8b8SValentin Clement! CHECK: %[[VAL_42:.*]] = fir.convert %[[VAL_40]] : (index) -> i64 939d6d9a8b8SValentin Clement! CHECK: %[[VAL_43:.*]] = arith.muli %[[VAL_41]], %[[VAL_42]] : i64 940d6d9a8b8SValentin Clement! CHECK: %[[VAL_44:.*]] = arith.constant false 941d6d9a8b8SValentin Clement! CHECK: %[[VAL_45:.*]] = fir.convert %[[VAL_38]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 942d6d9a8b8SValentin Clement! CHECK: %[[VAL_46:.*]] = fir.convert %[[VAL_22]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 9434cc9437aSTom Eccles! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_45]], %[[VAL_46]], %[[VAL_43]], %[[VAL_44]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 944d6d9a8b8SValentin Clement! CHECK: %[[VAL_47:.*]] = arith.constant 1 : index 945d6d9a8b8SValentin Clement! CHECK: %[[VAL_48:.*]] = arith.subi %[[VAL_2]]#1, %[[VAL_47]] : index 946d6d9a8b8SValentin Clement! CHECK: %[[VAL_49:.*]] = arith.constant 32 : i8 947d6d9a8b8SValentin Clement! CHECK: %[[VAL_50:.*]] = fir.undefined !fir.char<1> 948d6d9a8b8SValentin Clement! CHECK: %[[VAL_51:.*]] = fir.insert_value %[[VAL_50]], %[[VAL_49]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 949d6d9a8b8SValentin Clement! CHECK: %[[VAL_52:.*]] = arith.constant 1 : index 950d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_53:.*]] = %[[VAL_40]] to %[[VAL_48]] step %[[VAL_52]] { 951d6d9a8b8SValentin Clement! CHECK: %[[VAL_54:.*]] = fir.convert %[[VAL_38]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 952d6d9a8b8SValentin 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>> 953d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_51]] to %[[VAL_55]] : !fir.ref<!fir.char<1>> 954d6d9a8b8SValentin Clement! CHECK: } 955d6d9a8b8SValentin 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,?>> 956d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_56]] : !fir.array<60x!fir.char<1,?>> 957d6d9a8b8SValentin Clement! CHECK: } 958d6d9a8b8SValentin 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 959d6d9a8b8SValentin Clement! CHECK: return 960d6d9a8b8SValentin Clement! CHECK: } 961d6d9a8b8SValentin Clement 962d6d9a8b8SValentin Clementsubroutine test19f(a,b) 963d6d9a8b8SValentin Clement character(*) a(60) 964d6d9a8b8SValentin Clement character(*) b(60) 965d6d9a8b8SValentin Clement a = "prefix " // b 966d6d9a8b8SValentin Clementend subroutine test19f 967d6d9a8b8SValentin Clement 968d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19g( 969d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<4>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<2>{{.*}}, %[[VAL_2:.*]]: !fir.ref<i32>{{.*}}) { 970d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<2>) -> (!fir.ref<!fir.char<2,?>>, index) 971d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.ref<!fir.char<2,?>>) -> !fir.ref<!fir.array<140x!fir.char<2,13>>> 972c0cb8f73SjeanPerier! CHECK: %[[VAL_4:.*]] = arith.constant 13 : index 973d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 140 : index 974d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<4>) -> (!fir.ref<!fir.char<4,?>>, index) 975c0cb8f73SjeanPerier! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<70x!fir.char<4,?>>> 976d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 977d6d9a8b8SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.constant 0 : i32 978d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.cmpi sgt, %[[VAL_8]], %[[VAL_9]] : i32 979d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.select %[[VAL_10]], %[[VAL_8]], %[[VAL_9]] : i32 980d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.constant 70 : index 981d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.shape %[[VAL_13]] : (index) -> !fir.shape<1> 982d6d9a8b8SValentin 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,?>> 983d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.constant 1 : i64 984d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index 985d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.constant 2 : i64 986d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i64) -> index 987d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.constant 140 : i64 988d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> index 989d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1> 990d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = fir.slice %[[VAL_17]], %[[VAL_21]], %[[VAL_19]] : (index, index, index) -> !fir.slice<1> 991d6d9a8b8SValentin 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>> 992d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 993d6d9a8b8SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i32) -> i64 994*1710c8cfSSlava Zakharin! CHECK: %[[char_temp:.*]] = fir.alloca !fir.char<4,?>(%{{[0-9]+}} : i64) {bindc_name = ".chrtmp"} 995d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant 1 : index 996d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.constant 0 : index 997d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.subi %[[VAL_13]], %[[VAL_27]] : index 998d6d9a8b8SValentin 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,?>>) { 999d6d9a8b8SValentin 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>> 1000d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.alloca !fir.char<4,?>(%[[VAL_4]] : index) 1001d6d9a8b8SValentin 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,?>> 1002d6d9a8b8SValentin Clement! CHECK: %[[VAL_47:.*]] = fir.convert %[[VAL_11]] : (i32) -> index 1003d6d9a8b8SValentin Clement! CHECK: %[[VAL_48:.*]] = fir.convert %[[VAL_26]] : (i64) -> index 1004d6d9a8b8SValentin Clement! CHECK: %[[VAL_49:.*]] = arith.cmpi slt, %[[VAL_47]], %[[VAL_48]] : index 1005d6d9a8b8SValentin Clement! CHECK: %[[VAL_50:.*]] = arith.select %[[VAL_49]], %[[VAL_47]], %[[VAL_48]] : index 1006d6d9a8b8SValentin Clement! CHECK: %[[VAL_51:.*]] = arith.constant 4 : i64 1007d6d9a8b8SValentin Clement! CHECK: %[[VAL_52:.*]] = fir.convert %[[VAL_50]] : (index) -> i64 1008d6d9a8b8SValentin Clement! CHECK: %[[VAL_53:.*]] = arith.muli %[[VAL_51]], %[[VAL_52]] : i64 1009d6d9a8b8SValentin Clement! CHECK: %[[VAL_54:.*]] = arith.constant false 1010d6d9a8b8SValentin Clement! CHECK: %[[VAL_55:.*]] = fir.convert %[[VAL_46]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<i8> 101121ea40d4SValentin Clement! CHECK: %[[VAL_56:.*]] = fir.convert %[[char_temp]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<i8> 10124cc9437aSTom Eccles! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_55]], %[[VAL_56]], %[[VAL_53]], %[[VAL_54]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 1013d6d9a8b8SValentin Clement! CHECK: %[[VAL_57:.*]] = arith.constant 1 : i32 1014d6d9a8b8SValentin Clement! CHECK: %[[VAL_58:.*]] = arith.subi %[[VAL_11]], %[[VAL_57]] : i32 1015d6d9a8b8SValentin Clement! CHECK: %[[VAL_59:.*]] = arith.constant 32 : i32 1016d6d9a8b8SValentin Clement! CHECK: %[[VAL_60:.*]] = fir.undefined !fir.char<4> 1017d6d9a8b8SValentin Clement! CHECK: %[[VAL_61:.*]] = fir.insert_value %[[VAL_60]], %[[VAL_59]], [0 : index] : (!fir.char<4>, i32) -> !fir.char<4> 1018d6d9a8b8SValentin Clement! CHECK: %[[VAL_62:.*]] = arith.constant 1 : index 1019d6d9a8b8SValentin Clement! CHECK: %[[VAL_63:.*]] = fir.convert %[[VAL_58]] : (i32) -> index 1020d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_64:.*]] = %[[VAL_50]] to %[[VAL_63]] step %[[VAL_62]] { 1021d6d9a8b8SValentin Clement! CHECK: %[[VAL_65:.*]] = fir.convert %[[VAL_46]] : (!fir.ref<!fir.char<4,?>>) -> !fir.ref<!fir.array<?x!fir.char<4>>> 1022d6d9a8b8SValentin 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>> 1023d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_61]] to %[[VAL_66]] : !fir.ref<!fir.char<4>> 1024d6d9a8b8SValentin Clement! CHECK: } 1025d6d9a8b8SValentin 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,?>> 1026d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_67]] : !fir.array<70x!fir.char<4,?>> 1027d6d9a8b8SValentin Clement! CHECK: } 1028d6d9a8b8SValentin 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 1029d6d9a8b8SValentin Clement! CHECK: return 1030d6d9a8b8SValentin Clement! CHECK: } 1031d6d9a8b8SValentin Clement 1032d6d9a8b8SValentin Clementsubroutine test19g(a,b,i) 1033d6d9a8b8SValentin Clement character(kind=4,len=i) a(70) 1034d6d9a8b8SValentin Clement character(kind=2,len=13) b(140) 1035d6d9a8b8SValentin Clement a = b(1:140:2) 1036d6d9a8b8SValentin Clementend subroutine test19g 1037d6d9a8b8SValentin Clement 1038d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest19h( 1039d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_2:.*]]: !fir.ref<i32>{{.*}}, %[[VAL_3:.*]]: !fir.ref<i32>{{.*}}) { 1040d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 1041c0cb8f73SjeanPerier! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_4]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<70x!fir.char<1,?>>> 1042d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> 1043d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i32 1044d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.cmpi sgt, %[[VAL_5]], %[[VAL_6]] : i32 1045d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.select %[[VAL_7]], %[[VAL_5]], %[[VAL_6]] : i32 1046d6d9a8b8SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.constant 70 : index 1047d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 1048d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_11]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1,?>>> 1049d6d9a8b8SValentin Clement! CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32> 1050d6d9a8b8SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i32) -> i64 10515bc9ee1bSJean Perier! CHECK: %[[VAL_15A:.*]] = fir.convert %[[VAL_14]] : (i64) -> index 10525bc9ee1bSJean Perier! CHECK: %[[C0:.*]] = arith.constant 0 : index 10535bc9ee1bSJean Perier! CHECK: %[[CMP:.*]] = arith.cmpi sgt, %[[VAL_15A]], %[[C0]] : index 10545bc9ee1bSJean Perier! CHECK: %[[VAL_15:.*]] = arith.select %[[CMP]], %[[VAL_15A]], %[[C0]] : index 1055d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.shape %[[VAL_10]] : (index) -> !fir.shape<1> 1056d6d9a8b8SValentin 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,?>> 1057d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.constant 1 : i64 1058d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i64) -> index 1059d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = arith.constant 2 : i64 1060d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> index 1061d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.constant 140 : i64 1062d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i64) -> index 1063d6d9a8b8SValentin Clement! CHECK: %[[VAL_24:.*]] = fir.shape %[[VAL_15]] : (index) -> !fir.shape<1> 1064d6d9a8b8SValentin Clement! CHECK: %[[VAL_25:.*]] = fir.slice %[[VAL_19]], %[[VAL_23]], %[[VAL_21]] : (index, index, index) -> !fir.slice<1> 1065d6d9a8b8SValentin 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,?>> 1066d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant 1 : index 1067d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.constant 0 : index 1068d6d9a8b8SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.subi %[[VAL_10]], %[[VAL_27]] : index 1069d6d9a8b8SValentin 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,?>>) { 1070d6d9a8b8SValentin 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,?>> 1071d6d9a8b8SValentin 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,?>> 1072d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_8]] : (i32) -> index 1073d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = arith.cmpi slt, %[[VAL_35]], %[[VAL_11]]#1 : index 1074d6d9a8b8SValentin Clement! CHECK: %[[VAL_37:.*]] = arith.select %[[VAL_36]], %[[VAL_35]], %[[VAL_11]]#1 : index 1075d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = arith.constant 1 : i64 1076d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = fir.convert %[[VAL_37]] : (index) -> i64 1077d6d9a8b8SValentin Clement! CHECK: %[[VAL_40:.*]] = arith.muli %[[VAL_38]], %[[VAL_39]] : i64 1078d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = arith.constant false 1079d6d9a8b8SValentin Clement! CHECK: %[[VAL_42:.*]] = fir.convert %[[VAL_34]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 1080d6d9a8b8SValentin Clement! CHECK: %[[VAL_43:.*]] = fir.convert %[[VAL_33]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 10814cc9437aSTom Eccles! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_42]], %[[VAL_43]], %[[VAL_40]], %[[VAL_41]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 1082d6d9a8b8SValentin Clement! CHECK: %[[VAL_44:.*]] = arith.constant 1 : i32 1083d6d9a8b8SValentin Clement! CHECK: %[[VAL_45:.*]] = arith.subi %[[VAL_8]], %[[VAL_44]] : i32 1084d6d9a8b8SValentin Clement! CHECK: %[[VAL_46:.*]] = arith.constant 32 : i8 1085d6d9a8b8SValentin Clement! CHECK: %[[VAL_47:.*]] = fir.undefined !fir.char<1> 1086d6d9a8b8SValentin Clement! CHECK: %[[VAL_48:.*]] = fir.insert_value %[[VAL_47]], %[[VAL_46]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 1087d6d9a8b8SValentin Clement! CHECK: %[[VAL_49:.*]] = arith.constant 1 : index 1088d6d9a8b8SValentin Clement! CHECK: %[[VAL_50:.*]] = fir.convert %[[VAL_45]] : (i32) -> index 1089d6d9a8b8SValentin Clement! CHECK: fir.do_loop %[[VAL_51:.*]] = %[[VAL_37]] to %[[VAL_50]] step %[[VAL_49]] { 1090d6d9a8b8SValentin Clement! CHECK: %[[VAL_52:.*]] = fir.convert %[[VAL_34]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 1091d6d9a8b8SValentin 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>> 1092d6d9a8b8SValentin Clement! CHECK: fir.store %[[VAL_48]] to %[[VAL_53]] : !fir.ref<!fir.char<1>> 1093d6d9a8b8SValentin Clement! CHECK: } 1094d6d9a8b8SValentin 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,?>> 1095d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_54]] : !fir.array<70x!fir.char<1,?>> 1096d6d9a8b8SValentin Clement! CHECK: } 1097d6d9a8b8SValentin 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 1098d6d9a8b8SValentin Clement! CHECK: return 1099d6d9a8b8SValentin Clement! CHECK: } 1100d6d9a8b8SValentin Clement 1101d6d9a8b8SValentin Clementsubroutine test19h(a,b,i,j) 1102d6d9a8b8SValentin Clement character(i) a(70) 1103d6d9a8b8SValentin Clement character(*) b(j) 1104d6d9a8b8SValentin Clement a = b(1:140:2) 1105d6d9a8b8SValentin Clementend subroutine test19h 1106d6d9a8b8SValentin Clement 1107d6d9a8b8SValentin Clement! CHECK-LABEL: func @_QPtest_elemental_character_intrinsic( 1108d6d9a8b8SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>{{.*}}, %[[VAL_1:.*]]: !fir.boxchar<1>{{.*}}) { 1109d6d9a8b8SValentin Clement! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 1110d6d9a8b8SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,?>>> 1111d6d9a8b8SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index 1112d6d9a8b8SValentin Clement! CHECK: %[[VAL_5:.*]]:2 = fir.unboxchar %[[VAL_1]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 1113d6d9a8b8SValentin Clement! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,?>>> 1114d6d9a8b8SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 2 : index 1115d6d9a8b8SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 10 : index 11168f3357b7SPeter Klausler! CHECK: %[[VAL_9:.*]] = arith.constant 6 : i32 1117fd389f46SFabian Mora! CHECK: %[[VAL_10:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1, 1118d6d9a8b8SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8> 1119d6d9a8b8SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant {{.*}} : i32 11204cc9437aSTom Eccles! CHECK: %[[VAL_13:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[VAL_9]], %[[VAL_11]], %[[VAL_12]]) {{.*}}: (i32, !fir.ref<i8>, i32) -> !fir.ref<i8> 1121d6d9a8b8SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.constant 10 : index 1122d6d9a8b8SValentin Clement! CHECK: %[[VAL_16:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 1123d6d9a8b8SValentin Clement! CHECK: %[[VAL_17:.*]] = fir.shape_shift %[[VAL_7]], %[[VAL_8]] : (index, index) -> !fir.shapeshift<1> 1124d6d9a8b8SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.allocmem !fir.array<10xi32> 1125d6d9a8b8SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.shape %[[VAL_15]] : (index) -> !fir.shape<1> 1126d6d9a8b8SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.array_load %[[VAL_18]](%[[VAL_19]]) : (!fir.heap<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32> 1127d6d9a8b8SValentin Clement! CHECK: %[[VAL_21:.*]] = arith.constant 1 : index 1128d6d9a8b8SValentin Clement! CHECK: %[[VAL_22:.*]] = arith.constant 0 : index 1129d6d9a8b8SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.subi %[[VAL_15]], %[[VAL_21]] : index 1130d6d9a8b8SValentin 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>) { 1131d6d9a8b8SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant 1 : index 1132d6d9a8b8SValentin Clement! CHECK: %[[VAL_28:.*]] = arith.addi %[[VAL_25]], %[[VAL_27]] : index 1133d6d9a8b8SValentin 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,?>> 1134d6d9a8b8SValentin Clement! CHECK: %[[VAL_30:.*]] = arith.addi %[[VAL_25]], %[[VAL_7]] : index 1135d6d9a8b8SValentin 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,?>> 1136d6d9a8b8SValentin Clement! CHECK: %[[VAL_32:.*]] = arith.constant false 1137d6d9a8b8SValentin Clement! CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_29]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 1138d6d9a8b8SValentin Clement! CHECK: %[[VAL_34:.*]] = fir.convert %[[VAL_2]]#1 : (index) -> i64 1139d6d9a8b8SValentin Clement! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_31]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 1140d6d9a8b8SValentin Clement! CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_5]]#1 : (index) -> i64 11414cc9437aSTom Eccles! 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 1142d6d9a8b8SValentin Clement! CHECK: %[[VAL_38:.*]] = fir.convert %[[VAL_37]] : (i64) -> i32 1143d6d9a8b8SValentin Clement! CHECK: %[[VAL_39:.*]] = fir.array_update %[[VAL_26]], %[[VAL_38]], %[[VAL_25]] : (!fir.array<10xi32>, i32, index) -> !fir.array<10xi32> 1144d6d9a8b8SValentin Clement! CHECK: fir.result %[[VAL_39]] : !fir.array<10xi32> 1145d6d9a8b8SValentin Clement! CHECK: } 1146d6d9a8b8SValentin Clement! CHECK: fir.array_merge_store %[[VAL_20]], %[[VAL_40:.*]] to %[[VAL_18]] : !fir.array<10xi32>, !fir.array<10xi32>, !fir.heap<!fir.array<10xi32>> 1147d6d9a8b8SValentin Clement! CHECK: %[[VAL_41:.*]] = fir.shape %[[VAL_15]] : (index) -> !fir.shape<1> 1148d6d9a8b8SValentin Clement! CHECK: %[[VAL_42:.*]] = fir.embox %[[VAL_18]](%[[VAL_41]]) : (!fir.heap<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<10xi32>> 1149d6d9a8b8SValentin Clement! CHECK: %[[VAL_43:.*]] = fir.convert %[[VAL_42]] : (!fir.box<!fir.array<10xi32>>) -> !fir.box<none> 11504cc9437aSTom Eccles! CHECK: %[[VAL_44:.*]] = fir.call @_FortranAioOutputDescriptor(%[[VAL_13]], %[[VAL_43]]) {{.*}}: (!fir.ref<i8>, !fir.box<none>) -> i1 11513348c083SValentin Clement! CHECK: fir.freemem %[[VAL_18]] : !fir.heap<!fir.array<10xi32>> 11524cc9437aSTom Eccles! CHECK: %[[VAL_45:.*]] = fir.call @_FortranAioEndIoStatement(%[[VAL_13]]) {{.*}}: (!fir.ref<i8>) -> i32 1153d6d9a8b8SValentin Clement! CHECK: return 1154d6d9a8b8SValentin Clement! CHECK: } 1155d6d9a8b8SValentin Clement 1156d6d9a8b8SValentin Clementsubroutine test_elemental_character_intrinsic(c1, c2) 1157d6d9a8b8SValentin Clement character(*) :: c1(10), c2(2:11) 1158d6d9a8b8SValentin Clement print *, scan(c1, c2) 1159d6d9a8b8SValentin Clementend subroutine 1160d6d9a8b8SValentin Clement 11615e5176adSLeandro Lupori! Check that the expression is folded, with the first operation being an add 11625e5176adSLeandro Lupori! between x and y, resulting in a new temporary array. 11635e5176adSLeandro Lupori! 11645e5176adSLeandro Lupori! CHECK-LABEL: func @_QPtest20a( 11655e5176adSLeandro Lupori! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<4xi32>> {{.*}}, %[[ARG1:.*]]: !fir.ref<!fir.array<4xi32>> {{.*}}, %[[ARG2:.*]]: !fir.ref<!fir.array<4xi32>> 11665e5176adSLeandro Lupori! CHECK: %[[Z:.*]] = fir.array_load %[[ARG2]]({{.*}}) : (!fir.ref<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 11675e5176adSLeandro Lupori! CHECK: %[[X:.*]] = fir.array_load %[[ARG0]]({{.*}}) : (!fir.ref<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 11685e5176adSLeandro Lupori! CHECK: %[[Y:.*]] = fir.array_load %[[ARG1]]({{.*}}) : (!fir.ref<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 11695e5176adSLeandro Lupori! CHECK: %[[TEMP:.*]] = fir.allocmem !fir.array<4xi32> 11705e5176adSLeandro Lupori! CHECK: %[[TEMP2:.*]] = fir.array_load %[[TEMP]]({{.*}}) : (!fir.heap<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 11715e5176adSLeandro Lupori! CHECK: {{.*}} = fir.do_loop %[[I:.*]] = {{.*}} iter_args(%[[TEMP3:.*]] = %[[TEMP2]]) -> (!fir.array<4xi32>) { 11725e5176adSLeandro Lupori! CHECK: %[[XI:.*]] = fir.array_fetch %[[X]], %[[I]] : (!fir.array<4xi32>, index) -> i32 11735e5176adSLeandro Lupori! CHECK: %[[YI:.*]] = fir.array_fetch %[[Y]], %[[I]] : (!fir.array<4xi32>, index) -> i32 11745e5176adSLeandro Lupori! CHECK: %[[ADD:.*]] = arith.addi %[[XI]], %[[YI]] : i32 11755e5176adSLeandro Lupori! CHECK: {{.*}} = fir.array_update %[[TEMP3]], %[[ADD]], %[[I]] : (!fir.array<4xi32>, i32, index) -> !fir.array<4xi32> 11765e5176adSLeandro Lupori! CHECK: } 11775e5176adSLeandro Luporisubroutine test20a(x, y, z) 11785e5176adSLeandro Lupori integer :: x(4), y(4), z(4) 11795e5176adSLeandro Lupori 11805e5176adSLeandro Lupori z = (/x/) + (/y/) 11815e5176adSLeandro Luporiend subroutine 11825e5176adSLeandro Lupori 11835e5176adSLeandro Lupori! Check that the expression is not folded, with the first operations being 11845e5176adSLeandro Lupori! array constructions from x and y. 11855e5176adSLeandro Lupori! 11865e5176adSLeandro Lupori! CHECK-LABEL: func @_QPtest20b( 11875e5176adSLeandro Lupori! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<4xi32>> {{.*}}, %[[ARG1:.*]]: !fir.ref<!fir.array<2x2xi32>> {{.*}}, %[[ARG2:.*]]: !fir.ref<!fir.array<4xi32>> 11885e5176adSLeandro Lupori! CHECK: %[[Z:.*]] = fir.array_load %[[ARG2]]({{.*}}) : (!fir.ref<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 11895e5176adSLeandro Lupori! CHECK: %[[X:.*]] = fir.array_load %[[ARG0]]({{.*}}) : (!fir.ref<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 11905e5176adSLeandro Lupori! CHECK: %[[TEMP:.*]] = fir.allocmem !fir.array<4xi32> 11915e5176adSLeandro Lupori! CHECK: %[[TEMP2:.*]] = fir.array_load %[[TEMP]]({{.*}}) : (!fir.heap<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 11925e5176adSLeandro Lupori! CHECK: {{.*}} = fir.do_loop %[[I:.*]] = {{.*}} iter_args(%[[TEMP3:.*]] = %[[TEMP2]]) -> (!fir.array<4xi32>) { 11935e5176adSLeandro Lupori! CHECK: %[[XI:.*]] = fir.array_fetch %[[X]], %[[I]] : (!fir.array<4xi32>, index) -> i32 11945e5176adSLeandro Lupori! CHECK: {{.*}} = fir.array_update %[[TEMP3]], %[[XI]], %[[I]] : (!fir.array<4xi32>, i32, index) -> !fir.array<4xi32> 11955e5176adSLeandro Lupori! CHECK: } 11965e5176adSLeandro Lupori! CHECK: %[[Y:.*]] = fir.array_load %[[ARG1]]({{.*}}) : (!fir.ref<!fir.array<2x2xi32>>, !fir.shape<2>) -> !fir.array<2x2xi32> 11975e5176adSLeandro Lupori! CHECK: %[[TEMP4:.*]] = fir.allocmem !fir.array<2x2xi32> 11985e5176adSLeandro Lupori! CHECK: %[[TEMP5:.*]] = fir.array_load %[[TEMP4]]({{.*}}) : (!fir.heap<!fir.array<2x2xi32>>, !fir.shape<2>) -> !fir.array<2x2xi32> 11995e5176adSLeandro Lupori! CHECK: {{.*}} = fir.do_loop %[[I:.*]] = {{.*}} iter_args(%[[TEMP6:.*]] = %[[TEMP5]]) -> (!fir.array<2x2xi32>) { 12005e5176adSLeandro Lupori! CHECK: {{.*}} = fir.do_loop %[[J:.*]] = {{.*}} iter_args(%[[TEMP7:.*]] = %[[TEMP6]]) -> (!fir.array<2x2xi32>) { 12015e5176adSLeandro Lupori! CHECK: %[[YJI:.*]] = fir.array_fetch %[[Y]], %[[J]], %[[I]] : (!fir.array<2x2xi32>, index, index) -> i32 12025e5176adSLeandro Lupori! CHECK: {{.*}} = fir.array_update %[[TEMP7]], %[[YJI]], %[[J]], %[[I]] : (!fir.array<2x2xi32>, i32, index, index) -> !fir.array<2x2xi32> 12035e5176adSLeandro Lupori! CHECK: } 12045e5176adSLeandro Lupori! CHECK: } 12055e5176adSLeandro Luporisubroutine test20b(x, y, z) 12065e5176adSLeandro Lupori integer :: x(4), y(2, 2), z(4) 12075e5176adSLeandro Lupori 12085e5176adSLeandro Lupori z = (/x/) + (/y/) 12095e5176adSLeandro Luporiend subroutine 12105e5176adSLeandro Lupori 12115e5176adSLeandro Lupori! CHECK-LABEL: func @_QPtest20c( 12125e5176adSLeandro Lupori! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<4xi32>> {{.*}}, %[[ARG1:.*]]: !fir.ref<!fir.array<2x2xi32>> {{.*}} 12135e5176adSLeandro Lupori 12145e5176adSLeandro Lupori! (/x/) 12155e5176adSLeandro Lupori! CHECK: %[[X:.*]] = fir.array_load %[[ARG0]]({{.*}}) : (!fir.ref<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 12165e5176adSLeandro Lupori! CHECK: %[[ACX_MEM:.*]] = fir.allocmem !fir.array<4xi32> 12175e5176adSLeandro Lupori! CHECK: %[[ACX:.*]] = fir.array_load %[[ACX_MEM]]({{.*}}) : (!fir.heap<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 12185e5176adSLeandro Lupori! CHECK: {{.*}} = fir.do_loop %[[I:.*]] = {{.*}} iter_args(%[[TEMP:.*]] = %[[ACX]]) -> (!fir.array<4xi32>) { 12195e5176adSLeandro Lupori! CHECK: %[[XI:.*]] = fir.array_fetch %[[X]], %[[I]] : (!fir.array<4xi32>, index) -> i32 12205e5176adSLeandro Lupori! CHECK: {{.*}} = fir.array_update %[[TEMP]], %[[XI]], %[[I]] : (!fir.array<4xi32>, i32, index) -> !fir.array<4xi32> 12215e5176adSLeandro Lupori! CHECK: } 12225e5176adSLeandro Lupori! CHECK: %[[T:.*]] = fir.coordinate_of %[[ACX_MEM2:.*]], %{{.*}} : (!fir.heap<!fir.array<4xi32>>, index) -> !fir.ref<i32> 12235e5176adSLeandro Lupori! CHECK: %[[T1:.*]] = fir.convert %[[T]] : (!fir.ref<i32>) -> !fir.ref<i8> 12245e5176adSLeandro Lupori! CHECK: %[[T2:.*]] = fir.convert %[[ACX_MEM]] : (!fir.heap<!fir.array<4xi32>>) -> !fir.ref<i8> 12255e5176adSLeandro Lupori! CHECK: fir.call @llvm.memcpy.p0.p0.i64(%[[T1]], %[[T2]], {{.*}}) 12265e5176adSLeandro Lupori! CHECK: %[[ACX2:.*]] = fir.array_load %[[ACX_MEM2]]({{.*}}) : (!fir.heap<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 12275e5176adSLeandro Lupori 12285e5176adSLeandro Lupori! (/y/) 12295e5176adSLeandro Lupori! CHECK: %[[Y:.*]] = fir.array_load %[[ARG1]]({{.*}}) : (!fir.ref<!fir.array<2x2xi32>>, !fir.shape<2>) -> !fir.array<2x2xi32> 12305e5176adSLeandro Lupori! CHECK: %[[ACY_MEM:.*]] = fir.allocmem !fir.array<2x2xi32> 12315e5176adSLeandro Lupori! CHECK: %[[ACY:.*]] = fir.array_load %[[ACY_MEM]]({{.*}}) : (!fir.heap<!fir.array<2x2xi32>>, !fir.shape<2>) -> !fir.array<2x2xi32> 12325e5176adSLeandro Lupori! CHECK: {{.*}} = fir.do_loop %[[I:.*]] = {{.*}} iter_args(%[[TEMP:.*]] = %[[ACY]]) -> (!fir.array<2x2xi32>) { 12335e5176adSLeandro Lupori! CHECK: {{.*}} = fir.do_loop %[[J:.*]] = {{.*}} iter_args(%[[TEMP2:.*]] = %[[TEMP]]) -> (!fir.array<2x2xi32>) { 12345e5176adSLeandro Lupori! CHECK: %[[YJI:.*]] = fir.array_fetch %[[Y]], %[[J]], %[[I]] : (!fir.array<2x2xi32>, index, index) -> i32 12355e5176adSLeandro Lupori! CHECK: {{.*}} = fir.array_update %[[TEMP2]], %[[YJI]], %[[J]], %[[I]] : (!fir.array<2x2xi32>, i32, index, index) -> !fir.array<2x2xi32> 12365e5176adSLeandro Lupori! CHECK: } 12375e5176adSLeandro Lupori! CHECK: } 12385e5176adSLeandro Lupori! CHECK: %[[T:.*]] = fir.coordinate_of %[[ACY_MEM2:.*]], {{.*}} : (!fir.heap<!fir.array<4xi32>>, index) -> !fir.ref<i32> 12395e5176adSLeandro Lupori! CHECK: %[[T1:.*]] = fir.convert %[[T]] : (!fir.ref<i32>) -> !fir.ref<i8> 12405e5176adSLeandro Lupori! CHECK: %[[T2:.*]] = fir.convert %[[ACY_MEM]] : (!fir.heap<!fir.array<2x2xi32>>) -> !fir.ref<i8> 12415e5176adSLeandro Lupori! CHECK: fir.call @llvm.memcpy.p0.p0.i64(%[[T1]], %[[T2]], {{.*}}) 12425e5176adSLeandro Lupori! CHECK: %[[ACY2:.*]] = fir.array_load %[[ACY_MEM2]]({{.*}}) : (!fir.heap<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32> 12435e5176adSLeandro Lupori 12445e5176adSLeandro Lupori! (/x/) /= (/y/) 12455e5176adSLeandro Lupori! CHECK: %[[RES_MEM:.*]] = fir.allocmem !fir.array<4x!fir.logical<4>> 12465e5176adSLeandro Lupori! CHECK: %[[RES:.*]] = fir.array_load %[[RES_MEM]]({{.*}}) : (!fir.heap<!fir.array<4x!fir.logical<4>>>, !fir.shape<1>) -> !fir.array<4x!fir.logical<4>> 12475e5176adSLeandro Lupori! CHECK: %{{.*}} = fir.do_loop %[[I:.*]] = {{.*}} iter_args(%[[TEMP:.*]] = %[[RES]]) -> (!fir.array<4x!fir.logical<4>>) { 12485e5176adSLeandro Lupori! CHECK: %[[XI:.*]] = fir.array_fetch %[[ACX2]], %[[I]] : (!fir.array<4xi32>, index) -> i32 12495e5176adSLeandro Lupori! CHECK: %[[YI:.*]] = fir.array_fetch %[[ACY2]], %[[I]] : (!fir.array<4xi32>, index) -> i32 12505e5176adSLeandro Lupori! CHECK: %[[T1:.*]] = arith.cmpi ne, %[[XI]], %[[YI]] : i32 12515e5176adSLeandro Lupori! CHECK: %[[T2:.*]] = fir.convert %[[T1]] : (i1) -> !fir.logical<4> 12525e5176adSLeandro Lupori! CHECK: {{.*}} = fir.array_update %[[TEMP]], %[[T2]], %[[I]] : (!fir.array<4x!fir.logical<4>>, !fir.logical<4>, index) -> !fir.array<4x!fir.logical<4>> 12535e5176adSLeandro Lupori! CHECK: } 12545e5176adSLeandro Lupori 12555e5176adSLeandro Lupori! any((/x/) /= (/y/)) 12565e5176adSLeandro Lupori! CHECK: %[[T1:.*]] = fir.embox %[[RES_MEM]]({{.*}}) : (!fir.heap<!fir.array<4x!fir.logical<4>>>, !fir.shape<1>) -> !fir.box<!fir.array<4x!fir.logical<4>>> 12575e5176adSLeandro Lupori! CHECK: %[[T2:.*]] = fir.convert %[[T1]] : (!fir.box<!fir.array<4x!fir.logical<4>>>) -> !fir.box<none> 12585e5176adSLeandro Lupori! CHECK: fir.call @_FortranAAny(%[[T2]], {{.*}}){{.*}} : (!fir.box<none>, !fir.ref<i8>, i32, i32) -> i1 12595e5176adSLeandro Luporisubroutine test20c(x, y) 12605e5176adSLeandro Lupori integer :: x(4), y(2, 2) 12615e5176adSLeandro Lupori 12625e5176adSLeandro Lupori if (any((/x/) /= (/y/))) print *, "different" 12635e5176adSLeandro Luporiend subroutine 12645e5176adSLeandro Lupori 1265d6d9a8b8SValentin Clement! CHECK: func private @_QPbar( 1266