diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/passes/gto-removals.wast | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/test/lit/passes/gto-removals.wast b/test/lit/passes/gto-removals.wast index 61396cf8f..99579f8ab 100644 --- a/test/lit/passes/gto-removals.wast +++ b/test/lit/passes/gto-removals.wast @@ -1495,3 +1495,80 @@ ) ) ) + +;; The type $A is public because it is on an exported global. As a result we +;; cannot remove the unused i32 field from its child or grandchild. +(module + ;; CHECK: (type $A (sub (struct (field (mut i32))))) + (type $A (sub (struct (field (mut i32))))) + ;; CHECK: (type $B (sub $A (struct (field (mut i32))))) + (type $B (sub $A (struct (field (mut i32))))) + ;; CHECK: (type $C (sub $B (struct (field (mut i32))))) + (type $C (sub $B (struct (field (mut i32))))) + + ;; Use $C so it isn't removed trivially, which also keeps $B alive as its + ;; super. + ;; CHECK: (global $global (ref $A) (struct.new_default $C)) + (global $global (ref $A) (struct.new_default $C)) + + ;; CHECK: (export "global" (global $global)) + (export "global" (global $global)) +) + +;; As above, but now there is an f64 field on $C that can be removed, since it +;; is not on the parents. +(module + ;; CHECK: (type $A (sub (struct (field (mut i32))))) + (type $A (sub (struct (field (mut i32))))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $B (sub $A (struct (field (mut i32))))) + (type $B (sub $A (struct (field (mut i32))))) + ;; CHECK: (type $C (sub $B (struct (field (mut i32))))) + (type $C (sub $B (struct (field (mut i32)) (field (mut f64))))) + + ;; CHECK: (global $global (ref $A) (struct.new_default $C)) + (global $global (ref $A) (struct.new_default $C)) + + ;; CHECK: (export "global" (global $global)) + (export "global" (global $global)) +) + +;; As above, but the f64 field is now on $B as well. We can still remove it. +(module + ;; CHECK: (type $A (sub (struct (field (mut i32))))) + (type $A (sub (struct (field (mut i32))))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $B (sub $A (struct (field (mut i32))))) + (type $B (sub $A (struct (field (mut i32)) (field (mut f64))))) + ;; CHECK: (type $C (sub $B (struct (field (mut i32))))) + (type $C (sub $B (struct (field (mut i32)) (field (mut f64))))) + + ;; CHECK: (global $global (ref $A) (struct.new_default $C)) + (global $global (ref $A) (struct.new_default $C)) + + ;; CHECK: (export "global" (global $global)) + (export "global" (global $global)) +) + +;; As above, but now $B is public as well. Now we cannot remove the f64. +(module + ;; CHECK: (type $A (sub (struct (field (mut i32))))) + (type $A (sub (struct (field (mut i32))))) + ;; CHECK: (type $B (sub $A (struct (field (mut i32)) (field (mut f64))))) + (type $B (sub $A (struct (field (mut i32)) (field (mut f64))))) + ;; CHECK: (type $C (sub $B (struct (field (mut i32)) (field (mut f64))))) + (type $C (sub $B (struct (field (mut i32)) (field (mut f64))))) + + ;; CHECK: (global $global (ref $A) (struct.new_default $C)) + (global $global (ref $A) (struct.new_default $C)) + + ;; CHECK: (global $globalB (ref $B) (struct.new_default $C)) + (global $globalB (ref $B) (struct.new_default $C)) + + ;; CHECK: (export "global" (global $global)) + (export "global" (global $global)) + + ;; CHECK: (export "globalB" (global $globalB)) + (export "globalB" (global $globalB)) +) + |