summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérôme Vouillon <jerome.vouillon@gmail.com>2024-07-17 11:30:07 -0400
committerGitHub <noreply@github.com>2024-07-17 08:30:07 -0700
commit994d8d31381dbc9dbaa89809c75b2c8d804e0d7f (patch)
tree01bc83b44773f16bdfce8bceb5977da9f153a483
parent6d2bef3ff80bb96455207852d506c5bf12a6a851 (diff)
downloadbinaryen-994d8d31381dbc9dbaa89809c75b2c8d804e0d7f.tar.gz
binaryen-994d8d31381dbc9dbaa89809c75b2c8d804e0d7f.tar.bz2
binaryen-994d8d31381dbc9dbaa89809c75b2c8d804e0d7f.zip
Make it possible to skip several passes (#6714)
--skip-pass can now be specified more than once on the commandline.
-rw-r--r--src/tools/optimization-options.h2
-rw-r--r--test/lit/passes/O1_skip_passes.wast65
2 files changed, 66 insertions, 1 deletions
diff --git a/src/tools/optimization-options.h b/src/tools/optimization-options.h
index f04b73211..333380d04 100644
--- a/src/tools/optimization-options.h
+++ b/src/tools/optimization-options.h
@@ -311,7 +311,7 @@ struct OptimizationOptions : public ToolOptions {
"-sp",
"Skip a pass (do not run it)",
OptimizationOptionsCategory,
- Options::Arguments::One,
+ Options::Arguments::N,
[this](Options*, const std::string& pass) {
passOptions.passesToSkip.insert(pass);
});
diff --git a/test/lit/passes/O1_skip_passes.wast b/test/lit/passes/O1_skip_passes.wast
new file mode 100644
index 000000000..7e84306e7
--- /dev/null
+++ b/test/lit/passes/O1_skip_passes.wast
@@ -0,0 +1,65 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
+
+;; RUN: foreach %s %t wasm-opt -O2 --skip-pass=coalesce-locals --skip-pass=simplify-locals --skip-pass=simplify-locals-nostructure -S -o - 2>&1 | filecheck %s
+
+;; Check that we can skip several passes. Note that no local.tee is introduced.
+
+(module
+ ;; CHECK: (import "a" "b" (func $log (param i32 i32)))
+ (import "a" "b" (func $log (param i32 i32)))
+
+ ;; CHECK: (func $foo (param $p i32)
+ ;; CHECK-NEXT: (local $x i32)
+ ;; CHECK-NEXT: (local $y i32)
+ ;; CHECK-NEXT: (local.set $x
+ ;; CHECK-NEXT: (i32.add
+ ;; CHECK-NEXT: (local.get $p)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $log
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $y
+ ;; CHECK-NEXT: (i32.add
+ ;; CHECK-NEXT: (local.get $p)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $log
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $foo (export "foo") (param $p i32)
+ ;; The locals $x and $y can be coalesced into a single local, but as
+ ;; we do not run that pass, they will not be. They could be
+ ;; initialized using a tee but the passes that introduce tees are
+ ;; not run either.
+ (local $x i32)
+ (local $y i32)
+
+ (local.set $x
+ (i32.add
+ (local.get $p)
+ (i32.const 1)
+ )
+ )
+ (call $log
+ (local.get $x)
+ (local.get $x)
+ )
+
+ (local.set $y
+ (i32.add
+ (local.get $p)
+ (i32.const 1)
+ )
+ )
+ (call $log
+ (local.get $y)
+ (local.get $y)
+ )
+ )
+)