summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/asm2wasm.h3
-rw-r--r--src/wasm-module-building.h13
-rw-r--r--src/wasm-traversal.h9
3 files changed, 16 insertions, 9 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index b411dba52..5bdb2a9bf 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -654,8 +654,7 @@ 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, [&](PassRunner& passRunner) {
- passRunner.options = passOptions;
+ optimizingBuilder = make_unique<OptimizingIncrementalModuleBuilder>(&wasm, numFunctions, passOptions, [&](PassRunner& passRunner) {
if (debug) {
passRunner.setDebug(true);
passRunner.setValidateGlobally(false);
diff --git a/src/wasm-module-building.h b/src/wasm-module-building.h
index 56d41ecb8..4123a59c0 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;
+ PassOptions passOptions;
std::function<void (PassRunner&)> addPrePasses;
Function* endMarker;
std::atomic<Function*>* list;
@@ -89,8 +90,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, std::function<void (PassRunner&)> addPrePasses, bool debug, bool validateGlobally)
- : wasm(wasm), numFunctions(numFunctions), addPrePasses(addPrePasses), endMarker(nullptr), list(nullptr), nextFunction(0),
+ OptimizingIncrementalModuleBuilder(Module* wasm, Index numFunctions, PassOptions passOptions, std::function<void (PassRunner&)> addPrePasses, bool debug, bool validateGlobally)
+ : wasm(wasm), numFunctions(numFunctions), passOptions(passOptions), addPrePasses(addPrePasses), endMarker(nullptr), list(nullptr), nextFunction(0),
numWorkers(0), liveWorkers(0), activeWorkers(0), availableFuncs(0), finishedFuncs(0),
finishing(false), debug(debug), validateGlobally(validateGlobally) {
if (numFunctions == 0 || debug) {
@@ -101,7 +102,7 @@ public:
// Before parallelism, create all passes on the main thread here, to ensure
// prepareToRun() is called for each pass before we start to optimize functions.
{
- PassRunner passRunner(wasm);
+ PassRunner passRunner(wasm, passOptions);
addPrePasses(passRunner);
passRunner.addDefaultFunctionOptimizationPasses();
}
@@ -151,7 +152,7 @@ public:
if (debug) {
// in debug mode, optimize each function now that we are done adding functions,
// then optimize globally
- PassRunner passRunner(wasm);
+ PassRunner passRunner(wasm, passOptions);
passRunner.setDebug(true);
passRunner.setValidateGlobally(validateGlobally);
addPrePasses(passRunner);
@@ -216,7 +217,7 @@ private:
}
void optimizeGlobally() {
- PassRunner passRunner(wasm);
+ PassRunner passRunner(wasm, passOptions);
passRunner.addDefaultGlobalOptimizationPasses();
passRunner.run();
}
@@ -224,7 +225,7 @@ private:
// worker code
void optimizeFunction(Function* func) {
- PassRunner passRunner(wasm);
+ PassRunner passRunner(wasm, passOptions);
addPrePasses(passRunner);
passRunner.addDefaultFunctionOptimizationPasses();
passRunner.runFunction(func);
diff --git a/src/wasm-traversal.h b/src/wasm-traversal.h
index 47b9d26e8..620ff0161 100644
--- a/src/wasm-traversal.h
+++ b/src/wasm-traversal.h
@@ -581,7 +581,9 @@ struct LinearExecutionWalker : public PostWalker<SubType, VisitorType> {
case Expression::Id::InvalidId: abort();
case Expression::Id::BlockId: {
self->pushTask(SubType::doVisitBlock, currp);
- self->pushTask(SubType::doNoteNonLinear, currp);
+ if (curr->cast<Block>()->name.is()) {
+ self->pushTask(SubType::doNoteNonLinear, currp);
+ }
auto& list = curr->cast<Block>()->list;
for (int i = int(list.size()) - 1; i >= 0; i--) {
self->pushTask(SubType::scan, &list[i]);
@@ -624,6 +626,11 @@ struct LinearExecutionWalker : public PostWalker<SubType, VisitorType> {
self->maybePushTask(SubType::scan, &curr->cast<Return>()->value);
break;
}
+ case Expression::Id::UnreachableId: {
+ self->pushTask(SubType::doVisitUnreachable, currp);
+ self->pushTask(SubType::doNoteNonLinear, currp);
+ break;
+ }
default: {
// other node types do not have control flow, use regular post-order
PostWalker<SubType, VisitorType>::scan(self, currp);