summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/pass.cpp6
-rw-r--r--src/tools/optimization-options.h13
-rw-r--r--src/tools/wasm-reduce.cpp1
-rw-r--r--test/passes/O4.txt11
-rw-r--r--test/passes/O4.wast25
5 files changed, 53 insertions, 3 deletions
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp
index 2f917d779..c0354524d 100644
--- a/src/passes/pass.cpp
+++ b/src/passes/pass.cpp
@@ -132,6 +132,12 @@ void PassRunner::addDefaultOptimizationPasses() {
}
void PassRunner::addDefaultFunctionOptimizationPasses() {
+ // if we are willing to work very very hard, flatten the IR and do opts
+ // that depend on flat IR
+ if (options.optimizeLevel >= 4) {
+ add("flatten");
+ add("local-cse");
+ }
if (!options.debugInfo) { // debug info must be preserved, do not dce it
add("dce");
}
diff --git a/src/tools/optimization-options.h b/src/tools/optimization-options.h
index 9fbba88cb..abe3bcd6d 100644
--- a/src/tools/optimization-options.h
+++ b/src/tools/optimization-options.h
@@ -42,27 +42,34 @@ struct OptimizationOptions : public Options {
passOptions.optimizeLevel = 0;
passOptions.shrinkLevel = 0;
})
- .add("", "-O1", "execute -O1 optimization passes",
+ .add("", "-O1", "execute -O1 optimization passes (quick&useful opts, useful for iteration builds)",
Options::Arguments::Zero,
[this](Options*, const std::string&) {
passOptions.optimizeLevel = 1;
passOptions.shrinkLevel = 0;
passes.push_back(DEFAULT_OPT_PASSES);
})
- .add("", "-O2", "execute -O2 optimization passes",
+ .add("", "-O2", "execute -O2 optimization passes (most opts, generally gets most perf)",
Options::Arguments::Zero,
[this](Options*, const std::string&) {
passOptions.optimizeLevel = 2;
passOptions.shrinkLevel = 0;
passes.push_back(DEFAULT_OPT_PASSES);
})
- .add("", "-O3", "execute -O3 optimization passes",
+ .add("", "-O3", "execute -O3 optimization passes (spends potentially a lot of time optimizing)",
Options::Arguments::Zero,
[this](Options*, const std::string&) {
passOptions.optimizeLevel = 3;
passOptions.shrinkLevel = 0;
passes.push_back(DEFAULT_OPT_PASSES);
})
+ .add("", "-O4", "execute -O4 optimization passes (also flatten the IR, which can take a lot more time and memory, but is useful on more nested / complex / less-optimized input)",
+ Options::Arguments::Zero,
+ [this](Options*, const std::string&) {
+ passOptions.optimizeLevel = 4;
+ passOptions.shrinkLevel = 0;
+ passes.push_back(DEFAULT_OPT_PASSES);
+ })
.add("", "-Os", "execute default optimization passes, focusing on code size",
Options::Arguments::Zero,
[this](Options*, const std::string&) {
diff --git a/src/tools/wasm-reduce.cpp b/src/tools/wasm-reduce.cpp
index 6b19e6216..f31c11edd 100644
--- a/src/tools/wasm-reduce.cpp
+++ b/src/tools/wasm-reduce.cpp
@@ -236,6 +236,7 @@ struct Reducer : public WalkerPass<PostWalker<Reducer, UnifiedExpressionVisitor<
"-O1",
"-O2",
"-O3",
+ "-O4",
"--flatten -Os",
"--flatten -O3",
"--flatten --local-cse -Os",
diff --git a/test/passes/O4.txt b/test/passes/O4.txt
new file mode 100644
index 000000000..1939a740e
--- /dev/null
+++ b/test/passes/O4.txt
@@ -0,0 +1,11 @@
+(module
+ (type $0 (func))
+ (global $global$0 (mut i32) (i32.const 10))
+ (export "func_59_invoker" (func $0))
+ (func $0 (; 0 ;) (type $0)
+ (set_global $global$0
+ (i32.const 0)
+ )
+ (unreachable)
+ )
+)
diff --git a/test/passes/O4.wast b/test/passes/O4.wast
new file mode 100644
index 000000000..aa9795bec
--- /dev/null
+++ b/test/passes/O4.wast
@@ -0,0 +1,25 @@
+(module
+ (type $0 (func))
+ (global $global$0 (mut i32) (i32.const 10))
+ (export "func_59_invoker" (func $0))
+ (func $0 (; 0 ;) (type $0)
+ (if
+ (block $label$1 (result i32)
+ (set_global $global$0
+ (i32.const 0)
+ )
+ (i32.const 127)
+ )
+ (unreachable)
+ )
+ (set_global $global$0
+ (i32.const -1)
+ )
+ (if
+ (get_global $global$0)
+ (unreachable)
+ )
+ (unreachable)
+ )
+)
+