summaryrefslogtreecommitdiff
path: root/src/passes
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-05-30 12:08:17 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-06-02 16:06:56 -0700
commitc8a57dee5e9c99c51433f3d08da3edc2aadb0140 (patch)
tree14d4626467f0abb1952b64d3b92229a5090c607e /src/passes
parentb37bd96ea3345cf7015e9e925e0d33524cd1c3db (diff)
downloadbinaryen-c8a57dee5e9c99c51433f3d08da3edc2aadb0140.tar.gz
binaryen-c8a57dee5e9c99c51433f3d08da3edc2aadb0140.tar.bz2
binaryen-c8a57dee5e9c99c51433f3d08da3edc2aadb0140.zip
add an option to run passes on individual functions, and to get default optimization passes suitable for that, or not. refactor visitFunction/Module for this.
Diffstat (limited to 'src/passes')
-rw-r--r--src/passes/pass.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp
index ca9f477a3..e5bbf5866 100644
--- a/src/passes/pass.cpp
+++ b/src/passes/pass.cpp
@@ -74,6 +74,25 @@ void PassRunner::addDefaultOptimizationPasses() {
add("duplicate-function-elimination"); // optimizations show more functions as duplicate
}
+void PassRunner::addDefaultFunctionOptimizationPasses() {
+ add("dce");
+ add("remove-unused-brs");
+ add("remove-unused-names");
+ add("optimize-instructions");
+ add("simplify-locals");
+ add("vacuum"); // previous pass creates garbage
+ add("coalesce-locals");
+ add("vacuum"); // previous pass creates garbage
+ add("reorder-locals");
+ add("merge-blocks");
+ add("optimize-instructions");
+ add("vacuum"); // should not be needed, last few passes do not create garbage, but just to be safe
+}
+
+void PassRunner::addDefaultGlobalOptimizationPasses() {
+ add("duplicate-function-elimination");
+}
+
void PassRunner::run() {
std::chrono::high_resolution_clock::time_point beforeEverything;
size_t padding = 0;
@@ -108,6 +127,12 @@ void PassRunner::run() {
}
}
+void PassRunner::runFunction(Function* func) {
+ for (auto pass : passes) {
+ pass->runFunction(this, wasm, func);
+ }
+}
+
template<class P>
P* PassRunner::getLast() {
bool found = false;