|
1279 | 1279 | ) |
1280 | 1280 | ) |
1281 | 1281 | ) |
| 1282 | + |
| 1283 | +(module |
| 1284 | + (rec |
| 1285 | + ;; CHECK: (rec |
| 1286 | + ;; CHECK-NEXT: (type $struct (descriptor $desc) (struct)) |
| 1287 | + (type $struct (descriptor $desc) (struct)) |
| 1288 | + ;; CHECK: (type $desc (sub (describes $struct) (struct (field funcref)))) |
| 1289 | + (type $desc (sub (describes $struct) (struct (field funcref)))) |
| 1290 | + ) |
| 1291 | + |
| 1292 | + ;; CHECK: (type $2 (func)) |
| 1293 | + |
| 1294 | + ;; CHECK: (func $test (type $2) |
| 1295 | + ;; CHECK-NEXT: (local $desc (ref $desc)) |
| 1296 | + ;; CHECK-NEXT: (local $func funcref) |
| 1297 | + ;; CHECK-NEXT: (local $2 funcref) |
| 1298 | + ;; CHECK-NEXT: (local $3 (ref (exact $desc))) |
| 1299 | + ;; CHECK-NEXT: (local $4 (ref (exact $desc))) |
| 1300 | + ;; CHECK-NEXT: (drop |
| 1301 | + ;; CHECK-NEXT: (block (result nullref) |
| 1302 | + ;; CHECK-NEXT: (local.set $2 |
| 1303 | + ;; CHECK-NEXT: (ref.null nofunc) |
| 1304 | + ;; CHECK-NEXT: ) |
| 1305 | + ;; CHECK-NEXT: (ref.null none) |
| 1306 | + ;; CHECK-NEXT: ) |
| 1307 | + ;; CHECK-NEXT: ) |
| 1308 | + ;; CHECK-NEXT: (local.tee $func |
| 1309 | + ;; CHECK-NEXT: (block ;; (replaces unreachable StructGet we can't emit) |
| 1310 | + ;; CHECK-NEXT: (drop |
| 1311 | + ;; CHECK-NEXT: (block ;; (replaces unreachable RefGetDesc we can't emit) |
| 1312 | + ;; CHECK-NEXT: (drop |
| 1313 | + ;; CHECK-NEXT: (block |
| 1314 | + ;; CHECK-NEXT: (drop |
| 1315 | + ;; CHECK-NEXT: (block (result nullref) |
| 1316 | + ;; CHECK-NEXT: (local.set $4 |
| 1317 | + ;; CHECK-NEXT: (struct.new_default $desc) |
| 1318 | + ;; CHECK-NEXT: ) |
| 1319 | + ;; CHECK-NEXT: (local.set $3 |
| 1320 | + ;; CHECK-NEXT: (local.get $4) |
| 1321 | + ;; CHECK-NEXT: ) |
| 1322 | + ;; CHECK-NEXT: (ref.null none) |
| 1323 | + ;; CHECK-NEXT: ) |
| 1324 | + ;; CHECK-NEXT: ) |
| 1325 | + ;; CHECK-NEXT: (drop |
| 1326 | + ;; CHECK-NEXT: (ref.null none) |
| 1327 | + ;; CHECK-NEXT: ) |
| 1328 | + ;; CHECK-NEXT: (unreachable) |
| 1329 | + ;; CHECK-NEXT: ) |
| 1330 | + ;; CHECK-NEXT: ) |
| 1331 | + ;; CHECK-NEXT: (unreachable) |
| 1332 | + ;; CHECK-NEXT: ) |
| 1333 | + ;; CHECK-NEXT: ) |
| 1334 | + ;; CHECK-NEXT: (unreachable) |
| 1335 | + ;; CHECK-NEXT: ) |
| 1336 | + ;; CHECK-NEXT: ) |
| 1337 | + ;; CHECK-NEXT: ) |
| 1338 | + (func $test |
| 1339 | + (local $desc (ref $desc)) |
| 1340 | + (local $func funcref) |
| 1341 | + |
| 1342 | + (local.set $desc |
| 1343 | + (struct.new_default $desc) |
| 1344 | + ) |
| 1345 | + |
| 1346 | + (local.set $func |
| 1347 | + (struct.get $desc 0 |
| 1348 | + ;; This ref.get_desc will become unreachable (as the desc does not |
| 1349 | + ;; match, after expanding locals). We should not generate invalid code |
| 1350 | + ;; from that point - it is unreachable, and we can leave it as is. |
| 1351 | + (ref.get_desc $struct |
| 1352 | + (ref.cast_desc_eq (ref $struct) |
| 1353 | + (struct.new_default_desc $struct |
| 1354 | + (struct.new_default $desc) |
| 1355 | + ) |
| 1356 | + (local.get $desc) |
| 1357 | + ) |
| 1358 | + ) |
| 1359 | + ) |
| 1360 | + ) |
| 1361 | + ) |
| 1362 | +) |
0 commit comments