|
3 | 3 |
|
4 | 4 | ;; RUN: foreach %s %t wasm-opt --duplicate-function-elimination --all-features -S -o - | filecheck %s
|
5 | 5 |
|
6 |
| -;; The functions here differ in branch hints, and should not be merged. |
| 6 | +;; Test that we merge functions even if they differ in branch hints. This is |
| 7 | +;; good for code size, and follows what LLVM does. |
| 8 | + |
| 9 | +;; The functions here differ in branch hints (but we still merge). |
7 | 10 | (module
|
8 | 11 | ;; CHECK: (type $0 (func (param i32)))
|
9 | 12 |
|
10 | 13 | ;; CHECK: (export "a" (func $a))
|
11 | 14 |
|
12 |
| - ;; CHECK: (export "b" (func $b)) |
| 15 | + ;; CHECK: (export "b" (func $a)) |
13 | 16 |
|
14 | 17 | ;; CHECK: (func $a (type $0) (param $x i32)
|
15 | 18 | ;; CHECK-NEXT: (@metadata.code.branch_hint "\00")
|
|
30 | 33 | )
|
31 | 34 | )
|
32 | 35 |
|
33 |
| - ;; CHECK: (func $b (type $0) (param $x i32) |
34 |
| - ;; CHECK-NEXT: (@metadata.code.branch_hint "\01") |
35 |
| - ;; CHECK-NEXT: (if |
36 |
| - ;; CHECK-NEXT: (local.get $x) |
37 |
| - ;; CHECK-NEXT: (then |
38 |
| - ;; CHECK-NEXT: (unreachable) |
39 |
| - ;; CHECK-NEXT: ) |
40 |
| - ;; CHECK-NEXT: ) |
41 |
| - ;; CHECK-NEXT: ) |
42 | 36 | (func $b (export "b") (param $x i32)
|
43 | 37 | (@metadata.code.branch_hint "\01")
|
44 | 38 | (if
|
|
50 | 44 | )
|
51 | 45 | )
|
52 | 46 |
|
53 |
| -;; These also differ, now one is missing a hint, and they should not be merged. |
54 |
| -;; TODO: Perhaps when optimizing for size, we should merge and drop the hint? |
| 47 | +;; These also differ, now one is missing a hint (but we still merge). |
55 | 48 | (module
|
56 | 49 | ;; CHECK: (type $0 (func (param i32)))
|
57 | 50 |
|
58 | 51 | ;; CHECK: (export "a" (func $a))
|
59 | 52 |
|
60 |
| - ;; CHECK: (export "b" (func $b)) |
| 53 | + ;; CHECK: (export "b" (func $a)) |
61 | 54 |
|
62 | 55 | ;; CHECK: (func $a (type $0) (param $x i32)
|
63 | 56 | ;; CHECK-NEXT: (@metadata.code.branch_hint "\00")
|
|
78 | 71 | )
|
79 | 72 | )
|
80 | 73 |
|
81 |
| - ;; CHECK: (func $b (type $0) (param $x i32) |
82 |
| - ;; CHECK-NEXT: (if |
83 |
| - ;; CHECK-NEXT: (local.get $x) |
84 |
| - ;; CHECK-NEXT: (then |
85 |
| - ;; CHECK-NEXT: (unreachable) |
86 |
| - ;; CHECK-NEXT: ) |
87 |
| - ;; CHECK-NEXT: ) |
88 |
| - ;; CHECK-NEXT: ) |
89 | 74 | (func $b (export "b") (param $x i32)
|
90 | 75 | (if
|
91 | 76 | (local.get $x)
|
|
97 | 82 | )
|
98 | 83 |
|
99 | 84 | ;; Flipped case of the above, now the other one is the only one with a hint,
|
100 |
| -;; and that hint is flipped. |
| 85 | +;; and that hint is flipped (but we still merge). |
101 | 86 | (module
|
102 | 87 | ;; CHECK: (type $0 (func (param i32)))
|
103 | 88 |
|
104 | 89 | ;; CHECK: (export "a" (func $a))
|
105 | 90 |
|
106 |
| - ;; CHECK: (export "b" (func $b)) |
| 91 | + ;; CHECK: (export "b" (func $a)) |
107 | 92 |
|
108 | 93 | ;; CHECK: (func $a (type $0) (param $x i32)
|
109 | 94 | ;; CHECK-NEXT: (if
|
|
122 | 107 | )
|
123 | 108 | )
|
124 | 109 |
|
125 |
| - ;; CHECK: (func $b (type $0) (param $x i32) |
126 |
| - ;; CHECK-NEXT: (@metadata.code.branch_hint "\01") |
127 |
| - ;; CHECK-NEXT: (if |
128 |
| - ;; CHECK-NEXT: (local.get $x) |
129 |
| - ;; CHECK-NEXT: (then |
130 |
| - ;; CHECK-NEXT: (unreachable) |
131 |
| - ;; CHECK-NEXT: ) |
132 |
| - ;; CHECK-NEXT: ) |
133 |
| - ;; CHECK-NEXT: ) |
134 | 110 | (func $b (export "b") (param $x i32)
|
135 | 111 | (@metadata.code.branch_hint "\01")
|
136 | 112 | (if
|
|
142 | 118 | )
|
143 | 119 | )
|
144 | 120 |
|
145 |
| -;; Identical branch hints: We can merge here. |
| 121 | +;; Identical branch hints: We can definitely merge here. |
146 | 122 | (module
|
147 | 123 | ;; CHECK: (type $0 (func (param i32)))
|
148 | 124 |
|
|
218 | 194 | )
|
219 | 195 | )
|
220 | 196 |
|
221 |
| -;; Source file location (debug info) does *not* prevent optimization. We |
222 |
| -;; prioritize optimization over debug info quality. |
| 197 | +;; Source file location (debug info) does not prevent optimization (and has |
| 198 | +;; even less reason to do so than branch hints, as we prioritize optimization |
| 199 | +;; over debug info quality). |
223 | 200 | (module
|
224 | 201 | ;; CHECK: (type $0 (func (param i32)))
|
225 | 202 |
|
|
0 commit comments