|
27 | 27 | ;; CHECK: (type $B-child (sub $B (struct (field i32) (field i32) (field f32) (field i64)))) |
28 | 28 | (type $B-child (sub $B (struct (field i32) (field i32) (field f32) (field i64)))) |
29 | 29 |
|
30 | | - (type $empty (struct)) |
31 | | - |
32 | 30 | ;; CHECK: (type $C (sub $A (struct (field i32) (field i32) (field f64)))) |
33 | 31 |
|
34 | 32 | ;; CHECK: (rec |
|
37 | 35 | ;; CHECK: (type $void2 (sub $void (func))) |
38 | 36 |
|
39 | 37 | ;; CHECK: (type $struct.ref (struct (field funcref))) |
| 38 | + |
| 39 | + ;; CHECK: (type $struct_i64 (func (param structref) (result i64))) |
| 40 | + |
| 41 | + ;; CHECK: (type $empty (struct)) |
| 42 | + (type $empty (struct)) |
| 43 | + |
40 | 44 | (type $struct.ref (struct (field funcref))) |
41 | 45 |
|
42 | 46 | (type $C (sub $A (struct (field i32) (field i32) (field f64)))) |
|
48 | 52 | (type $void2 (sub $void (func))) |
49 | 53 | ) |
50 | 54 |
|
51 | | - ;; CHECK: (type $struct_i64 (func (param structref) (result i64))) |
52 | 55 | (type $struct_i64 (func (param (ref null struct)) (result i64))) |
53 | 56 |
|
54 | 57 | ;; CHECK: (import "env" "get-i32" (func $get-i32 (type $8) (result i32))) |
|
289 | 292 | ) |
290 | 293 | ) |
291 | 294 |
|
292 | | - ;; CHECK: (func $unneeded_unreachability (type $5) |
| 295 | + ;; CHECK: (func $unneeded_unreachability (type $4) |
293 | 296 | ;; CHECK-NEXT: (drop |
294 | 297 | ;; CHECK-NEXT: (ref.test (ref func) |
295 | 298 | ;; CHECK-NEXT: (unreachable) |
|
477 | 480 | ) |
478 | 481 | ) |
479 | 482 |
|
480 | | - ;; CHECK: (func $nothing (type $5) |
| 483 | + ;; CHECK: (func $nothing (type $4) |
481 | 484 | ;; CHECK-NEXT: ) |
482 | 485 | (func $nothing) |
483 | 486 |
|
484 | | - ;; CHECK: (func $ref-eq-corner-cases (type $4) (param $x eqref) |
| 487 | + ;; CHECK: (func $ref-eq-corner-cases (type $5) (param $x eqref) |
485 | 488 | ;; CHECK-NEXT: (drop |
486 | 489 | ;; CHECK-NEXT: (ref.eq |
487 | 490 | ;; CHECK-NEXT: (block (result eqref) |
|
568 | 571 | ) |
569 | 572 | ) |
570 | 573 |
|
571 | | - ;; CHECK: (func $ref-eq-ref-cast (type $4) (param $x eqref) |
| 574 | + ;; CHECK: (func $ref-eq-ref-cast (type $5) (param $x eqref) |
572 | 575 | ;; CHECK-NEXT: (drop |
573 | 576 | ;; CHECK-NEXT: (ref.eq |
574 | 577 | ;; CHECK-NEXT: (local.get $x) |
|
800 | 803 | ) |
801 | 804 | ) |
802 | 805 |
|
803 | | - ;; CHECK: (func $ref-cast-squared (type $4) (param $x eqref) |
| 806 | + ;; CHECK: (func $ref-cast-squared (type $5) (param $x eqref) |
804 | 807 | ;; CHECK-NEXT: (drop |
805 | 808 | ;; CHECK-NEXT: (ref.cast (ref null $struct) |
806 | 809 | ;; CHECK-NEXT: (local.get $x) |
|
817 | 820 | ) |
818 | 821 | ) |
819 | 822 | ) |
820 | | - ;; CHECK: (func $ref-cast-squared-fallthrough (type $4) (param $x eqref) |
| 823 | + ;; CHECK: (func $ref-cast-squared-fallthrough (type $5) (param $x eqref) |
821 | 824 | ;; CHECK-NEXT: (local $1 (ref null $struct)) |
822 | 825 | ;; CHECK-NEXT: (drop |
823 | 826 | ;; CHECK-NEXT: (block (result (ref null $struct)) |
|
846 | 849 | ) |
847 | 850 | ) |
848 | 851 | ) |
849 | | - ;; CHECK: (func $ref-cast-cubed (type $4) (param $x eqref) |
| 852 | + ;; CHECK: (func $ref-cast-cubed (type $5) (param $x eqref) |
850 | 853 | ;; CHECK-NEXT: (drop |
851 | 854 | ;; CHECK-NEXT: (ref.cast (ref null $struct) |
852 | 855 | ;; CHECK-NEXT: (local.get $x) |
|
865 | 868 | ) |
866 | 869 | ) |
867 | 870 | ) |
868 | | - ;; CHECK: (func $ref-cast-squared-different (type $4) (param $x eqref) |
| 871 | + ;; CHECK: (func $ref-cast-squared-different (type $5) (param $x eqref) |
869 | 872 | ;; CHECK-NEXT: (drop |
870 | 873 | ;; CHECK-NEXT: (ref.cast nullref |
871 | 874 | ;; CHECK-NEXT: (local.get $x) |
|
884 | 887 | ) |
885 | 888 | ) |
886 | 889 |
|
887 | | - ;; CHECK: (func $ref-eq-null (type $4) (param $x eqref) |
| 890 | + ;; CHECK: (func $ref-eq-null (type $5) (param $x eqref) |
888 | 891 | ;; CHECK-NEXT: (drop |
889 | 892 | ;; CHECK-NEXT: (ref.is_null |
890 | 893 | ;; CHECK-NEXT: (local.get $x) |
|
1560 | 1563 | ) |
1561 | 1564 | ) |
1562 | 1565 |
|
1563 | | - ;; CHECK: (func $ref-cast-static-null (type $5) |
| 1566 | + ;; CHECK: (func $ref-cast-static-null (type $4) |
1564 | 1567 | ;; CHECK-NEXT: (local $a (ref null $A)) |
1565 | 1568 | ;; CHECK-NEXT: (drop |
1566 | 1569 | ;; CHECK-NEXT: (ref.null none) |
|
1703 | 1706 | ) |
1704 | 1707 | ) |
1705 | 1708 |
|
1706 | | - ;; CHECK: (func $ref-cast-static-squared (type $4) (param $x eqref) |
| 1709 | + ;; CHECK: (func $ref-cast-static-squared (type $5) (param $x eqref) |
1707 | 1710 | ;; CHECK-NEXT: (drop |
1708 | 1711 | ;; CHECK-NEXT: (ref.cast (ref null $A) |
1709 | 1712 | ;; CHECK-NEXT: (local.get $x) |
|
1746 | 1749 | ) |
1747 | 1750 | ) |
1748 | 1751 |
|
1749 | | - ;; CHECK: (func $ref-cast-static-many (type $4) (param $x eqref) |
| 1752 | + ;; CHECK: (func $ref-cast-static-many (type $5) (param $x eqref) |
1750 | 1753 | ;; CHECK-NEXT: (drop |
1751 | 1754 | ;; CHECK-NEXT: (ref.cast (ref null $B-child) |
1752 | 1755 | ;; CHECK-NEXT: (local.get $x) |
|
1837 | 1840 | ) |
1838 | 1841 | ) |
1839 | 1842 |
|
1840 | | - ;; CHECK: (func $ref-cast-static-very-many (type $4) (param $x eqref) |
| 1843 | + ;; CHECK: (func $ref-cast-static-very-many (type $5) (param $x eqref) |
1841 | 1844 | ;; CHECK-NEXT: (drop |
1842 | 1845 | ;; CHECK-NEXT: (ref.cast (ref null $B-child) |
1843 | 1846 | ;; CHECK-NEXT: (local.get $x) |
|
1875 | 1878 | ) |
1876 | 1879 | ) |
1877 | 1880 |
|
1878 | | - ;; CHECK: (func $ref-cast-static-fallthrough-remaining (type $4) (param $x eqref) |
| 1881 | + ;; CHECK: (func $ref-cast-static-fallthrough-remaining (type $5) (param $x eqref) |
1879 | 1882 | ;; CHECK-NEXT: (drop |
1880 | 1883 | ;; CHECK-NEXT: (block (result (ref null $B)) |
1881 | 1884 | ;; CHECK-NEXT: (call $ref-cast-static-fallthrough-remaining |
|
1910 | 1913 | ) |
1911 | 1914 | ) |
1912 | 1915 |
|
1913 | | - ;; CHECK: (func $ref-cast-static-fallthrough-remaining-child (type $4) (param $x eqref) |
| 1916 | + ;; CHECK: (func $ref-cast-static-fallthrough-remaining-child (type $5) (param $x eqref) |
1914 | 1917 | ;; CHECK-NEXT: (drop |
1915 | 1918 | ;; CHECK-NEXT: (ref.cast (ref null $B) |
1916 | 1919 | ;; CHECK-NEXT: (block (result eqref) |
|
2016 | 2019 | ) |
2017 | 2020 | ) |
2018 | 2021 |
|
2019 | | - ;; CHECK: (func $ref-cast-static-squared-impossible (type $4) (param $x eqref) |
| 2022 | + ;; CHECK: (func $ref-cast-static-squared-impossible (type $5) (param $x eqref) |
2020 | 2023 | ;; CHECK-NEXT: (drop |
2021 | 2024 | ;; CHECK-NEXT: (ref.cast nullref |
2022 | 2025 | ;; CHECK-NEXT: (local.get $x) |
|
2755 | 2758 | ) |
2756 | 2759 | ) |
2757 | 2760 |
|
2758 | | - ;; CHECK: (func $struct.set.null.fallthrough (type $5) |
| 2761 | + ;; CHECK: (func $struct.set.null.fallthrough (type $4) |
2759 | 2762 | ;; CHECK-NEXT: (local $temp (ref null $struct)) |
2760 | 2763 | ;; CHECK-NEXT: (block ;; (replaces unreachable StructSet we can't emit) |
2761 | 2764 | ;; CHECK-NEXT: (drop |
|
2784 | 2787 | ) |
2785 | 2788 | ) |
2786 | 2789 |
|
2787 | | - ;; CHECK: (func $set.array.null (type $5) |
| 2790 | + ;; CHECK: (func $set.array.null (type $4) |
2788 | 2791 | ;; CHECK-NEXT: (local $temp (ref none)) |
2789 | 2792 | ;; CHECK-NEXT: (block ;; (replaces unreachable ArraySet we can't emit) |
2790 | 2793 | ;; CHECK-NEXT: (drop |
|
2856 | 2859 | ) |
2857 | 2860 | ) |
2858 | 2861 |
|
2859 | | - ;; CHECK: (func $refinalize.select.arm.flip (type $5) |
| 2862 | + ;; CHECK: (func $refinalize.select.arm.flip (type $4) |
2860 | 2863 | ;; CHECK-NEXT: (drop |
2861 | 2864 | ;; CHECK-NEXT: (block (result (ref (exact $void2))) |
2862 | 2865 | ;; CHECK-NEXT: (ref.func $func.arm.2) |
|
2995 | 2998 | ) |
2996 | 2999 | ) |
2997 | 3000 |
|
2998 | | - ;; CHECK: (func $ref.test-fallthrough (type $5) |
| 3001 | + ;; CHECK: (func $ref.test-fallthrough (type $4) |
2999 | 3002 | ;; CHECK-NEXT: (local $A (ref $A)) |
3000 | 3003 | ;; CHECK-NEXT: (drop |
3001 | 3004 | ;; CHECK-NEXT: (block (result i32) |
|
3084 | 3087 | ) |
3085 | 3088 | ) |
3086 | 3089 |
|
3087 | | - ;; CHECK: (func $gc_to_unreachable_in_added_constants (type $5) |
| 3090 | + ;; CHECK: (func $gc_to_unreachable_in_added_constants (type $4) |
3088 | 3091 | ;; CHECK-NEXT: (drop |
3089 | 3092 | ;; CHECK-NEXT: (i32.wrap_i64 |
3090 | 3093 | ;; CHECK-NEXT: (i64.add |
|
3174 | 3177 | ) |
3175 | 3178 | ) |
3176 | 3179 |
|
3177 | | - ;; CHECK: (func $struct.new (type $5) |
| 3180 | + ;; CHECK: (func $struct.new (type $4) |
3178 | 3181 | ;; CHECK-NEXT: (drop |
3179 | 3182 | ;; CHECK-NEXT: (block (result (ref (exact $struct))) |
3180 | 3183 | ;; CHECK-NEXT: (drop |
|
3259 | 3262 | ) |
3260 | 3263 | ) |
3261 | 3264 |
|
3262 | | - ;; CHECK: (func $array.new (type $5) |
| 3265 | + ;; CHECK: (func $array.new (type $4) |
3263 | 3266 | ;; CHECK-NEXT: (drop |
3264 | 3267 | ;; CHECK-NEXT: (block (result (ref (exact $array))) |
3265 | 3268 | ;; CHECK-NEXT: (drop |
|
3328 | 3331 | ) |
3329 | 3332 | ) |
3330 | 3333 |
|
3331 | | - ;; CHECK: (func $array.new_fixed (type $5) |
| 3334 | + ;; CHECK: (func $array.new_fixed (type $4) |
3332 | 3335 | ;; CHECK-NEXT: (local $0 i32) |
3333 | 3336 | ;; CHECK-NEXT: (local $1 i32) |
3334 | 3337 | ;; CHECK-NEXT: (drop |
|
3436 | 3439 | ) |
3437 | 3440 | ) |
3438 | 3441 |
|
3439 | | - ;; CHECK: (func $array.new_fixed_fallthrough (type $5) |
| 3442 | + ;; CHECK: (func $array.new_fixed_fallthrough (type $4) |
3440 | 3443 | ;; CHECK-NEXT: (local $0 i32) |
3441 | 3444 | ;; CHECK-NEXT: (local $1 i32) |
3442 | 3445 | ;; CHECK-NEXT: (local $2 i32) |
|
3689 | 3692 | (i32.const 0) |
3690 | 3693 | ) |
3691 | 3694 | ) |
| 3695 | + |
| 3696 | + ;; CHECK: (func $comp-i31-struct-unreachable-if (type $4) |
| 3697 | + ;; CHECK-NEXT: (ref.eq |
| 3698 | + ;; CHECK-NEXT: (ref.i31 |
| 3699 | + ;; CHECK-NEXT: (if (result i32) |
| 3700 | + ;; CHECK-NEXT: (unreachable) |
| 3701 | + ;; CHECK-NEXT: (then |
| 3702 | + ;; CHECK-NEXT: (i32.const 0) |
| 3703 | + ;; CHECK-NEXT: ) |
| 3704 | + ;; CHECK-NEXT: (else |
| 3705 | + ;; CHECK-NEXT: (i32.const 1) |
| 3706 | + ;; CHECK-NEXT: ) |
| 3707 | + ;; CHECK-NEXT: ) |
| 3708 | + ;; CHECK-NEXT: ) |
| 3709 | + ;; CHECK-NEXT: (struct.new_default $empty) |
| 3710 | + ;; CHECK-NEXT: ) |
| 3711 | + ;; CHECK-NEXT: (unreachable) |
| 3712 | + ;; CHECK-NEXT: ) |
| 3713 | + (func $comp-i31-struct-unreachable-if |
| 3714 | + ;; The if is unreachable because of its condition, however, it has reachable |
| 3715 | + ;; arms and is declared with a concrete type, so it only becomes unreachable |
| 3716 | + ;; when we refinalize (which can happen if we pull the ref.i31 out of the |
| 3717 | + ;; arms). We must be careful when handling the ref.eq: if we don't realize |
| 3718 | + ;; it is unreachable, we might think we can prove it returns 0 (since one |
| 3719 | + ;; arm is i31, the other a struct, both non-nullable, and hence there is no |
| 3720 | + ;; overlap). If we do that, and emit a 0, we'd be turning an unreachable |
| 3721 | + ;; into a concrete type, and nothing pops that type off the stack, so we |
| 3722 | + ;; would fail to validate. |
| 3723 | + (ref.eq |
| 3724 | + (if (result (ref i31)) |
| 3725 | + (unreachable) |
| 3726 | + (then |
| 3727 | + (ref.i31 |
| 3728 | + (i32.const 0) |
| 3729 | + ) |
| 3730 | + ) |
| 3731 | + (else |
| 3732 | + (ref.i31 |
| 3733 | + (i32.const 1) |
| 3734 | + ) |
| 3735 | + ) |
| 3736 | + ) |
| 3737 | + (struct.new_default $empty) |
| 3738 | + ) |
| 3739 | + ;; Nothing reads the ref.eq on the stack. |
| 3740 | + (unreachable) |
| 3741 | + ) |
3692 | 3742 | ) |
| 3743 | + |
0 commit comments