summaryrefslogtreecommitdiff
path: root/test/lit
diff options
context:
space:
mode:
Diffstat (limited to 'test/lit')
-rw-r--r--test/lit/merge/names.wat12
-rw-r--r--test/lit/merge/renamings.wat11
-rw-r--r--test/lit/passes/j2cl.wast25
-rw-r--r--test/lit/passes/reorder-globals-real.wast894
-rw-r--r--test/lit/passes/reorder-globals.wast547
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))
+ )
+)
+