diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-08-23 15:05:40 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-09-07 09:55:07 -0700 |
commit | 323e32bc1ca73c92d81b7fe28fd54e62c2218801 (patch) | |
tree | 93d1394679d6eb2a2cb18b3621b2ea036f984336 /src | |
parent | e125ae76b29b84563892263663e66ff072852c99 (diff) | |
download | binaryen-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.h | 7 | ||||
-rw-r--r-- | src/passes/pass.cpp | 3 | ||||
-rw-r--r-- | src/wasm-module-building.h | 6 |
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); } |