@@ -96,9 +96,112 @@ subroutine test1b(a,b,c)
9696 b(c(1 :20 :2 )) = a
9797end subroutine test1b
9898
99+ ! CHECK-LABEL: func @_QPtest1c(
100+ ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10xi32>>, %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi32>>, %[[VAL_2:.*]]: !fir.ref<!fir.array<20xi32>>, %[[VAL_3:.*]]: !fir.ref<!fir.array<10xi32>>) {
101+ ! CHECK: return
102+ ! CHECK: }
99103subroutine test1c (a ,b ,c ,d )
100104 integer :: a(10 ), b(10 ), d(10 ), c(20 )
101105
102106 ! flang: parser FAIL (final position)
103107 ! a = b(d(c(1:20:2))
104108end subroutine test1c
109+
110+
111+ ! CHECK-LABEL: func @_QPtest2a(
112+ ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10xi32>>, %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi32>>, %[[VAL_2:.*]]: !fir.ref<!fir.array<10xi32>>, %[[VAL_3:.*]]: !fir.ref<!fir.array<10xi32>>) {
113+ ! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index
114+ ! CHECK: %[[VAL_5:.*]] = arith.constant 10 : index
115+ ! CHECK: %[[VAL_6:.*]] = arith.constant 10 : index
116+ ! CHECK: %[[VAL_7:.*]] = arith.constant 10 : index
117+ ! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
118+ ! CHECK: %[[VAL_9:.*]] = fir.array_load %[[VAL_0]](%[[VAL_8]]) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32>
119+ ! CHECK: %[[VAL_10:.*]] = arith.constant 10 : i64
120+ ! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
121+ ! CHECK: %[[VAL_12:.*]] = arith.constant 1 : index
122+ ! CHECK: %[[VAL_13:.*]] = arith.constant 1 : index
123+ ! CHECK: %[[VAL_14:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1>
124+ ! CHECK: %[[VAL_15:.*]] = fir.array_load %[[VAL_3]](%[[VAL_14]]) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32>
125+ ! CHECK: %[[VAL_16:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>
126+ ! CHECK: %[[VAL_17:.*]] = fir.slice %[[VAL_13]], %[[VAL_7]], %[[VAL_13]] : (index, index, index) -> !fir.slice<1>
127+ ! CHECK: %[[VAL_18:.*]] = fir.array_load %[[VAL_2]](%[[VAL_16]]) {{\[}}%[[VAL_17]]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<10xi32>
128+ ! CHECK: %[[VAL_19:.*]] = arith.constant 0 : index
129+ ! CHECK: %[[VAL_20:.*]] = arith.subi %[[VAL_7]], %[[VAL_13]] : index
130+ ! CHECK: %[[VAL_21:.*]] = arith.addi %[[VAL_20]], %[[VAL_13]] : index
131+ ! CHECK: %[[VAL_22:.*]] = arith.divsi %[[VAL_21]], %[[VAL_13]] : index
132+ ! CHECK: %[[VAL_23:.*]] = arith.cmpi sgt, %[[VAL_22]], %[[VAL_19]] : index
133+ ! CHECK: %[[VAL_24:.*]] = select %[[VAL_23]], %[[VAL_22]], %[[VAL_19]] : index
134+ ! CHECK: %[[VAL_25:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1>
135+ ! CHECK: %[[VAL_26:.*]] = fir.slice %[[VAL_12]], %[[VAL_24]], %[[VAL_12]] : (index, index, index) -> !fir.slice<1>
136+ ! CHECK: %[[VAL_27:.*]] = fir.array_load %[[VAL_1]](%[[VAL_25]]) {{\[}}%[[VAL_26]]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<10xi32>
137+ ! CHECK: %[[VAL_28:.*]] = arith.constant 1 : index
138+ ! CHECK: %[[VAL_29:.*]] = arith.constant 0 : index
139+ ! CHECK: %[[VAL_30:.*]] = arith.subi %[[VAL_11]], %[[VAL_28]] : index
140+ ! CHECK: %[[VAL_31:.*]] = fir.do_loop %[[VAL_32:.*]] = %[[VAL_29]] to %[[VAL_30]] step %[[VAL_28]] unordered iter_args(%[[VAL_33:.*]] = %[[VAL_9]]) -> (!fir.array<10xi32>) {
141+ ! CHECK: %[[VAL_34:.*]] = fir.array_fetch %[[VAL_15]], %[[VAL_32]] : (!fir.array<10xi32>, index) -> i32
142+ ! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_34]] : (i32) -> index
143+ ! CHECK: %[[VAL_36:.*]] = arith.subi %[[VAL_35]], %[[VAL_13]] : index
144+ ! CHECK: %[[VAL_37:.*]] = fir.array_fetch %[[VAL_18]], %[[VAL_36]] : (!fir.array<10xi32>, index) -> i32
145+ ! CHECK: %[[VAL_38:.*]] = fir.convert %[[VAL_37]] : (i32) -> index
146+ ! CHECK: %[[VAL_39:.*]] = arith.subi %[[VAL_38]], %[[VAL_12]] : index
147+ ! CHECK: %[[VAL_40:.*]] = fir.array_fetch %[[VAL_27]], %[[VAL_39]] : (!fir.array<10xi32>, index) -> i32
148+ ! CHECK: %[[VAL_41:.*]] = fir.array_update %[[VAL_33]], %[[VAL_40]], %[[VAL_32]] : (!fir.array<10xi32>, i32, index) -> !fir.array<10xi32>
149+ ! CHECK: fir.result %[[VAL_41]] : !fir.array<10xi32>
150+ ! CHECK: }
151+ ! CHECK: fir.array_merge_store %[[VAL_9]], %[[VAL_42:.*]] to %[[VAL_0]] : !fir.array<10xi32>, !fir.array<10xi32>, !fir.ref<!fir.array<10xi32>>
152+ ! CHECK: return
153+ ! CHECK: }
154+ subroutine test2a (a ,b ,c ,d )
155+ integer :: a(10 ), b(10 ), c(10 ), d(10 )
156+
157+ a = b(c(d))
158+ end subroutine test2a
159+
160+ ! CHECK-LABEL: func @_QPtest2b(
161+ ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10xi32>>, %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi32>>, %[[VAL_2:.*]]: !fir.ref<!fir.array<10xi32>>, %[[VAL_3:.*]]: !fir.ref<!fir.array<10xi32>>) {
162+ ! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index
163+ ! CHECK: %[[VAL_5:.*]] = arith.constant 10 : index
164+ ! CHECK: %[[VAL_6:.*]] = arith.constant 10 : index
165+ ! CHECK: %[[VAL_7:.*]] = arith.constant 10 : index
166+ ! CHECK: %[[VAL_8:.*]] = arith.constant 1 : index
167+ ! CHECK: %[[VAL_9:.*]] = arith.constant 1 : index
168+ ! CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1>
169+ ! CHECK: %[[VAL_11:.*]] = fir.array_load %[[VAL_3]](%[[VAL_10]]) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32>
170+ ! CHECK: %[[VAL_12:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>
171+ ! CHECK: %[[VAL_13:.*]] = fir.slice %[[VAL_9]], %[[VAL_7]], %[[VAL_9]] : (index, index, index) -> !fir.slice<1>
172+ ! CHECK: %[[VAL_14:.*]] = fir.array_load %[[VAL_2]](%[[VAL_12]]) {{\[}}%[[VAL_13]]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<10xi32>
173+ ! CHECK: %[[VAL_15:.*]] = arith.constant 0 : index
174+ ! CHECK: %[[VAL_16:.*]] = arith.subi %[[VAL_7]], %[[VAL_9]] : index
175+ ! CHECK: %[[VAL_17:.*]] = arith.addi %[[VAL_16]], %[[VAL_9]] : index
176+ ! CHECK: %[[VAL_18:.*]] = arith.divsi %[[VAL_17]], %[[VAL_9]] : index
177+ ! CHECK: %[[VAL_19:.*]] = arith.cmpi sgt, %[[VAL_18]], %[[VAL_15]] : index
178+ ! CHECK: %[[VAL_20:.*]] = select %[[VAL_19]], %[[VAL_18]], %[[VAL_15]] : index
179+ ! CHECK: %[[VAL_21:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1>
180+ ! CHECK: %[[VAL_22:.*]] = fir.slice %[[VAL_8]], %[[VAL_20]], %[[VAL_8]] : (index, index, index) -> !fir.slice<1>
181+ ! CHECK: %[[VAL_23:.*]] = fir.array_load %[[VAL_1]](%[[VAL_21]]) {{\[}}%[[VAL_22]]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<10xi32>
182+ ! CHECK: %[[VAL_24:.*]] = arith.constant 10 : i64
183+ ! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i64) -> index
184+ ! CHECK: %[[VAL_26:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
185+ ! CHECK: %[[VAL_27:.*]] = fir.array_load %[[VAL_0]](%[[VAL_26]]) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32>
186+ ! CHECK: %[[VAL_28:.*]] = arith.constant 1 : index
187+ ! CHECK: %[[VAL_29:.*]] = arith.constant 0 : index
188+ ! CHECK: %[[VAL_30:.*]] = arith.subi %[[VAL_25]], %[[VAL_28]] : index
189+ ! CHECK: %[[VAL_31:.*]] = fir.do_loop %[[VAL_32:.*]] = %[[VAL_29]] to %[[VAL_30]] step %[[VAL_28]] unordered iter_args(%[[VAL_33:.*]] = %[[VAL_23]]) -> (!fir.array<10xi32>) {
190+ ! CHECK: %[[VAL_34:.*]] = fir.array_fetch %[[VAL_27]], %[[VAL_32]] : (!fir.array<10xi32>, index) -> i32
191+ ! CHECK: %[[VAL_35:.*]] = fir.array_fetch %[[VAL_11]], %[[VAL_32]] : (!fir.array<10xi32>, index) -> i32
192+ ! CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_35]] : (i32) -> index
193+ ! CHECK: %[[VAL_37:.*]] = arith.subi %[[VAL_36]], %[[VAL_9]] : index
194+ ! CHECK: %[[VAL_38:.*]] = fir.array_fetch %[[VAL_14]], %[[VAL_37]] : (!fir.array<10xi32>, index) -> i32
195+ ! CHECK: %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (i32) -> index
196+ ! CHECK: %[[VAL_40:.*]] = arith.subi %[[VAL_39]], %[[VAL_8]] : index
197+ ! CHECK: %[[VAL_41:.*]] = fir.array_update %[[VAL_33]], %[[VAL_34]], %[[VAL_40]] : (!fir.array<10xi32>, i32, index) -> !fir.array<10xi32>
198+ ! CHECK: fir.result %[[VAL_41]] : !fir.array<10xi32>
199+ ! CHECK: }
200+ ! CHECK: fir.array_merge_store %[[VAL_23]], %[[VAL_42:.*]] to %[[VAL_1]]{{\[}}%[[VAL_22]]] : !fir.array<10xi32>, !fir.array<10xi32>, !fir.ref<!fir.array<10xi32>>, !fir.slice<1>
201+ ! CHECK: return
202+ ! CHECK: }
203+ subroutine test2b (a ,b ,c ,d )
204+ integer :: a(10 ), b(10 ), c(10 ), d(10 )
205+
206+ b(c(d)) = a
207+ end subroutine test2b
0 commit comments