summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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);
}