xref: /llvm-project/flang/test/Lower/array-expression.f90 (revision 1710c8cf0f8def4984893e9dd646579de5528d95)
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