diff options
-rw-r--r-- | src/asm2wasm.h | 7 | ||||
-rw-r--r-- | src/passes/pass.cpp | 3 | ||||
-rw-r--r-- | src/wasm-module-building.h | 6 | ||||
-rw-r--r-- | test/emcc_hello_world.fromasm | 76 | ||||
-rw-r--r-- | test/emcc_hello_world.fromasm.imprecise | 76 | ||||
-rw-r--r-- | test/unit.fromasm | 13 | ||||
-rw-r--r-- | test/unit.fromasm.imprecise | 13 |
7 files changed, 114 insertions, 80 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); } diff --git a/test/emcc_hello_world.fromasm b/test/emcc_hello_world.fromasm index c0b245dd9..ab579533e 100644 --- a/test/emcc_hello_world.fromasm +++ b/test/emcc_hello_world.fromasm @@ -2729,21 +2729,23 @@ ) ) ) - (call_indirect $FUNCSIG$iiii - (get_local $0) - (i32.sub - (get_local $1) - (get_local $2) - ) - (i32.const 1) - (i32.add - (i32.and - (i32.load offset=40 - (get_local $0) + (drop + (call_indirect $FUNCSIG$iiii + (get_local $0) + (i32.sub + (get_local $1) + (get_local $2) + ) + (i32.const 1) + (i32.add + (i32.and + (i32.load offset=40 + (get_local $0) + ) + (i32.const 7) ) - (i32.const 7) + (i32.const 2) ) - (i32.const 2) ) ) ) @@ -7119,13 +7121,15 @@ ) (i32.const 0) ) - (call $___fwritex - (get_local $5) - (i32.sub - (get_local $75) + (drop + (call $___fwritex (get_local $5) + (i32.sub + (get_local $75) + (get_local $5) + ) + (get_local $0) ) - (get_local $0) ) ) (if @@ -7234,17 +7238,19 @@ ) (i32.const 0) ) - (call $___fwritex - (get_local $1) - (select - (i32.const 9) - (get_local $15) - (i32.gt_s - (get_local $15) + (drop + (call $___fwritex + (get_local $1) + (select (i32.const 9) + (get_local $15) + (i32.gt_s + (get_local $15) + (i32.const 9) + ) ) + (get_local $0) ) - (get_local $0) ) ) (set_local $1 @@ -7461,17 +7467,19 @@ ) (i32.const 0) ) - (call $___fwritex - (get_local $1) - (select - (get_local $8) - (get_local $15) - (i32.gt_s - (get_local $15) + (drop + (call $___fwritex + (get_local $1) + (select (get_local $8) + (get_local $15) + (i32.gt_s + (get_local $15) + (get_local $8) + ) ) + (get_local $0) ) - (get_local $0) ) ) (if diff --git a/test/emcc_hello_world.fromasm.imprecise b/test/emcc_hello_world.fromasm.imprecise index 07ee8d33f..32e34c0e9 100644 --- a/test/emcc_hello_world.fromasm.imprecise +++ b/test/emcc_hello_world.fromasm.imprecise @@ -2723,21 +2723,23 @@ ) ) ) - (call_indirect $FUNCSIG$iiii - (get_local $0) - (i32.sub - (get_local $1) - (get_local $2) - ) - (i32.const 1) - (i32.add - (i32.and - (i32.load offset=40 - (get_local $0) + (drop + (call_indirect $FUNCSIG$iiii + (get_local $0) + (i32.sub + (get_local $1) + (get_local $2) + ) + (i32.const 1) + (i32.add + (i32.and + (i32.load offset=40 + (get_local $0) + ) + (i32.const 7) ) - (i32.const 7) + (i32.const 2) ) - (i32.const 2) ) ) ) @@ -7113,13 +7115,15 @@ ) (i32.const 0) ) - (call $___fwritex - (get_local $5) - (i32.sub - (get_local $75) + (drop + (call $___fwritex (get_local $5) + (i32.sub + (get_local $75) + (get_local $5) + ) + (get_local $0) ) - (get_local $0) ) ) (if @@ -7228,17 +7232,19 @@ ) (i32.const 0) ) - (call $___fwritex - (get_local $1) - (select - (i32.const 9) - (get_local $15) - (i32.gt_s - (get_local $15) + (drop + (call $___fwritex + (get_local $1) + (select (i32.const 9) + (get_local $15) + (i32.gt_s + (get_local $15) + (i32.const 9) + ) ) + (get_local $0) ) - (get_local $0) ) ) (set_local $1 @@ -7455,17 +7461,19 @@ ) (i32.const 0) ) - (call $___fwritex - (get_local $1) - (select - (get_local $8) - (get_local $15) - (i32.gt_s - (get_local $15) + (drop + (call $___fwritex + (get_local $1) + (select (get_local $8) + (get_local $15) + (i32.gt_s + (get_local $15) + (get_local $8) + ) ) + (get_local $0) ) - (get_local $0) ) ) (if diff --git a/test/unit.fromasm b/test/unit.fromasm index bc5281ed5..f48dfcdb2 100644 --- a/test/unit.fromasm +++ b/test/unit.fromasm @@ -491,10 +491,15 @@ ) ) (func $smallIf - (if - (i32.const 2) - (call $lb - (i32.const 3) + (block $do-once$0 + (drop + (if + (i32.const 2) + (call $lb + (i32.const 3) + ) + (br $do-once$0) + ) ) ) ) diff --git a/test/unit.fromasm.imprecise b/test/unit.fromasm.imprecise index 945d6cc8e..06ab40915 100644 --- a/test/unit.fromasm.imprecise +++ b/test/unit.fromasm.imprecise @@ -473,10 +473,15 @@ ) ) (func $smallIf - (if - (i32.const 2) - (call $lb - (i32.const 3) + (block $do-once$0 + (drop + (if + (i32.const 2) + (call $lb + (i32.const 3) + ) + (br $do-once$0) + ) ) ) ) |