summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/Directize.cpp19
-rw-r--r--test/passes/directize.txt24
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)
)
)