summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/asm2wasm.h7
-rw-r--r--src/passes/pass.cpp3
-rw-r--r--src/wasm-module-building.h6
-rw-r--r--test/emcc_hello_world.fromasm76
-rw-r--r--test/emcc_hello_world.fromasm.imprecise76
-rw-r--r--test/unit.fromasm13
-rw-r--r--test/unit.fromasm.imprecise13
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)
+ )
)
)
)