1 // Test code generation of hlfir.region_assign where the left-hand
2 // side terminator is an hlfir.elemental_addr (Fortran assignments to
3 // vector subscripted designators).
4 // RUN: fir-opt %s --lower-hlfir-ordered-assignments | FileCheck %s
6 func.func @simple(%arg0: !fir.ref<!fir.array<100xf32>> , %arg1: !fir.ref<!fir.array<10xi64>> , %arg2: !fir.ref<!fir.array<10xf32>> ) {
7 %c10 = arith.constant 10 : index
8 %c100 = arith.constant 100 : index
9 %0 = fir.shape %c100 : (index) -> !fir.shape<1>
10 %1:2 = hlfir.declare %arg0(%0) {uniq_name = "_QFsimpleEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>)
11 %2 = fir.shape %c10 : (index) -> !fir.shape<1>
12 %3:2 = hlfir.declare %arg1(%2) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>)
13 %4:2 = hlfir.declare %arg2(%2) {uniq_name = "z"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
15 hlfir.yield %4#0 : !fir.ref<!fir.array<10xf32>>
17 hlfir.elemental_addr %2 : !fir.shape<1> {
19 %5 = hlfir.designate %3#0 (%arg3) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64>
20 %6 = fir.load %5 : !fir.ref<i64>
21 %7 = hlfir.designate %1#0 (%6) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32>
22 hlfir.yield %7 : !fir.ref<f32>
27 // CHECK-LABEL: func.func @simple(
28 // CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>,
29 // CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi64>>,
30 // CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<!fir.array<10xf32>>) {
31 // CHECK: %[[VAL_3:.*]] = arith.constant 10 : index
32 // CHECK: %[[VAL_4:.*]] = arith.constant 100 : index
33 // CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
34 // CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_5]]) {uniq_name = "_QFsimpleEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>)
35 // CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
36 // CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_7]]) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>)
37 // CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_2]](%[[VAL_7]]) {uniq_name = "z"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
38 // CHECK: %[[VAL_10:.*]] = arith.constant 1 : index
39 // CHECK: fir.do_loop %[[VAL_11:.*]] = %[[VAL_10]] to %[[VAL_3]] step %[[VAL_10]] {
40 // CHECK: %[[VAL_12:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_11]]) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64>
41 // CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_12]] : !fir.ref<i64>
42 // CHECK: %[[VAL_14:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_13]]) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32>
43 // CHECK: %[[VAL_15:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_11]]) : (!fir.ref<!fir.array<10xf32>>, index) -> !fir.ref<f32>
44 // CHECK: hlfir.assign %[[VAL_15]] to %[[VAL_14]] : !fir.ref<f32>, !fir.ref<f32>
47 func.func @forall_vector_lhs(%arg0: !fir.ref<!fir.array<100x20xf32>> , %arg1: !fir.ref<!fir.array<10xi64>> ) {
48 %c20_i32 = arith.constant 20 : i32
49 %c1_i32 = arith.constant 1 : i32
50 %c10 = arith.constant 10 : index
51 %c100 = arith.constant 100 : index
52 %c20 = arith.constant 20 : index
53 %0 = fir.shape %c100, %c20 : (index, index) -> !fir.shape<2>
54 %1:2 = hlfir.declare %arg0(%0) {uniq_name = "x"} : (!fir.ref<!fir.array<100x20xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<100x20xf32>>, !fir.ref<!fir.array<100x20xf32>>)
55 %2 = fir.shape %c10 : (index) -> !fir.shape<1>
56 %3:2 = hlfir.declare %arg1(%2) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>)
58 hlfir.yield %c1_i32 : i32
60 hlfir.yield %c20_i32 : i32
63 %4 = hlfir.elemental %2 : (!fir.shape<1>) -> !hlfir.expr<10xf32> {
65 %5 = hlfir.designate %3#0 (%arg3) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64>
66 %6 = fir.load %5 : !fir.ref<i64>
67 %7 = fir.convert %6 : (i64) -> f32
68 hlfir.yield_element %7 : f32
70 hlfir.yield %4 : !hlfir.expr<10xf32> cleanup {
71 hlfir.destroy %4 : !hlfir.expr<10xf32>
74 %4 = fir.convert %arg2 : (i32) -> i64
75 hlfir.elemental_addr %2 : !fir.shape<1> {
77 %5 = hlfir.designate %3#0 (%arg3) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64>
78 %6 = fir.load %5 : !fir.ref<i64>
79 %7 = hlfir.designate %1#0 (%6, %4) : (!fir.ref<!fir.array<100x20xf32>>, i64, i64) -> !fir.ref<f32>
80 hlfir.yield %7 : !fir.ref<f32>
86 // CHECK-LABEL: func.func @forall_vector_lhs(
87 // CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<100x20xf32>>,
88 // CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi64>>) {
89 // CHECK: %[[VAL_2:.*]] = arith.constant 20 : i32
90 // CHECK: %[[VAL_3:.*]] = arith.constant 1 : i32
91 // CHECK: %[[VAL_4:.*]] = arith.constant 10 : index
92 // CHECK: %[[VAL_5:.*]] = arith.constant 100 : index
93 // CHECK: %[[VAL_6:.*]] = arith.constant 20 : index
94 // CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_5]], %[[VAL_6]] : (index, index) -> !fir.shape<2>
95 // CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_7]]) {uniq_name = "x"} : (!fir.ref<!fir.array<100x20xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<100x20xf32>>, !fir.ref<!fir.array<100x20xf32>>)
96 // CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
97 // CHECK: %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_9]]) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>)
98 // CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
99 // CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_2]] : (i32) -> index
100 // CHECK: %[[VAL_13:.*]] = arith.constant 1 : index
101 // CHECK: fir.do_loop %[[VAL_14:.*]] = %[[VAL_11]] to %[[VAL_12]] step %[[VAL_13]] {
102 // CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (index) -> i32
103 // CHECK: %[[VAL_16:.*]] = hlfir.elemental %[[VAL_9]] : (!fir.shape<1>) -> !hlfir.expr<10xf32> {
104 // CHECK: ^bb0(%[[VAL_17:.*]]: index):
105 // CHECK: %[[VAL_18:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_17]]) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64>
106 // CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_18]] : !fir.ref<i64>
107 // CHECK: %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i64) -> f32
108 // CHECK: hlfir.yield_element %[[VAL_20]] : f32
110 // CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64
111 // CHECK: %[[VAL_22:.*]] = arith.constant 1 : index
112 // CHECK: fir.do_loop %[[VAL_23:.*]] = %[[VAL_22]] to %[[VAL_4]] step %[[VAL_22]] {
113 // CHECK: %[[VAL_24:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_23]]) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64>
114 // CHECK: %[[VAL_25:.*]] = fir.load %[[VAL_24]] : !fir.ref<i64>
115 // CHECK: %[[VAL_26:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_25]], %[[VAL_21]]) : (!fir.ref<!fir.array<100x20xf32>>, i64, i64) -> !fir.ref<f32>
116 // CHECK: %[[VAL_27:.*]] = hlfir.apply %[[VAL_28:.*]], %[[VAL_23]] : (!hlfir.expr<10xf32>, index) -> f32
117 // CHECK: hlfir.assign %[[VAL_27]] to %[[VAL_26]] : f32, !fir.ref<f32>
119 // CHECK: hlfir.destroy %[[VAL_16]] : !hlfir.expr<10xf32>
122 func.func @where_vector_subscripts(%arg0: !fir.ref<!fir.array<10x!fir.logical<4>>> , %arg1: !fir.ref<!fir.array<100xf32>> , %arg2: !fir.ref<!fir.array<10xi64>> ) {
123 %cst = arith.constant 0.000000e+00 : f32
124 %c100 = arith.constant 100 : index
125 %c10 = arith.constant 10 : index
126 %0 = fir.shape %c10 : (index) -> !fir.shape<1>
127 %1:2 = hlfir.declare %arg0(%0) {uniq_name = "l"} : (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.ref<!fir.array<10x!fir.logical<4>>>)
128 %2 = fir.shape %c100 : (index) -> !fir.shape<1>
129 %3:2 = hlfir.declare %arg1(%2) {uniq_name = "x"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>)
130 %4:2 = hlfir.declare %arg2(%0) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>)
132 hlfir.yield %1#0 : !fir.ref<!fir.array<10x!fir.logical<4>>>
134 hlfir.region_assign {
135 hlfir.yield %cst : f32
137 hlfir.elemental_addr %0 : !fir.shape<1> {
139 %5 = hlfir.designate %4#0 (%arg3) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64>
140 %6 = fir.load %5 : !fir.ref<i64>
141 %7 = hlfir.designate %3#0 (%6) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32>
142 hlfir.yield %7 : !fir.ref<f32>
148 // CHECK-LABEL: func.func @where_vector_subscripts(
149 // CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>>,
150 // CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<100xf32>>,
151 // CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<!fir.array<10xi64>>) {
152 // CHECK: %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f32
153 // CHECK: %[[VAL_4:.*]] = arith.constant 100 : index
154 // CHECK: %[[VAL_5:.*]] = arith.constant 10 : index
155 // CHECK: %[[VAL_6:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1>
156 // CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_6]]) {uniq_name = "l"} : (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.ref<!fir.array<10x!fir.logical<4>>>)
157 // CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
158 // CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_8]]) {uniq_name = "x"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>)
159 // CHECK: %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_2]](%[[VAL_6]]) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>)
160 // CHECK: %[[VAL_11:.*]] = arith.constant 1 : index
161 // CHECK: fir.do_loop %[[VAL_12:.*]] = %[[VAL_11]] to %[[VAL_5]] step %[[VAL_11]] {
162 // CHECK: %[[VAL_13:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_12]]) : (!fir.ref<!fir.array<10x!fir.logical<4>>>, index) -> !fir.ref<!fir.logical<4>>
163 // CHECK: %[[VAL_14:.*]] = fir.load %[[VAL_13]] : !fir.ref<!fir.logical<4>>
164 // CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (!fir.logical<4>) -> i1
165 // CHECK: fir.if %[[VAL_15]] {
166 // CHECK: %[[VAL_16:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_12]]) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64>
167 // CHECK: %[[VAL_17:.*]] = fir.load %[[VAL_16]] : !fir.ref<i64>
168 // CHECK: %[[VAL_18:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_17]]) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32>
169 // CHECK: hlfir.assign %[[VAL_3]] to %[[VAL_18]] : f32, !fir.ref<f32>
173 func.func @unordered(%arg0: !fir.ref<!fir.array<100xf32>> , %arg1: !fir.ref<!fir.array<10xi64>> , %arg2: !fir.ref<!fir.array<10xf32>> ) {
174 %c10 = arith.constant 10 : index
175 %c100 = arith.constant 100 : index
176 %0 = fir.shape %c100 : (index) -> !fir.shape<1>
177 %1:2 = hlfir.declare %arg0(%0) {uniq_name = "_QFsimpleEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>)
178 %2 = fir.shape %c10 : (index) -> !fir.shape<1>
179 %3:2 = hlfir.declare %arg1(%2) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>)
180 %4:2 = hlfir.declare %arg2(%2) {uniq_name = "z"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
181 hlfir.region_assign {
182 hlfir.yield %4#0 : !fir.ref<!fir.array<10xf32>>
184 hlfir.elemental_addr %2 unordered : !fir.shape<1> {
186 %5 = hlfir.designate %3#0 (%arg3) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64>
187 %6 = fir.load %5 : !fir.ref<i64>
188 %7 = hlfir.designate %1#0 (%6) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32>
189 hlfir.yield %7 : !fir.ref<f32>
194 // CHECK-LABEL: func.func @unordered(
195 // CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>,
196 // CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi64>>,
197 // CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<!fir.array<10xf32>>) {
198 // CHECK: %[[VAL_3:.*]] = arith.constant 10 : index
199 // CHECK: %[[VAL_4:.*]] = arith.constant 100 : index
200 // CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
201 // CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_5]]) {uniq_name = "_QFsimpleEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>)
202 // CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
203 // CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_7]]) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>)
204 // CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_2]](%[[VAL_7]]) {uniq_name = "z"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
205 // CHECK: %[[VAL_10:.*]] = arith.constant 1 : index
206 // CHECK: fir.do_loop %[[VAL_11:.*]] = %[[VAL_10]] to %[[VAL_3]] step %[[VAL_10]] unordered {
207 // CHECK: %[[VAL_12:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_11]]) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64>
208 // CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_12]] : !fir.ref<i64>
209 // CHECK: %[[VAL_14:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_13]]) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32>
210 // CHECK: %[[VAL_15:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_11]]) : (!fir.ref<!fir.array<10xf32>>, index) -> !fir.ref<f32>
211 // CHECK: hlfir.assign %[[VAL_15]] to %[[VAL_14]] : !fir.ref<f32>, !fir.ref<f32>