[LLVM] Fix Maintainers.md formatting (NFC)
[llvm-project.git] / flang / test / HLFIR / order_assignments / vector-subscripts-codegen.fir
blobc75daf4f69cffb67ed95486c3fa2f956b8e6199f
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>>)
14   hlfir.region_assign {
15     hlfir.yield %4#0 : !fir.ref<!fir.array<10xf32>>
16   } to {
17     hlfir.elemental_addr %2 : !fir.shape<1> {
18     ^bb0(%arg3: index):
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>
23     }
24   }
25   return
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>
45 // CHECK:           }
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>>)
57   hlfir.forall lb {
58     hlfir.yield %c1_i32 : i32
59   } ub {
60     hlfir.yield %c20_i32 : i32
61   }  (%arg2: i32) {
62     hlfir.region_assign {
63       %4 = hlfir.elemental %2 : (!fir.shape<1>) -> !hlfir.expr<10xf32> {
64       ^bb0(%arg3: index):
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
69       }
70       hlfir.yield %4 : !hlfir.expr<10xf32> cleanup {
71         hlfir.destroy %4 : !hlfir.expr<10xf32>
72       }
73     } to {
74       %4 = fir.convert %arg2 : (i32) -> i64
75       hlfir.elemental_addr %2 : !fir.shape<1> {
76       ^bb0(%arg3: index):
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>
81       }
82     }
83   }
84   return
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
109 // CHECK:             }
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>
118 // CHECK:             }
119 // CHECK:             hlfir.destroy %[[VAL_16]] : !hlfir.expr<10xf32>
120 // CHECK:           }
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>>)
131   hlfir.where {
132     hlfir.yield %1#0 : !fir.ref<!fir.array<10x!fir.logical<4>>>
133   } do {
134     hlfir.region_assign {
135       hlfir.yield %cst : f32
136     } to {
137       hlfir.elemental_addr %0 : !fir.shape<1> {
138       ^bb0(%arg3: index):
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>
143       }
144     }
145   }
146   return
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>
170 // CHECK:             }
171 // CHECK:           }
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>>
183   } to {
184     hlfir.elemental_addr %2 unordered : !fir.shape<1> {
185     ^bb0(%arg3: index):
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>
190     }
191   }
192   return
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>
212 // CHECK:           }
213 // CHECK:           return
214 // CHECK:         }