summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-08-23 15:05:40 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-09-07 09:55:07 -0700
commit323e32bc1ca73c92d81b7fe28fd54e62c2218801 (patch)
tree93d1394679d6eb2a2cb18b3621b2ea036f984336 /src
parente125ae76b29b84563892263663e66ff072852c99 (diff)
downloadbinaryen-323e32bc1ca73c92d81b7fe28fd54e62c2218801.tar.gz
binaryen-323e32bc1ca73c92d81b7fe28fd54e62c2218801.tar.bz2
binaryen-323e32bc1ca73c92d81b7fe28fd54e62c2218801.zip
autodrop must be run before we optimize in asm2wasm, as otherwise its input is not yet valid
then after finalizeCalls, we must autodrop again to drop things that finalizeCalls changed
Diffstat (limited to 'src')
-rw-r--r--src/asm2wasm.h7
-rw-r--r--src/passes/pass.cpp3
-rw-r--r--src/wasm-module-building.h6
3 files changed, 12 insertions, 4 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index 10d065400..7cc671597 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -523,7 +523,10 @@ void Asm2WasmBuilder::processAsm(Ref ast) {
for (unsigned i = 1; i < body->size(); i++) {
if (body[i][0] == DEFUN) numFunctions++;
}
- optimizingBuilder = make_unique<OptimizingIncrementalModuleBuilder>(&wasm, numFunctions);
+ optimizingBuilder = make_unique<OptimizingIncrementalModuleBuilder>(&wasm, numFunctions, [&](PassRunner& passRunner) {
+ // run autodrop first, before optimizations
+ passRunner.add<AutoDrop>();
+ });
}
// first pass - do almost everything, but function imports and indirect calls
@@ -786,7 +789,7 @@ void Asm2WasmBuilder::processAsm(Ref ast) {
};
PassRunner passRunner(&wasm);
passRunner.add<FinalizeCalls>(this);
- passRunner.add<AutoDrop>();
+ passRunner.add<AutoDrop>(); // FinalizeCalls may cause us to require additional drops
if (optimize) passRunner.add("vacuum"); // autodrop can add some garbage
passRunner.run();
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp
index 1e7e85ccb..437b023bc 100644
--- a/src/passes/pass.cpp
+++ b/src/passes/pass.cpp
@@ -209,6 +209,9 @@ void PassRunner::run() {
}
void PassRunner::runFunction(Function* func) {
+ if (debug) {
+ std::cerr << "[PassRunner] running passes on function " << func->name << std::endl;
+ }
for (auto* pass : passes) {
runPassOnFunction(pass, func);
}
diff --git a/src/wasm-module-building.h b/src/wasm-module-building.h
index ead074991..43cc493d1 100644
--- a/src/wasm-module-building.h
+++ b/src/wasm-module-building.h
@@ -73,6 +73,7 @@ static std::mutex debug;
class OptimizingIncrementalModuleBuilder {
Module* wasm;
uint32_t numFunctions;
+ std::function<void (PassRunner&)> addPrePasses;
Function* endMarker;
std::atomic<Function*>* list;
uint32_t nextFunction; // only used on main thread
@@ -86,8 +87,8 @@ class OptimizingIncrementalModuleBuilder {
public:
// numFunctions must be equal to the number of functions allocated, or higher. Knowing
// this bounds helps avoid locking.
- OptimizingIncrementalModuleBuilder(Module* wasm, Index numFunctions)
- : wasm(wasm), numFunctions(numFunctions), endMarker(nullptr), list(nullptr), nextFunction(0),
+ OptimizingIncrementalModuleBuilder(Module* wasm, Index numFunctions, std::function<void (PassRunner&)> addPrePasses)
+ : wasm(wasm), numFunctions(numFunctions), addPrePasses(addPrePasses), endMarker(nullptr), list(nullptr), nextFunction(0),
numWorkers(0), liveWorkers(0), activeWorkers(0), availableFuncs(0), finishedFuncs(0),
finishing(false) {
if (numFunctions == 0) {
@@ -201,6 +202,7 @@ private:
void optimizeFunction(Function* func) {
PassRunner passRunner(wasm);
+ addPrePasses(passRunner);
passRunner.addDefaultFunctionOptimizationPasses();
passRunner.runFunction(func);
}