diff options
-rw-r--r-- | src/passes/Directize.cpp | 19 | ||||
-rw-r--r-- | test/passes/directize.txt | 24 |
2 files changed, 38 insertions, 5 deletions
diff --git a/src/passes/Directize.cpp b/src/passes/Directize.cpp index d9400cce7..b2d132c5e 100644 --- a/src/passes/Directize.cpp +++ b/src/passes/Directize.cpp @@ -72,18 +72,18 @@ struct FunctionDirectizer : public WalkerPass<PostWalker<FunctionDirectizer>> { // reorder/replace traps when optimizing (but never to // remove them, at least not by default). if (index >= flatTable->names.size()) { - replaceWithUnreachable(); + replaceWithUnreachable(curr); return; } auto name = flatTable->names[index]; if (!name.is()) { - replaceWithUnreachable(); + replaceWithUnreachable(curr); return; } auto* func = getModule()->getFunction(name); if (getSig(getModule()->getFunctionType(curr->fullType)) != getSig(func)) { - replaceWithUnreachable(); + replaceWithUnreachable(curr); return; } // Everything looks good! @@ -98,8 +98,17 @@ struct FunctionDirectizer : public WalkerPass<PostWalker<FunctionDirectizer>> { private: FlatTable* flatTable; - void replaceWithUnreachable() { - replaceCurrent(Builder(*getModule()).makeUnreachable()); + void replaceWithUnreachable(CallIndirect* call) { + Builder builder(*getModule()); + for (auto*& operand : call->operands) { + operand = builder.makeDrop(operand); + } + replaceCurrent( + builder.makeSequence( + builder.makeBlock(call->operands), + builder.makeUnreachable() + ) + ); } }; diff --git a/test/passes/directize.txt b/test/passes/directize.txt index 6e0644c01..7f4b1a57c 100644 --- a/test/passes/directize.txt +++ b/test/passes/directize.txt @@ -125,6 +125,14 @@ (unreachable) ) (func $bar (; 1 ;) (type $ii) (param $x i32) (param $y i32) + (block + (drop + (local.get $x) + ) + (drop + (local.get $y) + ) + ) (unreachable) ) ) @@ -136,6 +144,14 @@ (unreachable) ) (func $bar (; 1 ;) (type $ii) (param $x i32) (param $y i32) + (block + (drop + (local.get $x) + ) + (drop + (local.get $y) + ) + ) (unreachable) ) ) @@ -148,6 +164,14 @@ (unreachable) ) (func $bar (; 1 ;) (type $ii) (param $x i32) (param $y i32) + (block + (drop + (local.get $x) + ) + (drop + (local.get $y) + ) + ) (unreachable) ) ) |