diff options
Diffstat (limited to 'test/lit')
-rw-r--r-- | test/lit/merge/names.wat | 12 | ||||
-rw-r--r-- | test/lit/merge/renamings.wat | 11 | ||||
-rw-r--r-- | test/lit/passes/j2cl.wast | 25 | ||||
-rw-r--r-- | test/lit/passes/reorder-globals-real.wast | 894 | ||||
-rw-r--r-- | test/lit/passes/reorder-globals.wast | 547 |
5 files changed, 1448 insertions, 41 deletions
diff --git a/test/lit/merge/names.wat b/test/lit/merge/names.wat index 4562af58b..c4e814649 100644 --- a/test/lit/merge/names.wat +++ b/test/lit/merge/names.wat @@ -12,13 +12,13 @@ ;; CHECK: (type $4 (func (param (ref $u)))) - ;; CHECK: (global $global$0 i32 (i32.const 0)) + ;; CHECK: (global $glob0 i32 (i32.const 0)) - ;; CHECK: (global $glob2 i32 (i32.const 0)) + ;; CHECK: (global $global$1 i32 (i32.const 0)) - ;; CHECK: (global $global$2 i32 (i32.const 0)) + ;; CHECK: (global $glob2 i32 (i32.const 0)) - ;; CHECK: (global $glob0 i32 (i32.const 0)) + ;; CHECK: (global $global$3 i32 (i32.const 0)) ;; CHECK: (memory $mem0 0) @@ -54,7 +54,7 @@ ;; CHECK: (export "g0" (global $glob0)) - ;; CHECK: (export "g1" (global $global$2)) + ;; CHECK: (export "g1" (global $global$1)) ;; CHECK: (export "m0" (memory $mem0)) @@ -80,7 +80,7 @@ ;; CHECK: (export "g2" (global $glob2)) - ;; CHECK: (export "g3" (global $global$0)) + ;; CHECK: (export "g3" (global $global$3)) ;; CHECK: (export "tag2" (tag $tag2)) diff --git a/test/lit/merge/renamings.wat b/test/lit/merge/renamings.wat index 4d1c32c5a..c6a22542a 100644 --- a/test/lit/merge/renamings.wat +++ b/test/lit/merge/renamings.wat @@ -23,21 +23,20 @@ ;; CHECK: (import "elsewhere" "some.tag" (tag $imported (param f64))) - ;; CHECK: (global $bar_2 i32 (i32.const 4)) - - ;; CHECK: (global $other i32 (i32.const 3)) - - ;; CHECK: (global $bar i32 (i32.const 2)) - ;; CHECK: (global $foo i32 (i32.const 1)) (global $foo i32 (i32.const 1)) ;; This global has a conflict in second.wat, and so second.wat's $bar ;; will be renamed. + ;; CHECK: (global $bar i32 (i32.const 2)) (global $bar i32 (i32.const 2)) ;; This memory has a conflict in second.wat, and so second.wat's $foo ;; will be renamed. + ;; CHECK: (global $other i32 (i32.const 3)) + + ;; CHECK: (global $bar_2 i32 (i32.const 4)) + ;; CHECK: (memory $foo 10 20) (memory $foo 10 20) diff --git a/test/lit/passes/j2cl.wast b/test/lit/passes/j2cl.wast index 1963203a8..b8081d8b2 100644 --- a/test/lit/passes/j2cl.wast +++ b/test/lit/passes/j2cl.wast @@ -6,10 +6,9 @@ (module ;; CHECK: (type $0 (func)) - ;; CHECK: (global $field-f64@Foo f64 (f64.const 1)) - ;; CHECK: (global $field-i32@Foo i32 (i32.const 1)) (global $field-i32@Foo (mut i32) (i32.const 0)) + ;; CHECK: (global $field-f64@Foo f64 (f64.const 1)) (global $field-f64@Foo (mut f64) (f64.const 0)) ;; CHECK: (func $clinit_<once>_@Foo (type $0) @@ -29,20 +28,18 @@ ;; CHECK: (type $1 (func)) - ;; CHECK: (global $field2@Foo (mut anyref) (ref.null none)) - ;; CHECK: (global $referredField@Foo i32 (i32.const 42)) (global $referredField@Foo i32 (i32.const 42)) - ;; CHECK: (global $field1@Foo anyref (struct.new $A - ;; CHECK-NEXT: (global.get $referredField@Foo) - ;; CHECK-NEXT: )) - ;; CHECK: (global $referredFieldMut@Foo (mut i32) (i32.const 42)) (global $referredFieldMut@Foo (mut i32) (i32.const 42)) + ;; CHECK: (global $field1@Foo anyref (struct.new $A + ;; CHECK-NEXT: (global.get $referredField@Foo) + ;; CHECK-NEXT: )) (global $field1@Foo (mut anyref) (ref.null none)) + ;; CHECK: (global $field2@Foo (mut anyref) (ref.null none)) (global $field2@Foo (mut anyref) (ref.null none)) ;; CHECK: (global $field3@Foo anyref (global.get $field1@Foo)) @@ -78,11 +75,10 @@ (type $A (struct)) ;; CHECK: (type $1 (func)) - ;; CHECK: (global $field-any@Foo (mut anyref) (struct.new_default $A)) - ;; CHECK: (global $field-i32@Foo (mut i32) (i32.const 2)) (global $field-i32@Foo (mut i32) (i32.const 2)) + ;; CHECK: (global $field-any@Foo (mut anyref) (struct.new_default $A)) (global $field-any@Foo (mut anyref) (struct.new $A)) ;; CHECK: (func $clinit_<once>_@Foo (type $1) @@ -156,13 +152,11 @@ (module ;; CHECK: (type $0 (func (result i32))) - ;; CHECK: (global $$var3@Zoo i32 (i32.const 2)) - - ;; CHECK: (global $$var2@Zoo i32 (i32.const 2)) - ;; CHECK: (global $$var1@Zoo i32 (i32.const 2)) (global $$var1@Zoo (mut i32) (i32.const 0)) + ;; CHECK: (global $$var2@Zoo i32 (i32.const 2)) (global $$var2@Zoo (mut i32) (i32.const 0)) + ;; CHECK: (global $$var3@Zoo i32 (i32.const 2)) (global $$var3@Zoo (mut i32) (i32.const 0)) ;; CHECK: (func $getVar1_<once>_@Zoo (type $0) (result i32) @@ -211,10 +205,9 @@ ;; CHECK: (type $1 (func (result i32))) - ;; CHECK: (global $$var2@Zoo (mut i32) (i32.const 3)) - ;; CHECK: (global $$var1@Zoo (mut i32) (i32.const 2)) (global $$var1@Zoo (mut i32) (i32.const 2)) + ;; CHECK: (global $$var2@Zoo (mut i32) (i32.const 3)) (global $$var2@Zoo (mut i32) (i32.const 3)) diff --git a/test/lit/passes/reorder-globals-real.wast b/test/lit/passes/reorder-globals-real.wast new file mode 100644 index 000000000..87ccc92c9 --- /dev/null +++ b/test/lit/passes/reorder-globals-real.wast @@ -0,0 +1,894 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited. + +;; Similar to reorder-globals, but this runs the "real" version, without +;; "-always". That is, this tests the production code. The downside is we need +;; 128+ globals to see any changes here, so we keep most testing in the other +;; file. + +;; RUN: foreach %s %t wasm-opt -all --reorder-globals -S -o - | filecheck %s + +;; A situation where the simple greedy sort fails to be optimal. We have 129 +;; globals, enough for the LEB size to grow by 1 for the last. One global, +;; |other|, is independent of the rest. The second is in a chain with all the +;; others: +;; +;; global1 <- global2 <- .. <- global128 +;; +;; other has a higher count than global1, so if we are greedy we pick it. But +;; global128 has the highest count by far, so it is actually worth emitting the +;; entire chain first, and only then other, which is the original order. +(module + ;; CHECK: (global $global1 i32 (i32.const 1)) + (global $global1 i32 (i32.const 1)) + ;; CHECK: (global $global2 i32 (global.get $global1)) + (global $global2 i32 (global.get $global1)) + ;; CHECK: (global $global3 i32 (global.get $global2)) + (global $global3 i32 (global.get $global2)) + ;; CHECK: (global $global4 i32 (global.get $global3)) + (global $global4 i32 (global.get $global3)) + ;; CHECK: (global $global5 i32 (global.get $global4)) + (global $global5 i32 (global.get $global4)) + ;; CHECK: (global $global6 i32 (global.get $global5)) + (global $global6 i32 (global.get $global5)) + ;; CHECK: (global $global7 i32 (global.get $global6)) + (global $global7 i32 (global.get $global6)) + ;; CHECK: (global $global8 i32 (global.get $global7)) + (global $global8 i32 (global.get $global7)) + ;; CHECK: (global $global9 i32 (global.get $global8)) + (global $global9 i32 (global.get $global8)) + ;; CHECK: (global $global10 i32 (global.get $global9)) + (global $global10 i32 (global.get $global9)) + ;; CHECK: (global $global11 i32 (global.get $global10)) + (global $global11 i32 (global.get $global10)) + ;; CHECK: (global $global12 i32 (global.get $global11)) + (global $global12 i32 (global.get $global11)) + ;; CHECK: (global $global13 i32 (global.get $global12)) + (global $global13 i32 (global.get $global12)) + ;; CHECK: (global $global14 i32 (global.get $global13)) + (global $global14 i32 (global.get $global13)) + ;; CHECK: (global $global15 i32 (global.get $global14)) + (global $global15 i32 (global.get $global14)) + ;; CHECK: (global $global16 i32 (global.get $global15)) + (global $global16 i32 (global.get $global15)) + ;; CHECK: (global $global17 i32 (global.get $global16)) + (global $global17 i32 (global.get $global16)) + ;; CHECK: (global $global18 i32 (global.get $global17)) + (global $global18 i32 (global.get $global17)) + ;; CHECK: (global $global19 i32 (global.get $global18)) + (global $global19 i32 (global.get $global18)) + ;; CHECK: (global $global20 i32 (global.get $global19)) + (global $global20 i32 (global.get $global19)) + ;; CHECK: (global $global21 i32 (global.get $global20)) + (global $global21 i32 (global.get $global20)) + ;; CHECK: (global $global22 i32 (global.get $global21)) + (global $global22 i32 (global.get $global21)) + ;; CHECK: (global $global23 i32 (global.get $global22)) + (global $global23 i32 (global.get $global22)) + ;; CHECK: (global $global24 i32 (global.get $global23)) + (global $global24 i32 (global.get $global23)) + ;; CHECK: (global $global25 i32 (global.get $global24)) + (global $global25 i32 (global.get $global24)) + ;; CHECK: (global $global26 i32 (global.get $global25)) + (global $global26 i32 (global.get $global25)) + ;; CHECK: (global $global27 i32 (global.get $global26)) + (global $global27 i32 (global.get $global26)) + ;; CHECK: (global $global28 i32 (global.get $global27)) + (global $global28 i32 (global.get $global27)) + ;; CHECK: (global $global29 i32 (global.get $global28)) + (global $global29 i32 (global.get $global28)) + ;; CHECK: (global $global30 i32 (global.get $global29)) + (global $global30 i32 (global.get $global29)) + ;; CHECK: (global $global31 i32 (global.get $global30)) + (global $global31 i32 (global.get $global30)) + ;; CHECK: (global $global32 i32 (global.get $global31)) + (global $global32 i32 (global.get $global31)) + ;; CHECK: (global $global33 i32 (global.get $global32)) + (global $global33 i32 (global.get $global32)) + ;; CHECK: (global $global34 i32 (global.get $global33)) + (global $global34 i32 (global.get $global33)) + ;; CHECK: (global $global35 i32 (global.get $global34)) + (global $global35 i32 (global.get $global34)) + ;; CHECK: (global $global36 i32 (global.get $global35)) + (global $global36 i32 (global.get $global35)) + ;; CHECK: (global $global37 i32 (global.get $global36)) + (global $global37 i32 (global.get $global36)) + ;; CHECK: (global $global38 i32 (global.get $global37)) + (global $global38 i32 (global.get $global37)) + ;; CHECK: (global $global39 i32 (global.get $global38)) + (global $global39 i32 (global.get $global38)) + ;; CHECK: (global $global40 i32 (global.get $global39)) + (global $global40 i32 (global.get $global39)) + ;; CHECK: (global $global41 i32 (global.get $global40)) + (global $global41 i32 (global.get $global40)) + ;; CHECK: (global $global42 i32 (global.get $global41)) + (global $global42 i32 (global.get $global41)) + ;; CHECK: (global $global43 i32 (global.get $global42)) + (global $global43 i32 (global.get $global42)) + ;; CHECK: (global $global44 i32 (global.get $global43)) + (global $global44 i32 (global.get $global43)) + ;; CHECK: (global $global45 i32 (global.get $global44)) + (global $global45 i32 (global.get $global44)) + ;; CHECK: (global $global46 i32 (global.get $global45)) + (global $global46 i32 (global.get $global45)) + ;; CHECK: (global $global47 i32 (global.get $global46)) + (global $global47 i32 (global.get $global46)) + ;; CHECK: (global $global48 i32 (global.get $global47)) + (global $global48 i32 (global.get $global47)) + ;; CHECK: (global $global49 i32 (global.get $global48)) + (global $global49 i32 (global.get $global48)) + ;; CHECK: (global $global50 i32 (global.get $global49)) + (global $global50 i32 (global.get $global49)) + ;; CHECK: (global $global51 i32 (global.get $global50)) + (global $global51 i32 (global.get $global50)) + ;; CHECK: (global $global52 i32 (global.get $global51)) + (global $global52 i32 (global.get $global51)) + ;; CHECK: (global $global53 i32 (global.get $global52)) + (global $global53 i32 (global.get $global52)) + ;; CHECK: (global $global54 i32 (global.get $global53)) + (global $global54 i32 (global.get $global53)) + ;; CHECK: (global $global55 i32 (global.get $global54)) + (global $global55 i32 (global.get $global54)) + ;; CHECK: (global $global56 i32 (global.get $global55)) + (global $global56 i32 (global.get $global55)) + ;; CHECK: (global $global57 i32 (global.get $global56)) + (global $global57 i32 (global.get $global56)) + ;; CHECK: (global $global58 i32 (global.get $global57)) + (global $global58 i32 (global.get $global57)) + ;; CHECK: (global $global59 i32 (global.get $global58)) + (global $global59 i32 (global.get $global58)) + ;; CHECK: (global $global60 i32 (global.get $global59)) + (global $global60 i32 (global.get $global59)) + ;; CHECK: (global $global61 i32 (global.get $global60)) + (global $global61 i32 (global.get $global60)) + ;; CHECK: (global $global62 i32 (global.get $global61)) + (global $global62 i32 (global.get $global61)) + ;; CHECK: (global $global63 i32 (global.get $global62)) + (global $global63 i32 (global.get $global62)) + ;; CHECK: (global $global64 i32 (global.get $global63)) + (global $global64 i32 (global.get $global63)) + ;; CHECK: (global $global65 i32 (global.get $global64)) + (global $global65 i32 (global.get $global64)) + ;; CHECK: (global $global66 i32 (global.get $global65)) + (global $global66 i32 (global.get $global65)) + ;; CHECK: (global $global67 i32 (global.get $global66)) + (global $global67 i32 (global.get $global66)) + ;; CHECK: (global $global68 i32 (global.get $global67)) + (global $global68 i32 (global.get $global67)) + ;; CHECK: (global $global69 i32 (global.get $global68)) + (global $global69 i32 (global.get $global68)) + ;; CHECK: (global $global70 i32 (global.get $global69)) + (global $global70 i32 (global.get $global69)) + ;; CHECK: (global $global71 i32 (global.get $global70)) + (global $global71 i32 (global.get $global70)) + ;; CHECK: (global $global72 i32 (global.get $global71)) + (global $global72 i32 (global.get $global71)) + ;; CHECK: (global $global73 i32 (global.get $global72)) + (global $global73 i32 (global.get $global72)) + ;; CHECK: (global $global74 i32 (global.get $global73)) + (global $global74 i32 (global.get $global73)) + ;; CHECK: (global $global75 i32 (global.get $global74)) + (global $global75 i32 (global.get $global74)) + ;; CHECK: (global $global76 i32 (global.get $global75)) + (global $global76 i32 (global.get $global75)) + ;; CHECK: (global $global77 i32 (global.get $global76)) + (global $global77 i32 (global.get $global76)) + ;; CHECK: (global $global78 i32 (global.get $global77)) + (global $global78 i32 (global.get $global77)) + ;; CHECK: (global $global79 i32 (global.get $global78)) + (global $global79 i32 (global.get $global78)) + ;; CHECK: (global $global80 i32 (global.get $global79)) + (global $global80 i32 (global.get $global79)) + ;; CHECK: (global $global81 i32 (global.get $global80)) + (global $global81 i32 (global.get $global80)) + ;; CHECK: (global $global82 i32 (global.get $global81)) + (global $global82 i32 (global.get $global81)) + ;; CHECK: (global $global83 i32 (global.get $global82)) + (global $global83 i32 (global.get $global82)) + ;; CHECK: (global $global84 i32 (global.get $global83)) + (global $global84 i32 (global.get $global83)) + ;; CHECK: (global $global85 i32 (global.get $global84)) + (global $global85 i32 (global.get $global84)) + ;; CHECK: (global $global86 i32 (global.get $global85)) + (global $global86 i32 (global.get $global85)) + ;; CHECK: (global $global87 i32 (global.get $global86)) + (global $global87 i32 (global.get $global86)) + ;; CHECK: (global $global88 i32 (global.get $global87)) + (global $global88 i32 (global.get $global87)) + ;; CHECK: (global $global89 i32 (global.get $global88)) + (global $global89 i32 (global.get $global88)) + ;; CHECK: (global $global90 i32 (global.get $global89)) + (global $global90 i32 (global.get $global89)) + ;; CHECK: (global $global91 i32 (global.get $global90)) + (global $global91 i32 (global.get $global90)) + ;; CHECK: (global $global92 i32 (global.get $global91)) + (global $global92 i32 (global.get $global91)) + ;; CHECK: (global $global93 i32 (global.get $global92)) + (global $global93 i32 (global.get $global92)) + ;; CHECK: (global $global94 i32 (global.get $global93)) + (global $global94 i32 (global.get $global93)) + ;; CHECK: (global $global95 i32 (global.get $global94)) + (global $global95 i32 (global.get $global94)) + ;; CHECK: (global $global96 i32 (global.get $global95)) + (global $global96 i32 (global.get $global95)) + ;; CHECK: (global $global97 i32 (global.get $global96)) + (global $global97 i32 (global.get $global96)) + ;; CHECK: (global $global98 i32 (global.get $global97)) + (global $global98 i32 (global.get $global97)) + ;; CHECK: (global $global99 i32 (global.get $global98)) + (global $global99 i32 (global.get $global98)) + ;; CHECK: (global $global100 i32 (global.get $global99)) + (global $global100 i32 (global.get $global99)) + ;; CHECK: (global $global101 i32 (global.get $global100)) + (global $global101 i32 (global.get $global100)) + ;; CHECK: (global $global102 i32 (global.get $global101)) + (global $global102 i32 (global.get $global101)) + ;; CHECK: (global $global103 i32 (global.get $global102)) + (global $global103 i32 (global.get $global102)) + ;; CHECK: (global $global104 i32 (global.get $global103)) + (global $global104 i32 (global.get $global103)) + ;; CHECK: (global $global105 i32 (global.get $global104)) + (global $global105 i32 (global.get $global104)) + ;; CHECK: (global $global106 i32 (global.get $global105)) + (global $global106 i32 (global.get $global105)) + ;; CHECK: (global $global107 i32 (global.get $global106)) + (global $global107 i32 (global.get $global106)) + ;; CHECK: (global $global108 i32 (global.get $global107)) + (global $global108 i32 (global.get $global107)) + ;; CHECK: (global $global109 i32 (global.get $global108)) + (global $global109 i32 (global.get $global108)) + ;; CHECK: (global $global110 i32 (global.get $global109)) + (global $global110 i32 (global.get $global109)) + ;; CHECK: (global $global111 i32 (global.get $global110)) + (global $global111 i32 (global.get $global110)) + ;; CHECK: (global $global112 i32 (global.get $global111)) + (global $global112 i32 (global.get $global111)) + ;; CHECK: (global $global113 i32 (global.get $global112)) + (global $global113 i32 (global.get $global112)) + ;; CHECK: (global $global114 i32 (global.get $global113)) + (global $global114 i32 (global.get $global113)) + ;; CHECK: (global $global115 i32 (global.get $global114)) + (global $global115 i32 (global.get $global114)) + ;; CHECK: (global $global116 i32 (global.get $global115)) + (global $global116 i32 (global.get $global115)) + ;; CHECK: (global $global117 i32 (global.get $global116)) + (global $global117 i32 (global.get $global116)) + ;; CHECK: (global $global118 i32 (global.get $global117)) + (global $global118 i32 (global.get $global117)) + ;; CHECK: (global $global119 i32 (global.get $global118)) + (global $global119 i32 (global.get $global118)) + ;; CHECK: (global $global120 i32 (global.get $global119)) + (global $global120 i32 (global.get $global119)) + ;; CHECK: (global $global121 i32 (global.get $global120)) + (global $global121 i32 (global.get $global120)) + ;; CHECK: (global $global122 i32 (global.get $global121)) + (global $global122 i32 (global.get $global121)) + ;; CHECK: (global $global123 i32 (global.get $global122)) + (global $global123 i32 (global.get $global122)) + ;; CHECK: (global $global124 i32 (global.get $global123)) + (global $global124 i32 (global.get $global123)) + ;; CHECK: (global $global125 i32 (global.get $global124)) + (global $global125 i32 (global.get $global124)) + ;; CHECK: (global $global126 i32 (global.get $global125)) + (global $global126 i32 (global.get $global125)) + ;; CHECK: (global $global127 i32 (global.get $global126)) + (global $global127 i32 (global.get $global126)) + ;; CHECK: (global $global128 i32 (global.get $global127)) + (global $global128 i32 (global.get $global127)) + + ;; CHECK: (global $other i32 (i32.const 0)) + (global $other i32 (i32.const 0)) + + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $other) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $other) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $global128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $global128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $global128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $global128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $global128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $global128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $global128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $global128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $global128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $global128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + ;; Aside from the uses in the globals themselves (which means one use for + ;; each of global1..global127), we add two uses of other, to make it + ;; have a higher count than global1, and 10 uses of global128, to make it + ;; have the highest count by far. + (drop (global.get $other)) + (drop (global.get $other)) + + (drop (global.get $global128)) + (drop (global.get $global128)) + (drop (global.get $global128)) + (drop (global.get $global128)) + (drop (global.get $global128)) + (drop (global.get $global128)) + (drop (global.get $global128)) + (drop (global.get $global128)) + (drop (global.get $global128)) + (drop (global.get $global128)) + ) +) + +;; As above, but now the greedy sort is optimal. We remove all uses of +;; $global128, so $other has the highest count and there is no other factor that +;; matters here, so emitting $other first is best. +(module + ;; CHECK: (global $other i32 (i32.const 0)) + + ;; CHECK: (global $global1 i32 (i32.const 1)) + (global $global1 i32 (i32.const 1)) + ;; CHECK: (global $global2 i32 (global.get $global1)) + (global $global2 i32 (global.get $global1)) + ;; CHECK: (global $global3 i32 (global.get $global2)) + (global $global3 i32 (global.get $global2)) + ;; CHECK: (global $global4 i32 (global.get $global3)) + (global $global4 i32 (global.get $global3)) + ;; CHECK: (global $global5 i32 (global.get $global4)) + (global $global5 i32 (global.get $global4)) + ;; CHECK: (global $global6 i32 (global.get $global5)) + (global $global6 i32 (global.get $global5)) + ;; CHECK: (global $global7 i32 (global.get $global6)) + (global $global7 i32 (global.get $global6)) + ;; CHECK: (global $global8 i32 (global.get $global7)) + (global $global8 i32 (global.get $global7)) + ;; CHECK: (global $global9 i32 (global.get $global8)) + (global $global9 i32 (global.get $global8)) + ;; CHECK: (global $global10 i32 (global.get $global9)) + (global $global10 i32 (global.get $global9)) + ;; CHECK: (global $global11 i32 (global.get $global10)) + (global $global11 i32 (global.get $global10)) + ;; CHECK: (global $global12 i32 (global.get $global11)) + (global $global12 i32 (global.get $global11)) + ;; CHECK: (global $global13 i32 (global.get $global12)) + (global $global13 i32 (global.get $global12)) + ;; CHECK: (global $global14 i32 (global.get $global13)) + (global $global14 i32 (global.get $global13)) + ;; CHECK: (global $global15 i32 (global.get $global14)) + (global $global15 i32 (global.get $global14)) + ;; CHECK: (global $global16 i32 (global.get $global15)) + (global $global16 i32 (global.get $global15)) + ;; CHECK: (global $global17 i32 (global.get $global16)) + (global $global17 i32 (global.get $global16)) + ;; CHECK: (global $global18 i32 (global.get $global17)) + (global $global18 i32 (global.get $global17)) + ;; CHECK: (global $global19 i32 (global.get $global18)) + (global $global19 i32 (global.get $global18)) + ;; CHECK: (global $global20 i32 (global.get $global19)) + (global $global20 i32 (global.get $global19)) + ;; CHECK: (global $global21 i32 (global.get $global20)) + (global $global21 i32 (global.get $global20)) + ;; CHECK: (global $global22 i32 (global.get $global21)) + (global $global22 i32 (global.get $global21)) + ;; CHECK: (global $global23 i32 (global.get $global22)) + (global $global23 i32 (global.get $global22)) + ;; CHECK: (global $global24 i32 (global.get $global23)) + (global $global24 i32 (global.get $global23)) + ;; CHECK: (global $global25 i32 (global.get $global24)) + (global $global25 i32 (global.get $global24)) + ;; CHECK: (global $global26 i32 (global.get $global25)) + (global $global26 i32 (global.get $global25)) + ;; CHECK: (global $global27 i32 (global.get $global26)) + (global $global27 i32 (global.get $global26)) + ;; CHECK: (global $global28 i32 (global.get $global27)) + (global $global28 i32 (global.get $global27)) + ;; CHECK: (global $global29 i32 (global.get $global28)) + (global $global29 i32 (global.get $global28)) + ;; CHECK: (global $global30 i32 (global.get $global29)) + (global $global30 i32 (global.get $global29)) + ;; CHECK: (global $global31 i32 (global.get $global30)) + (global $global31 i32 (global.get $global30)) + ;; CHECK: (global $global32 i32 (global.get $global31)) + (global $global32 i32 (global.get $global31)) + ;; CHECK: (global $global33 i32 (global.get $global32)) + (global $global33 i32 (global.get $global32)) + ;; CHECK: (global $global34 i32 (global.get $global33)) + (global $global34 i32 (global.get $global33)) + ;; CHECK: (global $global35 i32 (global.get $global34)) + (global $global35 i32 (global.get $global34)) + ;; CHECK: (global $global36 i32 (global.get $global35)) + (global $global36 i32 (global.get $global35)) + ;; CHECK: (global $global37 i32 (global.get $global36)) + (global $global37 i32 (global.get $global36)) + ;; CHECK: (global $global38 i32 (global.get $global37)) + (global $global38 i32 (global.get $global37)) + ;; CHECK: (global $global39 i32 (global.get $global38)) + (global $global39 i32 (global.get $global38)) + ;; CHECK: (global $global40 i32 (global.get $global39)) + (global $global40 i32 (global.get $global39)) + ;; CHECK: (global $global41 i32 (global.get $global40)) + (global $global41 i32 (global.get $global40)) + ;; CHECK: (global $global42 i32 (global.get $global41)) + (global $global42 i32 (global.get $global41)) + ;; CHECK: (global $global43 i32 (global.get $global42)) + (global $global43 i32 (global.get $global42)) + ;; CHECK: (global $global44 i32 (global.get $global43)) + (global $global44 i32 (global.get $global43)) + ;; CHECK: (global $global45 i32 (global.get $global44)) + (global $global45 i32 (global.get $global44)) + ;; CHECK: (global $global46 i32 (global.get $global45)) + (global $global46 i32 (global.get $global45)) + ;; CHECK: (global $global47 i32 (global.get $global46)) + (global $global47 i32 (global.get $global46)) + ;; CHECK: (global $global48 i32 (global.get $global47)) + (global $global48 i32 (global.get $global47)) + ;; CHECK: (global $global49 i32 (global.get $global48)) + (global $global49 i32 (global.get $global48)) + ;; CHECK: (global $global50 i32 (global.get $global49)) + (global $global50 i32 (global.get $global49)) + ;; CHECK: (global $global51 i32 (global.get $global50)) + (global $global51 i32 (global.get $global50)) + ;; CHECK: (global $global52 i32 (global.get $global51)) + (global $global52 i32 (global.get $global51)) + ;; CHECK: (global $global53 i32 (global.get $global52)) + (global $global53 i32 (global.get $global52)) + ;; CHECK: (global $global54 i32 (global.get $global53)) + (global $global54 i32 (global.get $global53)) + ;; CHECK: (global $global55 i32 (global.get $global54)) + (global $global55 i32 (global.get $global54)) + ;; CHECK: (global $global56 i32 (global.get $global55)) + (global $global56 i32 (global.get $global55)) + ;; CHECK: (global $global57 i32 (global.get $global56)) + (global $global57 i32 (global.get $global56)) + ;; CHECK: (global $global58 i32 (global.get $global57)) + (global $global58 i32 (global.get $global57)) + ;; CHECK: (global $global59 i32 (global.get $global58)) + (global $global59 i32 (global.get $global58)) + ;; CHECK: (global $global60 i32 (global.get $global59)) + (global $global60 i32 (global.get $global59)) + ;; CHECK: (global $global61 i32 (global.get $global60)) + (global $global61 i32 (global.get $global60)) + ;; CHECK: (global $global62 i32 (global.get $global61)) + (global $global62 i32 (global.get $global61)) + ;; CHECK: (global $global63 i32 (global.get $global62)) + (global $global63 i32 (global.get $global62)) + ;; CHECK: (global $global64 i32 (global.get $global63)) + (global $global64 i32 (global.get $global63)) + ;; CHECK: (global $global65 i32 (global.get $global64)) + (global $global65 i32 (global.get $global64)) + ;; CHECK: (global $global66 i32 (global.get $global65)) + (global $global66 i32 (global.get $global65)) + ;; CHECK: (global $global67 i32 (global.get $global66)) + (global $global67 i32 (global.get $global66)) + ;; CHECK: (global $global68 i32 (global.get $global67)) + (global $global68 i32 (global.get $global67)) + ;; CHECK: (global $global69 i32 (global.get $global68)) + (global $global69 i32 (global.get $global68)) + ;; CHECK: (global $global70 i32 (global.get $global69)) + (global $global70 i32 (global.get $global69)) + ;; CHECK: (global $global71 i32 (global.get $global70)) + (global $global71 i32 (global.get $global70)) + ;; CHECK: (global $global72 i32 (global.get $global71)) + (global $global72 i32 (global.get $global71)) + ;; CHECK: (global $global73 i32 (global.get $global72)) + (global $global73 i32 (global.get $global72)) + ;; CHECK: (global $global74 i32 (global.get $global73)) + (global $global74 i32 (global.get $global73)) + ;; CHECK: (global $global75 i32 (global.get $global74)) + (global $global75 i32 (global.get $global74)) + ;; CHECK: (global $global76 i32 (global.get $global75)) + (global $global76 i32 (global.get $global75)) + ;; CHECK: (global $global77 i32 (global.get $global76)) + (global $global77 i32 (global.get $global76)) + ;; CHECK: (global $global78 i32 (global.get $global77)) + (global $global78 i32 (global.get $global77)) + ;; CHECK: (global $global79 i32 (global.get $global78)) + (global $global79 i32 (global.get $global78)) + ;; CHECK: (global $global80 i32 (global.get $global79)) + (global $global80 i32 (global.get $global79)) + ;; CHECK: (global $global81 i32 (global.get $global80)) + (global $global81 i32 (global.get $global80)) + ;; CHECK: (global $global82 i32 (global.get $global81)) + (global $global82 i32 (global.get $global81)) + ;; CHECK: (global $global83 i32 (global.get $global82)) + (global $global83 i32 (global.get $global82)) + ;; CHECK: (global $global84 i32 (global.get $global83)) + (global $global84 i32 (global.get $global83)) + ;; CHECK: (global $global85 i32 (global.get $global84)) + (global $global85 i32 (global.get $global84)) + ;; CHECK: (global $global86 i32 (global.get $global85)) + (global $global86 i32 (global.get $global85)) + ;; CHECK: (global $global87 i32 (global.get $global86)) + (global $global87 i32 (global.get $global86)) + ;; CHECK: (global $global88 i32 (global.get $global87)) + (global $global88 i32 (global.get $global87)) + ;; CHECK: (global $global89 i32 (global.get $global88)) + (global $global89 i32 (global.get $global88)) + ;; CHECK: (global $global90 i32 (global.get $global89)) + (global $global90 i32 (global.get $global89)) + ;; CHECK: (global $global91 i32 (global.get $global90)) + (global $global91 i32 (global.get $global90)) + ;; CHECK: (global $global92 i32 (global.get $global91)) + (global $global92 i32 (global.get $global91)) + ;; CHECK: (global $global93 i32 (global.get $global92)) + (global $global93 i32 (global.get $global92)) + ;; CHECK: (global $global94 i32 (global.get $global93)) + (global $global94 i32 (global.get $global93)) + ;; CHECK: (global $global95 i32 (global.get $global94)) + (global $global95 i32 (global.get $global94)) + ;; CHECK: (global $global96 i32 (global.get $global95)) + (global $global96 i32 (global.get $global95)) + ;; CHECK: (global $global97 i32 (global.get $global96)) + (global $global97 i32 (global.get $global96)) + ;; CHECK: (global $global98 i32 (global.get $global97)) + (global $global98 i32 (global.get $global97)) + ;; CHECK: (global $global99 i32 (global.get $global98)) + (global $global99 i32 (global.get $global98)) + ;; CHECK: (global $global100 i32 (global.get $global99)) + (global $global100 i32 (global.get $global99)) + ;; CHECK: (global $global101 i32 (global.get $global100)) + (global $global101 i32 (global.get $global100)) + ;; CHECK: (global $global102 i32 (global.get $global101)) + (global $global102 i32 (global.get $global101)) + ;; CHECK: (global $global103 i32 (global.get $global102)) + (global $global103 i32 (global.get $global102)) + ;; CHECK: (global $global104 i32 (global.get $global103)) + (global $global104 i32 (global.get $global103)) + ;; CHECK: (global $global105 i32 (global.get $global104)) + (global $global105 i32 (global.get $global104)) + ;; CHECK: (global $global106 i32 (global.get $global105)) + (global $global106 i32 (global.get $global105)) + ;; CHECK: (global $global107 i32 (global.get $global106)) + (global $global107 i32 (global.get $global106)) + ;; CHECK: (global $global108 i32 (global.get $global107)) + (global $global108 i32 (global.get $global107)) + ;; CHECK: (global $global109 i32 (global.get $global108)) + (global $global109 i32 (global.get $global108)) + ;; CHECK: (global $global110 i32 (global.get $global109)) + (global $global110 i32 (global.get $global109)) + ;; CHECK: (global $global111 i32 (global.get $global110)) + (global $global111 i32 (global.get $global110)) + ;; CHECK: (global $global112 i32 (global.get $global111)) + (global $global112 i32 (global.get $global111)) + ;; CHECK: (global $global113 i32 (global.get $global112)) + (global $global113 i32 (global.get $global112)) + ;; CHECK: (global $global114 i32 (global.get $global113)) + (global $global114 i32 (global.get $global113)) + ;; CHECK: (global $global115 i32 (global.get $global114)) + (global $global115 i32 (global.get $global114)) + ;; CHECK: (global $global116 i32 (global.get $global115)) + (global $global116 i32 (global.get $global115)) + ;; CHECK: (global $global117 i32 (global.get $global116)) + (global $global117 i32 (global.get $global116)) + ;; CHECK: (global $global118 i32 (global.get $global117)) + (global $global118 i32 (global.get $global117)) + ;; CHECK: (global $global119 i32 (global.get $global118)) + (global $global119 i32 (global.get $global118)) + ;; CHECK: (global $global120 i32 (global.get $global119)) + (global $global120 i32 (global.get $global119)) + ;; CHECK: (global $global121 i32 (global.get $global120)) + (global $global121 i32 (global.get $global120)) + ;; CHECK: (global $global122 i32 (global.get $global121)) + (global $global122 i32 (global.get $global121)) + ;; CHECK: (global $global123 i32 (global.get $global122)) + (global $global123 i32 (global.get $global122)) + ;; CHECK: (global $global124 i32 (global.get $global123)) + (global $global124 i32 (global.get $global123)) + ;; CHECK: (global $global125 i32 (global.get $global124)) + (global $global125 i32 (global.get $global124)) + ;; CHECK: (global $global126 i32 (global.get $global125)) + (global $global126 i32 (global.get $global125)) + ;; CHECK: (global $global127 i32 (global.get $global126)) + (global $global127 i32 (global.get $global126)) + ;; CHECK: (global $global128 i32 (global.get $global127)) + (global $global128 i32 (global.get $global127)) + + (global $other i32 (i32.const 0)) + + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $other) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $other) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + (drop (global.get $other)) + (drop (global.get $other)) + ) +) + +;; As the last testcase, but one global fewer. As a result we only need a single +;; LEB byte for them all, and we do not bother changing the sort here. +(module + ;; CHECK: (global $global1 i32 (i32.const 1)) + (global $global1 i32 (i32.const 1)) + ;; CHECK: (global $global2 i32 (global.get $global1)) + (global $global2 i32 (global.get $global1)) + ;; CHECK: (global $global3 i32 (global.get $global2)) + (global $global3 i32 (global.get $global2)) + ;; CHECK: (global $global4 i32 (global.get $global3)) + (global $global4 i32 (global.get $global3)) + ;; CHECK: (global $global5 i32 (global.get $global4)) + (global $global5 i32 (global.get $global4)) + ;; CHECK: (global $global6 i32 (global.get $global5)) + (global $global6 i32 (global.get $global5)) + ;; CHECK: (global $global7 i32 (global.get $global6)) + (global $global7 i32 (global.get $global6)) + ;; CHECK: (global $global8 i32 (global.get $global7)) + (global $global8 i32 (global.get $global7)) + ;; CHECK: (global $global9 i32 (global.get $global8)) + (global $global9 i32 (global.get $global8)) + ;; CHECK: (global $global10 i32 (global.get $global9)) + (global $global10 i32 (global.get $global9)) + ;; CHECK: (global $global11 i32 (global.get $global10)) + (global $global11 i32 (global.get $global10)) + ;; CHECK: (global $global12 i32 (global.get $global11)) + (global $global12 i32 (global.get $global11)) + ;; CHECK: (global $global13 i32 (global.get $global12)) + (global $global13 i32 (global.get $global12)) + ;; CHECK: (global $global14 i32 (global.get $global13)) + (global $global14 i32 (global.get $global13)) + ;; CHECK: (global $global15 i32 (global.get $global14)) + (global $global15 i32 (global.get $global14)) + ;; CHECK: (global $global16 i32 (global.get $global15)) + (global $global16 i32 (global.get $global15)) + ;; CHECK: (global $global17 i32 (global.get $global16)) + (global $global17 i32 (global.get $global16)) + ;; CHECK: (global $global18 i32 (global.get $global17)) + (global $global18 i32 (global.get $global17)) + ;; CHECK: (global $global19 i32 (global.get $global18)) + (global $global19 i32 (global.get $global18)) + ;; CHECK: (global $global20 i32 (global.get $global19)) + (global $global20 i32 (global.get $global19)) + ;; CHECK: (global $global21 i32 (global.get $global20)) + (global $global21 i32 (global.get $global20)) + ;; CHECK: (global $global22 i32 (global.get $global21)) + (global $global22 i32 (global.get $global21)) + ;; CHECK: (global $global23 i32 (global.get $global22)) + (global $global23 i32 (global.get $global22)) + ;; CHECK: (global $global24 i32 (global.get $global23)) + (global $global24 i32 (global.get $global23)) + ;; CHECK: (global $global25 i32 (global.get $global24)) + (global $global25 i32 (global.get $global24)) + ;; CHECK: (global $global26 i32 (global.get $global25)) + (global $global26 i32 (global.get $global25)) + ;; CHECK: (global $global27 i32 (global.get $global26)) + (global $global27 i32 (global.get $global26)) + ;; CHECK: (global $global28 i32 (global.get $global27)) + (global $global28 i32 (global.get $global27)) + ;; CHECK: (global $global29 i32 (global.get $global28)) + (global $global29 i32 (global.get $global28)) + ;; CHECK: (global $global30 i32 (global.get $global29)) + (global $global30 i32 (global.get $global29)) + ;; CHECK: (global $global31 i32 (global.get $global30)) + (global $global31 i32 (global.get $global30)) + ;; CHECK: (global $global32 i32 (global.get $global31)) + (global $global32 i32 (global.get $global31)) + ;; CHECK: (global $global33 i32 (global.get $global32)) + (global $global33 i32 (global.get $global32)) + ;; CHECK: (global $global34 i32 (global.get $global33)) + (global $global34 i32 (global.get $global33)) + ;; CHECK: (global $global35 i32 (global.get $global34)) + (global $global35 i32 (global.get $global34)) + ;; CHECK: (global $global36 i32 (global.get $global35)) + (global $global36 i32 (global.get $global35)) + ;; CHECK: (global $global37 i32 (global.get $global36)) + (global $global37 i32 (global.get $global36)) + ;; CHECK: (global $global38 i32 (global.get $global37)) + (global $global38 i32 (global.get $global37)) + ;; CHECK: (global $global39 i32 (global.get $global38)) + (global $global39 i32 (global.get $global38)) + ;; CHECK: (global $global40 i32 (global.get $global39)) + (global $global40 i32 (global.get $global39)) + ;; CHECK: (global $global41 i32 (global.get $global40)) + (global $global41 i32 (global.get $global40)) + ;; CHECK: (global $global42 i32 (global.get $global41)) + (global $global42 i32 (global.get $global41)) + ;; CHECK: (global $global43 i32 (global.get $global42)) + (global $global43 i32 (global.get $global42)) + ;; CHECK: (global $global44 i32 (global.get $global43)) + (global $global44 i32 (global.get $global43)) + ;; CHECK: (global $global45 i32 (global.get $global44)) + (global $global45 i32 (global.get $global44)) + ;; CHECK: (global $global46 i32 (global.get $global45)) + (global $global46 i32 (global.get $global45)) + ;; CHECK: (global $global47 i32 (global.get $global46)) + (global $global47 i32 (global.get $global46)) + ;; CHECK: (global $global48 i32 (global.get $global47)) + (global $global48 i32 (global.get $global47)) + ;; CHECK: (global $global49 i32 (global.get $global48)) + (global $global49 i32 (global.get $global48)) + ;; CHECK: (global $global50 i32 (global.get $global49)) + (global $global50 i32 (global.get $global49)) + ;; CHECK: (global $global51 i32 (global.get $global50)) + (global $global51 i32 (global.get $global50)) + ;; CHECK: (global $global52 i32 (global.get $global51)) + (global $global52 i32 (global.get $global51)) + ;; CHECK: (global $global53 i32 (global.get $global52)) + (global $global53 i32 (global.get $global52)) + ;; CHECK: (global $global54 i32 (global.get $global53)) + (global $global54 i32 (global.get $global53)) + ;; CHECK: (global $global55 i32 (global.get $global54)) + (global $global55 i32 (global.get $global54)) + ;; CHECK: (global $global56 i32 (global.get $global55)) + (global $global56 i32 (global.get $global55)) + ;; CHECK: (global $global57 i32 (global.get $global56)) + (global $global57 i32 (global.get $global56)) + ;; CHECK: (global $global58 i32 (global.get $global57)) + (global $global58 i32 (global.get $global57)) + ;; CHECK: (global $global59 i32 (global.get $global58)) + (global $global59 i32 (global.get $global58)) + ;; CHECK: (global $global60 i32 (global.get $global59)) + (global $global60 i32 (global.get $global59)) + ;; CHECK: (global $global61 i32 (global.get $global60)) + (global $global61 i32 (global.get $global60)) + ;; CHECK: (global $global62 i32 (global.get $global61)) + (global $global62 i32 (global.get $global61)) + ;; CHECK: (global $global63 i32 (global.get $global62)) + (global $global63 i32 (global.get $global62)) + ;; CHECK: (global $global64 i32 (global.get $global63)) + (global $global64 i32 (global.get $global63)) + ;; CHECK: (global $global65 i32 (global.get $global64)) + (global $global65 i32 (global.get $global64)) + ;; CHECK: (global $global66 i32 (global.get $global65)) + (global $global66 i32 (global.get $global65)) + ;; CHECK: (global $global67 i32 (global.get $global66)) + (global $global67 i32 (global.get $global66)) + ;; CHECK: (global $global68 i32 (global.get $global67)) + (global $global68 i32 (global.get $global67)) + ;; CHECK: (global $global69 i32 (global.get $global68)) + (global $global69 i32 (global.get $global68)) + ;; CHECK: (global $global70 i32 (global.get $global69)) + (global $global70 i32 (global.get $global69)) + ;; CHECK: (global $global71 i32 (global.get $global70)) + (global $global71 i32 (global.get $global70)) + ;; CHECK: (global $global72 i32 (global.get $global71)) + (global $global72 i32 (global.get $global71)) + ;; CHECK: (global $global73 i32 (global.get $global72)) + (global $global73 i32 (global.get $global72)) + ;; CHECK: (global $global74 i32 (global.get $global73)) + (global $global74 i32 (global.get $global73)) + ;; CHECK: (global $global75 i32 (global.get $global74)) + (global $global75 i32 (global.get $global74)) + ;; CHECK: (global $global76 i32 (global.get $global75)) + (global $global76 i32 (global.get $global75)) + ;; CHECK: (global $global77 i32 (global.get $global76)) + (global $global77 i32 (global.get $global76)) + ;; CHECK: (global $global78 i32 (global.get $global77)) + (global $global78 i32 (global.get $global77)) + ;; CHECK: (global $global79 i32 (global.get $global78)) + (global $global79 i32 (global.get $global78)) + ;; CHECK: (global $global80 i32 (global.get $global79)) + (global $global80 i32 (global.get $global79)) + ;; CHECK: (global $global81 i32 (global.get $global80)) + (global $global81 i32 (global.get $global80)) + ;; CHECK: (global $global82 i32 (global.get $global81)) + (global $global82 i32 (global.get $global81)) + ;; CHECK: (global $global83 i32 (global.get $global82)) + (global $global83 i32 (global.get $global82)) + ;; CHECK: (global $global84 i32 (global.get $global83)) + (global $global84 i32 (global.get $global83)) + ;; CHECK: (global $global85 i32 (global.get $global84)) + (global $global85 i32 (global.get $global84)) + ;; CHECK: (global $global86 i32 (global.get $global85)) + (global $global86 i32 (global.get $global85)) + ;; CHECK: (global $global87 i32 (global.get $global86)) + (global $global87 i32 (global.get $global86)) + ;; CHECK: (global $global88 i32 (global.get $global87)) + (global $global88 i32 (global.get $global87)) + ;; CHECK: (global $global89 i32 (global.get $global88)) + (global $global89 i32 (global.get $global88)) + ;; CHECK: (global $global90 i32 (global.get $global89)) + (global $global90 i32 (global.get $global89)) + ;; CHECK: (global $global91 i32 (global.get $global90)) + (global $global91 i32 (global.get $global90)) + ;; CHECK: (global $global92 i32 (global.get $global91)) + (global $global92 i32 (global.get $global91)) + ;; CHECK: (global $global93 i32 (global.get $global92)) + (global $global93 i32 (global.get $global92)) + ;; CHECK: (global $global94 i32 (global.get $global93)) + (global $global94 i32 (global.get $global93)) + ;; CHECK: (global $global95 i32 (global.get $global94)) + (global $global95 i32 (global.get $global94)) + ;; CHECK: (global $global96 i32 (global.get $global95)) + (global $global96 i32 (global.get $global95)) + ;; CHECK: (global $global97 i32 (global.get $global96)) + (global $global97 i32 (global.get $global96)) + ;; CHECK: (global $global98 i32 (global.get $global97)) + (global $global98 i32 (global.get $global97)) + ;; CHECK: (global $global99 i32 (global.get $global98)) + (global $global99 i32 (global.get $global98)) + ;; CHECK: (global $global100 i32 (global.get $global99)) + (global $global100 i32 (global.get $global99)) + ;; CHECK: (global $global101 i32 (global.get $global100)) + (global $global101 i32 (global.get $global100)) + ;; CHECK: (global $global102 i32 (global.get $global101)) + (global $global102 i32 (global.get $global101)) + ;; CHECK: (global $global103 i32 (global.get $global102)) + (global $global103 i32 (global.get $global102)) + ;; CHECK: (global $global104 i32 (global.get $global103)) + (global $global104 i32 (global.get $global103)) + ;; CHECK: (global $global105 i32 (global.get $global104)) + (global $global105 i32 (global.get $global104)) + ;; CHECK: (global $global106 i32 (global.get $global105)) + (global $global106 i32 (global.get $global105)) + ;; CHECK: (global $global107 i32 (global.get $global106)) + (global $global107 i32 (global.get $global106)) + ;; CHECK: (global $global108 i32 (global.get $global107)) + (global $global108 i32 (global.get $global107)) + ;; CHECK: (global $global109 i32 (global.get $global108)) + (global $global109 i32 (global.get $global108)) + ;; CHECK: (global $global110 i32 (global.get $global109)) + (global $global110 i32 (global.get $global109)) + ;; CHECK: (global $global111 i32 (global.get $global110)) + (global $global111 i32 (global.get $global110)) + ;; CHECK: (global $global112 i32 (global.get $global111)) + (global $global112 i32 (global.get $global111)) + ;; CHECK: (global $global113 i32 (global.get $global112)) + (global $global113 i32 (global.get $global112)) + ;; CHECK: (global $global114 i32 (global.get $global113)) + (global $global114 i32 (global.get $global113)) + ;; CHECK: (global $global115 i32 (global.get $global114)) + (global $global115 i32 (global.get $global114)) + ;; CHECK: (global $global116 i32 (global.get $global115)) + (global $global116 i32 (global.get $global115)) + ;; CHECK: (global $global117 i32 (global.get $global116)) + (global $global117 i32 (global.get $global116)) + ;; CHECK: (global $global118 i32 (global.get $global117)) + (global $global118 i32 (global.get $global117)) + ;; CHECK: (global $global119 i32 (global.get $global118)) + (global $global119 i32 (global.get $global118)) + ;; CHECK: (global $global120 i32 (global.get $global119)) + (global $global120 i32 (global.get $global119)) + ;; CHECK: (global $global121 i32 (global.get $global120)) + (global $global121 i32 (global.get $global120)) + ;; CHECK: (global $global122 i32 (global.get $global121)) + (global $global122 i32 (global.get $global121)) + ;; CHECK: (global $global123 i32 (global.get $global122)) + (global $global123 i32 (global.get $global122)) + ;; CHECK: (global $global124 i32 (global.get $global123)) + (global $global124 i32 (global.get $global123)) + ;; CHECK: (global $global125 i32 (global.get $global124)) + (global $global125 i32 (global.get $global124)) + ;; CHECK: (global $global126 i32 (global.get $global125)) + (global $global126 i32 (global.get $global125)) + ;; CHECK: (global $global127 i32 (global.get $global126)) + (global $global127 i32 (global.get $global126)) + + ;; $global128 was removed + + ;; CHECK: (global $other i32 (i32.const 0)) + (global $other i32 (i32.const 0)) + + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $other) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $other) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + (drop (global.get $other)) + (drop (global.get $other)) + ) +) diff --git a/test/lit/passes/reorder-globals.wast b/test/lit/passes/reorder-globals.wast index 6017f09ad..542311d59 100644 --- a/test/lit/passes/reorder-globals.wast +++ b/test/lit/passes/reorder-globals.wast @@ -145,8 +145,6 @@ ;; As above, but without dependencies, so now $c is first and then $b. (module - - ;; CHECK: (global $c i32 (i32.const 30)) ;; CHECK: (global $b i32 (i32.const 20)) @@ -180,10 +178,10 @@ ) ) -;; As above, but a mixed case: $b depends on $a but $c has no dependencies. $c -;; can be first. +;; As above, but a mixed case: $b depends on $a but $c has no dependencies, and +;; the counts are $c with the most, followed by $b, and then $a. $c can be +;; first here, but $b must follow $a. (module - ;; CHECK: (global $c i32 (i32.const 30)) ;; CHECK: (global $a i32 (i32.const 10)) @@ -197,6 +195,12 @@ ;; CHECK-NEXT: (global.get $b) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (global.get $c) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -204,6 +208,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $uses + ;; ($a already has one use in the global $b) + (drop + (global.get $b) + ) (drop (global.get $b) ) @@ -213,27 +221,111 @@ (drop (global.get $c) ) + (drop + (global.get $c) + ) ) ) -;; Another mixed case, now with $c depending on $b. $b can be before $a. +;; As above, but with the counts adjusted: before we had $c, $b, $a from most to +;; least uses, and now $b, $c, $a. +;; +;; A greedy sort would do $c, $a, $b (as the first choice is between $c and $a, +;; and $c wins), but that leaves $b, the highest count, for the end. The +;; smoothed-out LEB costs (1 byte at the start, +1/128 each index later) are: +;; +;; $c $a $b +;; 1 * 2 + 129/128 * 1 + 130/128 * 3 = 775/128 +;; +;; The original sort is +;; +;; $a $b $c +;; 1 * 1 + 129/128 * 3 + 130/128 * 2 = 775/128 +;; +;; As they are equal we prefer the original order. (module + ;; CHECK: (global $a i32 (i32.const 10)) + (global $a i32 (i32.const 10)) + ;; CHECK: (global $b i32 (global.get $a)) + (global $b i32 (global.get $a)) + ;; CHECK: (global $c i32 (i32.const 30)) + (global $c i32 (i32.const 30)) + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + (drop + (global.get $b) + ) + (drop + (global.get $b) + ) + (drop + (global.get $b) + ) + (drop + (global.get $c) + ) + (drop + (global.get $c) + ) + ) +) - ;; CHECK: (global $b i32 (i32.const 20)) - - ;; CHECK: (global $c i32 (global.get $b)) - +;; As above, but with the counts adjusted to $b, $a, $c. +(module ;; CHECK: (global $a i32 (i32.const 10)) (global $a i32 (i32.const 10)) - (global $b i32 (i32.const 20)) - (global $c i32 (global.get $b)) + ;; CHECK: (global $b i32 (global.get $a)) + (global $b i32 (global.get $a)) + ;; CHECK: (global $c i32 (i32.const 30)) + (global $c i32 (i32.const 30)) ;; CHECK: (func $uses (type $0) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (global.get $b) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + (drop + (global.get $b) + ) + (drop + (global.get $b) + ) + ) +) + +;; As above, but with the counts adjusted to $c, $a, $b. +(module + ;; CHECK: (global $c i32 (i32.const 30)) + + ;; CHECK: (global $a i32 (i32.const 10)) + (global $a i32 (i32.const 10)) + ;; CHECK: (global $b i32 (global.get $a)) + (global $b i32 (global.get $a)) + (global $c i32 (i32.const 30)) + + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (global.get $c) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -242,11 +334,63 @@ ;; CHECK-NEXT: ) (func $uses (drop - (global.get $b) + (global.get $c) ) (drop (global.get $c) ) + ) +) + +;; As above, but with the counts adjusted to $a, $b, $c. +(module + ;; CHECK: (global $a i32 (i32.const 10)) + (global $a i32 (i32.const 10)) + ;; CHECK: (global $b i32 (global.get $a)) + (global $b i32 (global.get $a)) + ;; CHECK: (global $c i32 (i32.const 30)) + (global $c i32 (i32.const 30)) + + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + (drop + (global.get $a) + ) + (drop + (global.get $b) + ) + ) +) + +;; As above, but with the counts adjusted to $a, $c, $b. +(module + ;; CHECK: (global $a i32 (i32.const 10)) + (global $a i32 (i32.const 10)) + ;; CHECK: (global $c i32 (i32.const 30)) + + ;; CHECK: (global $b i32 (global.get $a)) + (global $b i32 (global.get $a)) + (global $c i32 (i32.const 30)) + + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + (drop + (global.get $a) + ) (drop (global.get $c) ) @@ -292,3 +436,380 @@ ) ) ) + +;; Lower letters have lower counts: $a has the least, and $e has the most. +;; +;; Dependency graph (left depends on right): +;; +;; $c - $a +;; / +;; $e +;; \ +;; $d - $b +;; +;; $e has the most uses, followed by $c and $d. $a and $b have a reverse +;; ordering from their dependers, so a naive topological sort will fail to +;; be optimal. There are multiple optimal orders however, including: +;; +;; $b, $a, $c, $d, $e +;; $b, $d, $a, $c, $e +;; +;; $b and $e must be at the edges, but there is no single way to sort the +;; others: the first sorting here puts $a before both $d (though $a has +;; lower count) while the second puts $d before $c. Our greedy algorithm +;; picks the second order here. +(module + ;; CHECK: (global $b i32 (i32.const 20)) + + ;; CHECK: (global $d i32 (global.get $b)) + + ;; CHECK: (global $a i32 (i32.const 10)) + (global $a i32 (i32.const 10)) + + (global $b i32 (i32.const 20)) + + ;; CHECK: (global $c i32 (global.get $a)) + (global $c i32 (global.get $a)) + + (global $d i32 (global.get $b)) + + ;; CHECK: (global $e i32 (i32.add + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: (global.get $d) + ;; CHECK-NEXT: )) + (global $e i32 (i32.add + (global.get $c) + (global.get $d) + )) + + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $d) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $d) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $d) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + ;; $a, $b, $c, $d each have one already from the globals. Add more so that + ;; $a has the least, and $e has the most + (drop (global.get $e)) + (drop (global.get $e)) + (drop (global.get $e)) + (drop (global.get $e)) + (drop (global.get $e)) + + (drop (global.get $d)) + (drop (global.get $d)) + (drop (global.get $d)) + + (drop (global.get $c)) + (drop (global.get $c)) + + (drop (global.get $b)) + ) +) + +;; As above, but add a direct dep from $d to $a: +;; +;; $c - $a +;; / / +;; $e / <-- this was added +;; \ / +;; $d - $b +;; +;; This forces $a to appear before $d: the order goes from before, which was +;; $b, $d, $a, $c, $e +;; to +;; $b, $a, $d, $c, $e +(module + ;; CHECK: (global $b i32 (i32.const 20)) + + ;; CHECK: (global $a i32 (i32.const 10)) + (global $a i32 (i32.const 10)) + + (global $b i32 (i32.const 20)) + + ;; CHECK: (global $d i32 (i32.add + ;; CHECK-NEXT: (global.get $b) + ;; CHECK-NEXT: (global.get $a) + ;; CHECK-NEXT: )) + + ;; CHECK: (global $c i32 (global.get $a)) + (global $c i32 (global.get $a)) + + (global $d i32 (i32.add + (global.get $b) + (global.get $a) ;; this was added + )) + + ;; CHECK: (global $e i32 (i32.add + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: (global.get $d) + ;; CHECK-NEXT: )) + (global $e i32 (i32.add + (global.get $c) + (global.get $d) + )) + + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $e) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $d) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $d) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $d) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $d) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + ;; $b, $c, $d each have one already from the globals, and $a has two. Add + ;; more so that $a has the least, and $e has the most. + (drop (global.get $e)) + (drop (global.get $e)) + (drop (global.get $e)) + (drop (global.get $e)) + (drop (global.get $e)) + (drop (global.get $e)) + + (drop (global.get $d)) + (drop (global.get $d)) + (drop (global.get $d)) + (drop (global.get $d)) + + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + + (drop (global.get $b)) + (drop (global.get $b)) + ) +) + +;; A situation where the simple greedy sort fails to be optimal. We have a +;; chain and one more independent global +;; +;; a <- b <- c +;; +;; other +;; +;; The candidates for the first global emitted are a and other, as they have no +;; dependencies, and other has a higher count so greedy sorting would pick it. +;; however, c has the highest count by far, so it is worth being less greedy and +;; doing a just in order to be able to do b and then c, and to emit other last. +;; In other words, the original order is best. +(module + ;; CHECK: (global $a i32 (i32.const 0)) + (global $a i32 (i32.const 0)) + ;; CHECK: (global $b i32 (global.get $a)) + (global $b i32 (global.get $a)) + ;; CHECK: (global $c i32 (global.get $b)) + (global $c i32 (global.get $b)) + + ;; CHECK: (global $other i32 (i32.const 1)) + (global $other i32 (i32.const 1)) + + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $other) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $other) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + ;; Ten uses for $c, far more than all the rest combined. + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + + ;; Two uses for other, which is more than $a's single use. + (drop (global.get $other)) + (drop (global.get $other)) + ) +) + +;; As above, but with the original order a little different. This is again a +;; case where the greedy sort is unoptimal (see above), but now also the +;; original sort is unoptimal as well, and instead we use the "sum" sort, which +;; counts the sum of the uses of a global and all the things it depends on and +;; uses that as the count for that global (which in effect means that we take +;; into consideration not only its own size but the entire size that it may +;; unlock, which happens to work well here). +;; +;; The only change in the input compared to the previous test is that $other +;; was moved up to between $b and $c. Sum sort works well here because the +;; first comparison is $a and $other, and sum takes into account $b and $c in +;; $a's favor, so it wins. Likewise $b and $c win against $other as well, so +;; the order is $a, $b, $c, $other which is optimal here. +(module + ;; CHECK: (global $a i32 (i32.const 0)) + (global $a i32 (i32.const 0)) + ;; CHECK: (global $b i32 (global.get $a)) + (global $b i32 (global.get $a)) + + ;; CHECK: (global $c i32 (global.get $b)) + + ;; CHECK: (global $other i32 (i32.const 1)) + (global $other i32 (i32.const 1)) + + (global $c i32 (global.get $b)) + + ;; CHECK: (func $uses (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $c) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $other) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (global.get $other) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $uses + ;; Ten uses for $c, far more than all the rest combined. + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + (drop (global.get $c)) + + ;; Two uses for other, which is more than $a's single use. + (drop (global.get $other)) + (drop (global.get $other)) + ) +) + |