|
12 | 12 | ;; RUN: | filecheck %s --check-prefix=NO_FO |
13 | 13 |
|
14 | 14 | (module |
15 | | - ;; CHECK: (func $conditionals (type $1) (param $x i32) (result i32) |
| 15 | + ;; CHECK: (type $struct (struct (field (mut i32)))) |
| 16 | + ;; NO_FO: (type $struct (struct (field (mut i32)))) |
| 17 | + (type $struct (struct (mut i32))) |
| 18 | + |
| 19 | + ;; CHECK: (func $conditionals (type $2) (param $x i32) (result i32) |
16 | 20 | ;; CHECK-NEXT: (@metadata.code.branch_hint "\01") |
17 | 21 | ;; CHECK-NEXT: (if (result i32) |
18 | 22 | ;; CHECK-NEXT: (local.get $x) |
|
24 | 28 | ;; CHECK-NEXT: ) |
25 | 29 | ;; CHECK-NEXT: ) |
26 | 30 | ;; CHECK-NEXT: ) |
27 | | - ;; NO_FO: (func $conditionals (type $1) (param $x i32) (result i32) |
| 31 | + ;; NO_FO: (func $conditionals (type $2) (param $x i32) (result i32) |
28 | 32 | ;; NO_FO-NEXT: (@metadata.code.branch_hint "\01") |
29 | 33 | ;; NO_FO-NEXT: (if (result i32) |
30 | 34 | ;; NO_FO-NEXT: (local.get $x) |
|
52 | 56 | ) |
53 | 57 | ) |
54 | 58 |
|
55 | | - ;; CHECK: (func $still-fold (type $0) (param $x i32) (param $y i32) |
| 59 | + ;; CHECK: (func $still-fold (type $1) (param $x i32) (param $y i32) |
56 | 60 | ;; CHECK-NEXT: (@metadata.code.branch_hint "\00") |
57 | 61 | ;; CHECK-NEXT: (if |
58 | 62 | ;; CHECK-NEXT: (local.get $y) |
|
61 | 65 | ;; CHECK-NEXT: ) |
62 | 66 | ;; CHECK-NEXT: ) |
63 | 67 | ;; CHECK-NEXT: ) |
64 | | - ;; NO_FO: (func $still-fold (type $0) (param $x i32) (param $y i32) |
| 68 | + ;; NO_FO: (func $still-fold (type $1) (param $x i32) (param $y i32) |
65 | 69 | ;; NO_FO-NEXT: (if |
66 | 70 | ;; NO_FO-NEXT: (local.get $x) |
67 | 71 | ;; NO_FO-NEXT: (then |
|
110 | 114 | ) |
111 | 115 | ) |
112 | 116 |
|
113 | | - ;; CHECK: (func $yes-fold (type $0) (param $x i32) (param $y i32) |
| 117 | + ;; CHECK: (func $yes-fold (type $1) (param $x i32) (param $y i32) |
114 | 118 | ;; CHECK-NEXT: (@metadata.code.branch_hint "\01") |
115 | 119 | ;; CHECK-NEXT: (if |
116 | 120 | ;; CHECK-NEXT: (local.get $y) |
|
119 | 123 | ;; CHECK-NEXT: ) |
120 | 124 | ;; CHECK-NEXT: ) |
121 | 125 | ;; CHECK-NEXT: ) |
122 | | - ;; NO_FO: (func $yes-fold (type $0) (param $x i32) (param $y i32) |
| 126 | + ;; NO_FO: (func $yes-fold (type $1) (param $x i32) (param $y i32) |
123 | 127 | ;; NO_FO-NEXT: (if |
124 | 128 | ;; NO_FO-NEXT: (local.get $x) |
125 | 129 | ;; NO_FO-NEXT: (then |
|
167 | 171 | ) |
168 | 172 | ) |
169 | 173 |
|
170 | | - ;; CHECK: (func $always-fold-select (type $2) (param $x i32) (param $y i32) (result i32) |
| 174 | + ;; CHECK: (func $always-fold-select (type $3) (param $x i32) (param $y i32) (result i32) |
171 | 175 | ;; CHECK-NEXT: (drop |
172 | 176 | ;; CHECK-NEXT: (local.get $y) |
173 | 177 | ;; CHECK-NEXT: ) |
|
182 | 186 | ;; CHECK-NEXT: ) |
183 | 187 | ;; CHECK-NEXT: ) |
184 | 188 | ;; CHECK-NEXT: ) |
185 | | - ;; NO_FO: (func $always-fold-select (type $2) (param $x i32) (param $y i32) (result i32) |
| 189 | + ;; NO_FO: (func $always-fold-select (type $3) (param $x i32) (param $y i32) (result i32) |
186 | 190 | ;; NO_FO-NEXT: (local $2 i32) |
187 | 191 | ;; NO_FO-NEXT: (local.set $2 |
188 | 192 | ;; NO_FO-NEXT: (@metadata.code.branch_hint "\00") |
|
230 | 234 | ) |
231 | 235 | ) |
232 | 236 |
|
233 | | - ;; CHECK: (func $ordering (type $3) (param $x i32) |
| 237 | + ;; CHECK: (func $ordering (type $4) (param $x i32) |
234 | 238 | ;; CHECK-NEXT: (drop |
235 | 239 | ;; CHECK-NEXT: (i32.add |
236 | 240 | ;; CHECK-NEXT: (local.get $x) |
|
244 | 248 | ;; CHECK-NEXT: ) |
245 | 249 | ;; CHECK-NEXT: ) |
246 | 250 | ;; CHECK-NEXT: ) |
247 | | - ;; NO_FO: (func $ordering (type $3) (param $x i32) |
| 251 | + ;; NO_FO: (func $ordering (type $4) (param $x i32) |
248 | 252 | ;; NO_FO-NEXT: (drop |
249 | 253 | ;; NO_FO-NEXT: (i32.add |
250 | 254 | ;; NO_FO-NEXT: (local.get $x) |
|
275 | 279 | ) |
276 | 280 | ) |
277 | 281 | ) |
| 282 | + |
| 283 | + ;; CHECK: (func $struct-set (type $5) (param $ref (ref null $struct)) (param $val i32) |
| 284 | + ;; CHECK-NEXT: (struct.set $struct 0 |
| 285 | + ;; CHECK-NEXT: (local.get $ref) |
| 286 | + ;; CHECK-NEXT: (local.get $val) |
| 287 | + ;; CHECK-NEXT: ) |
| 288 | + ;; CHECK-NEXT: ) |
| 289 | + ;; NO_FO: (func $struct-set (type $5) (param $ref (ref null $struct)) (param $val i32) |
| 290 | + ;; NO_FO-NEXT: (struct.set $struct 0 |
| 291 | + ;; NO_FO-NEXT: (ref.as_non_null |
| 292 | + ;; NO_FO-NEXT: (local.get $ref) |
| 293 | + ;; NO_FO-NEXT: ) |
| 294 | + ;; NO_FO-NEXT: (local.get $val) |
| 295 | + ;; NO_FO-NEXT: ) |
| 296 | + ;; NO_FO-NEXT: ) |
| 297 | + (func $struct-set (param $ref (ref null $struct)) (param $val i32) |
| 298 | + ;; Normally we can skip the ref.as_non_null because struct.set will trap on |
| 299 | + ;; null anyway. But when never-fold-or-reorder is passed, we must not move the |
| 300 | + ;; trap after subsequent children (which might reorder across branch hints, if |
| 301 | + ;; the struct.set's value had a branch hint). |
| 302 | + (struct.set $struct 0 |
| 303 | + (ref.as_non_null |
| 304 | + (local.get $ref) |
| 305 | + ) |
| 306 | + (local.get $val) |
| 307 | + ) |
| 308 | + ) |
278 | 309 | ) |
| 310 | + |
0 commit comments