|
37 | 37 | (type $struct-i32.desc (describes $struct-i32) (struct)) |
38 | 38 | ) |
39 | 39 |
|
40 | | - ;; CHECK: (import "" "" (func $effect (type $6))) |
41 | | - ;; NTRAP: (import "" "" (func $effect (type $6))) |
| 40 | + ;; CHECK: (import "" "" (func $effect (type $4))) |
| 41 | + ;; NTRAP: (import "" "" (func $effect (type $4))) |
42 | 42 | (import "" "" (func $effect)) |
43 | 43 |
|
44 | 44 | ;; CHECK: (func $trap-null-desc (type $10) (result (ref (exact $struct))) |
|
128 | 128 | ) |
129 | 129 | ) |
130 | 130 |
|
131 | | - ;; CHECK: (func $cast-desc-null-desc (type $6) |
| 131 | + ;; CHECK: (func $cast-desc-null-desc (type $4) |
132 | 132 | ;; CHECK-NEXT: (drop |
133 | 133 | ;; CHECK-NEXT: (unreachable) |
134 | 134 | ;; CHECK-NEXT: ) |
135 | 135 | ;; CHECK-NEXT: ) |
136 | | - ;; NTRAP: (func $cast-desc-null-desc (type $6) |
| 136 | + ;; NTRAP: (func $cast-desc-null-desc (type $4) |
137 | 137 | ;; NTRAP-NEXT: (drop |
138 | 138 | ;; NTRAP-NEXT: (unreachable) |
139 | 139 | ;; NTRAP-NEXT: ) |
|
375 | 375 | ) |
376 | 376 | ) |
377 | 377 |
|
378 | | - ;; CHECK: (func $cast-desc-wrong-desc (type $6) |
| 378 | + ;; CHECK: (func $cast-desc-wrong-desc (type $4) |
379 | 379 | ;; CHECK-NEXT: (drop |
380 | 380 | ;; CHECK-NEXT: (ref.cast_desc (ref (exact $struct)) |
381 | 381 | ;; CHECK-NEXT: (struct.new_default_desc $struct |
|
385 | 385 | ;; CHECK-NEXT: ) |
386 | 386 | ;; CHECK-NEXT: ) |
387 | 387 | ;; CHECK-NEXT: ) |
388 | | - ;; NTRAP: (func $cast-desc-wrong-desc (type $6) |
| 388 | + ;; NTRAP: (func $cast-desc-wrong-desc (type $4) |
389 | 389 | ;; NTRAP-NEXT: (drop |
390 | 390 | ;; NTRAP-NEXT: (block (result (ref (exact $struct))) |
391 | 391 | ;; NTRAP-NEXT: (struct.new_default_desc $struct |
|
409 | 409 | ) |
410 | 410 | ) |
411 | 411 |
|
412 | | - ;; CHECK: (func $cast-desc-wrong-desc-effects (type $6) |
| 412 | + ;; CHECK: (func $cast-desc-wrong-desc-effects (type $4) |
413 | 413 | ;; CHECK-NEXT: (drop |
414 | 414 | ;; CHECK-NEXT: (ref.cast_desc (ref (exact $struct)) |
415 | 415 | ;; CHECK-NEXT: (block (result (ref (exact $struct))) |
|
425 | 425 | ;; CHECK-NEXT: ) |
426 | 426 | ;; CHECK-NEXT: ) |
427 | 427 | ;; CHECK-NEXT: ) |
428 | | - ;; NTRAP: (func $cast-desc-wrong-desc-effects (type $6) |
| 428 | + ;; NTRAP: (func $cast-desc-wrong-desc-effects (type $4) |
429 | 429 | ;; NTRAP-NEXT: (local $0 (ref (exact $struct))) |
430 | 430 | ;; NTRAP-NEXT: (local $1 (ref (exact $desc))) |
431 | 431 | ;; NTRAP-NEXT: (drop |
|
497 | 497 | ;; CHECK: (func $cast-desc-weaker-nondesc-child-effects (type $14) (param $ref anyref) (param $desc (ref $sub.desc)) |
498 | 498 | ;; CHECK-NEXT: (drop |
499 | 499 | ;; CHECK-NEXT: (ref.cast_desc (ref $sub) |
500 | | - ;; CHECK-NEXT: (block (result anyref) |
501 | | - ;; CHECK-NEXT: (call $effect) |
502 | | - ;; CHECK-NEXT: (local.get $ref) |
| 500 | + ;; CHECK-NEXT: (ref.as_non_null |
| 501 | + ;; CHECK-NEXT: (block (result anyref) |
| 502 | + ;; CHECK-NEXT: (call $effect) |
| 503 | + ;; CHECK-NEXT: (local.get $ref) |
| 504 | + ;; CHECK-NEXT: ) |
503 | 505 | ;; CHECK-NEXT: ) |
504 | 506 | ;; CHECK-NEXT: (block (result (ref $sub.desc)) |
505 | 507 | ;; CHECK-NEXT: (call $effect) |
|
511 | 513 | ;; NTRAP: (func $cast-desc-weaker-nondesc-child-effects (type $14) (param $ref anyref) (param $desc (ref $sub.desc)) |
512 | 514 | ;; NTRAP-NEXT: (drop |
513 | 515 | ;; NTRAP-NEXT: (ref.cast_desc (ref $sub) |
514 | | - ;; NTRAP-NEXT: (block (result anyref) |
515 | | - ;; NTRAP-NEXT: (call $effect) |
516 | | - ;; NTRAP-NEXT: (local.get $ref) |
| 516 | + ;; NTRAP-NEXT: (ref.as_non_null |
| 517 | + ;; NTRAP-NEXT: (block (result anyref) |
| 518 | + ;; NTRAP-NEXT: (call $effect) |
| 519 | + ;; NTRAP-NEXT: (local.get $ref) |
| 520 | + ;; NTRAP-NEXT: ) |
517 | 521 | ;; NTRAP-NEXT: ) |
518 | 522 | ;; NTRAP-NEXT: (block (result (ref $sub.desc)) |
519 | 523 | ;; NTRAP-NEXT: (call $effect) |
|
524 | 528 | ;; NTRAP-NEXT: ) |
525 | 529 | (func $cast-desc-weaker-nondesc-child-effects (param $ref anyref) (param $desc (ref $sub.desc)) |
526 | 530 | (drop |
527 | | - ;; Same, but with effects. |
| 531 | + ;; Same, but with effects. Due to ordering, we cannot remove the inner |
| 532 | + ;; cast (which turns into ref.as_non_null). |
528 | 533 | (ref.cast_desc (ref $sub) |
529 | 534 | (ref.cast (ref any) |
530 | 535 | (block (result anyref) |
|
1073 | 1078 | ) |
1074 | 1079 | ) |
1075 | 1080 |
|
1076 | | - ;; CHECK: (func $cast-desc-unreachable-desc (type $6) |
| 1081 | + ;; CHECK: (func $cast-desc-unreachable-desc (type $4) |
1077 | 1082 | ;; CHECK-NEXT: (drop |
1078 | 1083 | ;; CHECK-NEXT: (block ;; (replaces unreachable RefCast we can't emit) |
1079 | 1084 | ;; CHECK-NEXT: (drop |
|
1086 | 1091 | ;; CHECK-NEXT: ) |
1087 | 1092 | ;; CHECK-NEXT: ) |
1088 | 1093 | ;; CHECK-NEXT: ) |
1089 | | - ;; NTRAP: (func $cast-desc-unreachable-desc (type $6) |
| 1094 | + ;; NTRAP: (func $cast-desc-unreachable-desc (type $4) |
1090 | 1095 | ;; NTRAP-NEXT: (drop |
1091 | 1096 | ;; NTRAP-NEXT: (block ;; (replaces unreachable RefCast we can't emit) |
1092 | 1097 | ;; NTRAP-NEXT: (drop |
|
1380 | 1385 | ) |
1381 | 1386 | ) |
1382 | 1387 | ) |
| 1388 | + |
| 1389 | + ;; CHECK: (func $ref.cast_desc-ref.as_non_null (type $4) |
| 1390 | + ;; CHECK-NEXT: (local $null (ref null $struct)) |
| 1391 | + ;; CHECK-NEXT: (drop |
| 1392 | + ;; CHECK-NEXT: (ref.cast_desc (ref $struct) |
| 1393 | + ;; CHECK-NEXT: (ref.as_non_null |
| 1394 | + ;; CHECK-NEXT: (local.get $null) |
| 1395 | + ;; CHECK-NEXT: ) |
| 1396 | + ;; CHECK-NEXT: (block (result (ref null $desc)) |
| 1397 | + ;; CHECK-NEXT: (return) |
| 1398 | + ;; CHECK-NEXT: ) |
| 1399 | + ;; CHECK-NEXT: ) |
| 1400 | + ;; CHECK-NEXT: ) |
| 1401 | + ;; CHECK-NEXT: (drop |
| 1402 | + ;; CHECK-NEXT: (ref.cast_desc (ref (exact $struct)) |
| 1403 | + ;; CHECK-NEXT: (local.get $null) |
| 1404 | + ;; CHECK-NEXT: (struct.new_default $desc) |
| 1405 | + ;; CHECK-NEXT: ) |
| 1406 | + ;; CHECK-NEXT: ) |
| 1407 | + ;; CHECK-NEXT: ) |
| 1408 | + ;; NTRAP: (func $ref.cast_desc-ref.as_non_null (type $4) |
| 1409 | + ;; NTRAP-NEXT: (local $null (ref null $struct)) |
| 1410 | + ;; NTRAP-NEXT: (local $1 (ref $struct)) |
| 1411 | + ;; NTRAP-NEXT: (local $2 (ref null $desc)) |
| 1412 | + ;; NTRAP-NEXT: (drop |
| 1413 | + ;; NTRAP-NEXT: (block (result (ref $struct)) |
| 1414 | + ;; NTRAP-NEXT: (local.set $1 |
| 1415 | + ;; NTRAP-NEXT: (ref.as_non_null |
| 1416 | + ;; NTRAP-NEXT: (local.get $null) |
| 1417 | + ;; NTRAP-NEXT: ) |
| 1418 | + ;; NTRAP-NEXT: ) |
| 1419 | + ;; NTRAP-NEXT: (local.set $2 |
| 1420 | + ;; NTRAP-NEXT: (block (result (ref null $desc)) |
| 1421 | + ;; NTRAP-NEXT: (return) |
| 1422 | + ;; NTRAP-NEXT: ) |
| 1423 | + ;; NTRAP-NEXT: ) |
| 1424 | + ;; NTRAP-NEXT: (local.get $1) |
| 1425 | + ;; NTRAP-NEXT: ) |
| 1426 | + ;; NTRAP-NEXT: ) |
| 1427 | + ;; NTRAP-NEXT: (drop |
| 1428 | + ;; NTRAP-NEXT: (ref.cast_desc (ref (exact $struct)) |
| 1429 | + ;; NTRAP-NEXT: (local.get $null) |
| 1430 | + ;; NTRAP-NEXT: (struct.new_default $desc) |
| 1431 | + ;; NTRAP-NEXT: ) |
| 1432 | + ;; NTRAP-NEXT: ) |
| 1433 | + ;; NTRAP-NEXT: ) |
| 1434 | + (func $ref.cast_desc-ref.as_non_null |
| 1435 | + (local $null (ref null $struct)) |
| 1436 | + ;; We read a null local and cast it to non-null, trapping. The ref.cast_desc |
| 1437 | + ;; would trap on null anyhow, so it seems we can remove the ref.as_non_null, |
| 1438 | + ;; but doing so would allow us to reach the block, which returns *before* the |
| 1439 | + ;; ref.cast_desc would trap. |
| 1440 | + (drop |
| 1441 | + (ref.cast_desc (ref $struct) |
| 1442 | + (ref.as_non_null |
| 1443 | + (local.get $null) |
| 1444 | + ) |
| 1445 | + ;; Hide the return in a block, otherwise we'd skip unreachable code. |
| 1446 | + (block (result (ref null $desc)) |
| 1447 | + (return) |
| 1448 | + ) |
| 1449 | + ) |
| 1450 | + ) |
| 1451 | + ;; As above, but without dangerous effects: we can remove the |
| 1452 | + ;; ref.as_non_null. |
| 1453 | + (drop |
| 1454 | + (ref.cast_desc (ref $struct) |
| 1455 | + (ref.as_non_null |
| 1456 | + (local.get $null) |
| 1457 | + ) |
| 1458 | + (struct.new $desc) |
| 1459 | + ) |
| 1460 | + ) |
| 1461 | + ) |
1383 | 1462 | ) |
0 commit comments