|
5 | 5 |
|
6 | 6 | ;; RUN: foreach %s %t wasm-opt -all --vacuum -S -o - | filecheck %s --check-prefix WITHOUT |
7 | 7 | ;; RUN: foreach %s %t wasm-opt -all --generate-global-effects --vacuum -S -o - | filecheck %s --check-prefix INCLUDE |
8 | | -;; RUN: foreach %s %t wasm-opt -all --generate-global-effects --discard-global-effects --vacuum -S -o - | filecheck %s --check-prefix DISCARD |
| 8 | +;; RUN: foreach %s %t wasm-opt -all --generate-global-effects --discard-global-effects --vacuum -S -o - | filecheck %s --check-prefix WITHOUT |
9 | 9 |
|
10 | 10 | (module |
11 | | - |
12 | 11 | ;; WITHOUT: (type $0 (func)) |
13 | 12 |
|
14 | 13 | ;; WITHOUT: (type $1 (func (result i32))) |
|
23 | 22 | ;; INCLUDE: (type $2 (func (param i32))) |
24 | 23 |
|
25 | 24 | ;; INCLUDE: (import "a" "b" (func $import (type $0))) |
26 | | - ;; DISCARD: (type $0 (func)) |
27 | | - |
28 | | - ;; DISCARD: (type $1 (func (result i32))) |
29 | | - |
30 | | - ;; DISCARD: (type $2 (func (param i32))) |
31 | | - |
32 | | - ;; DISCARD: (import "a" "b" (func $import (type $0))) |
33 | 25 | (import "a" "b" (func $import)) |
34 | 26 |
|
35 | 27 | ;; WITHOUT: (tag $tag) |
36 | 28 | ;; INCLUDE: (tag $tag) |
37 | | - ;; DISCARD: (tag $tag) |
38 | 29 | (tag $tag) |
39 | 30 |
|
40 | 31 | ;; WITHOUT: (func $main (type $0) |
|
54 | 45 | ;; INCLUDE-NEXT: (call $throw) |
55 | 46 | ;; INCLUDE-NEXT: (call $throw-and-import) |
56 | 47 | ;; INCLUDE-NEXT: ) |
57 | | - ;; DISCARD: (func $main (type $0) |
58 | | - ;; DISCARD-NEXT: (call $nop) |
59 | | - ;; DISCARD-NEXT: (call $unreachable) |
60 | | - ;; DISCARD-NEXT: (call $call-nop) |
61 | | - ;; DISCARD-NEXT: (call $call-unreachable) |
62 | | - ;; DISCARD-NEXT: (drop |
63 | | - ;; DISCARD-NEXT: (call $unimportant-effects) |
64 | | - ;; DISCARD-NEXT: ) |
65 | | - ;; DISCARD-NEXT: (call $throw) |
66 | | - ;; DISCARD-NEXT: (call $throw-and-import) |
67 | | - ;; DISCARD-NEXT: ) |
68 | 48 | (func $main |
69 | 49 | ;; Calling a function with no effects can be optimized away in INCLUDE (but |
70 | 50 | ;; not WITHOUT or DISCARD, where the global effect info is not available). |
|
93 | 73 | ;; INCLUDE: (func $cycle (type $0) |
94 | 74 | ;; INCLUDE-NEXT: (call $cycle) |
95 | 75 | ;; INCLUDE-NEXT: ) |
96 | | - ;; DISCARD: (func $cycle (type $0) |
97 | | - ;; DISCARD-NEXT: (call $cycle) |
98 | | - ;; DISCARD-NEXT: ) |
99 | 76 | (func $cycle |
100 | 77 | ;; Calling a function with no effects in a cycle cannot be optimized out - |
101 | 78 | ;; this must keep hanging forever. |
|
108 | 85 | ;; INCLUDE: (func $cycle-1 (type $0) |
109 | 86 | ;; INCLUDE-NEXT: (call $cycle-2) |
110 | 87 | ;; INCLUDE-NEXT: ) |
111 | | - ;; DISCARD: (func $cycle-1 (type $0) |
112 | | - ;; DISCARD-NEXT: (call $cycle-2) |
113 | | - ;; DISCARD-NEXT: ) |
114 | 88 | (func $cycle-1 |
115 | 89 | ;; $cycle-1 and -2 form a cycle together, in which no call can be removed. |
116 | 90 | (call $cycle-2) |
|
122 | 96 | ;; INCLUDE: (func $cycle-2 (type $0) |
123 | 97 | ;; INCLUDE-NEXT: (call $cycle-1) |
124 | 98 | ;; INCLUDE-NEXT: ) |
125 | | - ;; DISCARD: (func $cycle-2 (type $0) |
126 | | - ;; DISCARD-NEXT: (call $cycle-1) |
127 | | - ;; DISCARD-NEXT: ) |
128 | 99 | (func $cycle-2 |
129 | 100 | (call $cycle-1) |
130 | 101 | ) |
|
135 | 106 | ;; INCLUDE: (func $nop (type $0) |
136 | 107 | ;; INCLUDE-NEXT: (nop) |
137 | 108 | ;; INCLUDE-NEXT: ) |
138 | | - ;; DISCARD: (func $nop (type $0) |
139 | | - ;; DISCARD-NEXT: (nop) |
140 | | - ;; DISCARD-NEXT: ) |
141 | 109 | (func $nop |
142 | 110 | (nop) |
143 | 111 | ) |
|
148 | 116 | ;; INCLUDE: (func $unreachable (type $0) |
149 | 117 | ;; INCLUDE-NEXT: (unreachable) |
150 | 118 | ;; INCLUDE-NEXT: ) |
151 | | - ;; DISCARD: (func $unreachable (type $0) |
152 | | - ;; DISCARD-NEXT: (unreachable) |
153 | | - ;; DISCARD-NEXT: ) |
154 | 119 | (func $unreachable |
155 | 120 | (unreachable) |
156 | 121 | ) |
|
161 | 126 | ;; INCLUDE: (func $call-nop (type $0) |
162 | 127 | ;; INCLUDE-NEXT: (nop) |
163 | 128 | ;; INCLUDE-NEXT: ) |
164 | | - ;; DISCARD: (func $call-nop (type $0) |
165 | | - ;; DISCARD-NEXT: (call $nop) |
166 | | - ;; DISCARD-NEXT: ) |
167 | 129 | (func $call-nop |
168 | 130 | ;; This call to a nop can be optimized out, as above, in INCLUDE. |
169 | 131 | (call $nop) |
|
175 | 137 | ;; INCLUDE: (func $call-unreachable (type $0) |
176 | 138 | ;; INCLUDE-NEXT: (call $unreachable) |
177 | 139 | ;; INCLUDE-NEXT: ) |
178 | | - ;; DISCARD: (func $call-unreachable (type $0) |
179 | | - ;; DISCARD-NEXT: (call $unreachable) |
180 | | - ;; DISCARD-NEXT: ) |
181 | 140 | (func $call-unreachable |
182 | 141 | (call $unreachable) |
183 | 142 | ) |
|
200 | 159 | ;; INCLUDE-NEXT: (local.get $x) |
201 | 160 | ;; INCLUDE-NEXT: ) |
202 | 161 | ;; INCLUDE-NEXT: ) |
203 | | - ;; DISCARD: (func $unimportant-effects (type $1) (result i32) |
204 | | - ;; DISCARD-NEXT: (local $x i32) |
205 | | - ;; DISCARD-NEXT: (local.set $x |
206 | | - ;; DISCARD-NEXT: (i32.const 100) |
207 | | - ;; DISCARD-NEXT: ) |
208 | | - ;; DISCARD-NEXT: (return |
209 | | - ;; DISCARD-NEXT: (local.get $x) |
210 | | - ;; DISCARD-NEXT: ) |
211 | | - ;; DISCARD-NEXT: ) |
212 | 162 | (func $unimportant-effects (result i32) |
213 | 163 | (local $x i32) |
214 | 164 | ;; Operations on locals should not prevent optimization, as when we return |
|
250 | 200 | ;; INCLUDE-NEXT: ) |
251 | 201 | ;; INCLUDE-NEXT: ) |
252 | 202 | ;; INCLUDE-NEXT: ) |
253 | | - ;; DISCARD: (func $call-throw-and-catch (type $0) |
254 | | - ;; DISCARD-NEXT: (try $try |
255 | | - ;; DISCARD-NEXT: (do |
256 | | - ;; DISCARD-NEXT: (call $throw) |
257 | | - ;; DISCARD-NEXT: ) |
258 | | - ;; DISCARD-NEXT: (catch_all |
259 | | - ;; DISCARD-NEXT: (nop) |
260 | | - ;; DISCARD-NEXT: ) |
261 | | - ;; DISCARD-NEXT: ) |
262 | | - ;; DISCARD-NEXT: (try $try0 |
263 | | - ;; DISCARD-NEXT: (do |
264 | | - ;; DISCARD-NEXT: (call $throw-and-import) |
265 | | - ;; DISCARD-NEXT: ) |
266 | | - ;; DISCARD-NEXT: (catch_all |
267 | | - ;; DISCARD-NEXT: (nop) |
268 | | - ;; DISCARD-NEXT: ) |
269 | | - ;; DISCARD-NEXT: ) |
270 | | - ;; DISCARD-NEXT: ) |
271 | 203 | (func $call-throw-and-catch |
272 | 204 | (try |
273 | 205 | (do |
|
300 | 232 | ;; INCLUDE: (func $call-unreachable-and-catch (type $0) |
301 | 233 | ;; INCLUDE-NEXT: (call $unreachable) |
302 | 234 | ;; INCLUDE-NEXT: ) |
303 | | - ;; DISCARD: (func $call-unreachable-and-catch (type $0) |
304 | | - ;; DISCARD-NEXT: (try $try |
305 | | - ;; DISCARD-NEXT: (do |
306 | | - ;; DISCARD-NEXT: (call $unreachable) |
307 | | - ;; DISCARD-NEXT: ) |
308 | | - ;; DISCARD-NEXT: (catch_all |
309 | | - ;; DISCARD-NEXT: (nop) |
310 | | - ;; DISCARD-NEXT: ) |
311 | | - ;; DISCARD-NEXT: ) |
312 | | - ;; DISCARD-NEXT: ) |
313 | 235 | (func $call-unreachable-and-catch |
314 | 236 | (try |
315 | 237 | (do |
|
358 | 280 | ;; INCLUDE-NEXT: ) |
359 | 281 | ;; INCLUDE-NEXT: ) |
360 | 282 | ;; INCLUDE-NEXT: ) |
361 | | - ;; DISCARD: (func $call-throw-or-unreachable-and-catch (type $2) (param $x i32) |
362 | | - ;; DISCARD-NEXT: (try $try |
363 | | - ;; DISCARD-NEXT: (do |
364 | | - ;; DISCARD-NEXT: (if |
365 | | - ;; DISCARD-NEXT: (local.get $x) |
366 | | - ;; DISCARD-NEXT: (then |
367 | | - ;; DISCARD-NEXT: (call $throw) |
368 | | - ;; DISCARD-NEXT: ) |
369 | | - ;; DISCARD-NEXT: (else |
370 | | - ;; DISCARD-NEXT: (call $unreachable) |
371 | | - ;; DISCARD-NEXT: ) |
372 | | - ;; DISCARD-NEXT: ) |
373 | | - ;; DISCARD-NEXT: ) |
374 | | - ;; DISCARD-NEXT: (catch_all |
375 | | - ;; DISCARD-NEXT: (nop) |
376 | | - ;; DISCARD-NEXT: ) |
377 | | - ;; DISCARD-NEXT: ) |
378 | | - ;; DISCARD-NEXT: ) |
379 | 283 | (func $call-throw-or-unreachable-and-catch (param $x i32) |
380 | 284 | ;; This try-catch-all's body will either call a throw or an unreachable. |
381 | 285 | ;; Since we have both possible effects, we cannot optimize anything here. |
|
401 | 305 | ;; INCLUDE: (func $throw (type $0) |
402 | 306 | ;; INCLUDE-NEXT: (throw $tag) |
403 | 307 | ;; INCLUDE-NEXT: ) |
404 | | - ;; DISCARD: (func $throw (type $0) |
405 | | - ;; DISCARD-NEXT: (throw $tag) |
406 | | - ;; DISCARD-NEXT: ) |
407 | 308 | (func $throw |
408 | 309 | (throw $tag) |
409 | 310 | ) |
|
414 | 315 | ;; INCLUDE: (func $throw-and-import (type $0) |
415 | 316 | ;; INCLUDE-NEXT: (throw $tag) |
416 | 317 | ;; INCLUDE-NEXT: ) |
417 | | - ;; DISCARD: (func $throw-and-import (type $0) |
418 | | - ;; DISCARD-NEXT: (throw $tag) |
419 | | - ;; DISCARD-NEXT: ) |
420 | 318 | (func $throw-and-import |
421 | 319 | (if |
422 | 320 | (i32.const 1) |
|
437 | 335 | ;; INCLUDE-NEXT: (call $cycle-with-unknown-call) |
438 | 336 | ;; INCLUDE-NEXT: (call $import) |
439 | 337 | ;; INCLUDE-NEXT: ) |
440 | | - ;; DISCARD: (func $cycle-with-unknown-call (type $0) |
441 | | - ;; DISCARD-NEXT: (call $cycle-with-unknown-call) |
442 | | - ;; DISCARD-NEXT: (call $import) |
443 | | - ;; DISCARD-NEXT: ) |
444 | 338 | (func $cycle-with-unknown-call |
445 | 339 | ;; This function can not only call itself recursively, but also calls an |
446 | 340 | ;; import. We should not remove anything here, and not error during the |
|
0 commit comments