summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/I64ToI32Lowering.cpp3
-rw-r--r--src/wasm/wasm-validator.cpp12
-rw-r--r--test/passes/flatten_i64-to-i32-lowering.txt21
-rw-r--r--test/passes/flatten_i64-to-i32-lowering.wast13
4 files changed, 42 insertions, 7 deletions
diff --git a/src/passes/I64ToI32Lowering.cpp b/src/passes/I64ToI32Lowering.cpp
index a0381ccd4..c06176e53 100644
--- a/src/passes/I64ToI32Lowering.cpp
+++ b/src/passes/I64ToI32Lowering.cpp
@@ -219,6 +219,9 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> {
// returns nullptr;
template<typename T>
T* visitGenericCall(T* curr, BuilderFunc<T> callBuilder) {
+ if (handleUnreachable(curr)) {
+ return nullptr;
+ }
bool fixed = false;
std::vector<Expression*> args;
for (auto* e : curr->operands) {
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp
index 012cb0e36..ef6a29373 100644
--- a/src/wasm/wasm-validator.cpp
+++ b/src/wasm/wasm-validator.cpp
@@ -806,9 +806,6 @@ void FunctionValidator::visitCallIndirect(CallIndirect* curr) {
shouldBeTrue(!curr->isReturn || getModule()->features.hasTailCall(),
curr,
"return_call_indirect requires tail calls to be enabled");
- if (!info.validateGlobally) {
- return;
- }
shouldBeEqualOrFirstIsUnreachable(curr->target->type,
Type(Type::i32),
curr,
@@ -1960,6 +1957,9 @@ void FunctionValidator::visitRefFunc(RefFunc* curr) {
shouldBeTrue(getModule()->features.hasReferenceTypes(),
curr,
"ref.func requires reference-types to be enabled");
+ if (!info.validateGlobally) {
+ return;
+ }
auto* func = getModule()->getFunctionOrNull(curr->func);
shouldBeTrue(!!func, curr, "function argument of ref.func must exist");
}
@@ -2010,13 +2010,13 @@ void FunctionValidator::visitThrow(Throw* curr) {
shouldBeTrue(getModule()->features.hasExceptionHandling(),
curr,
"throw requires exception-handling to be enabled");
- if (!info.validateGlobally) {
- return;
- }
shouldBeEqual(curr->type,
Type(Type::unreachable),
curr,
"throw's type must be unreachable");
+ if (!info.validateGlobally) {
+ return;
+ }
auto* event = getModule()->getEventOrNull(curr->event);
if (!shouldBeTrue(!!event, curr, "throw's event must exist")) {
return;
diff --git a/test/passes/flatten_i64-to-i32-lowering.txt b/test/passes/flatten_i64-to-i32-lowering.txt
index b115ff619..b069ff6b2 100644
--- a/test/passes/flatten_i64-to-i32-lowering.txt
+++ b/test/passes/flatten_i64-to-i32-lowering.txt
@@ -549,3 +549,24 @@
)
)
)
+(module
+ (type $none_=>_none (func))
+ (table $0 37 funcref)
+ (global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0))
+ (func $0
+ (unreachable)
+ (block
+ (unreachable)
+ (drop
+ (f64.const 1)
+ )
+ (drop
+ (i32.const -32768)
+ )
+ (drop
+ (i32.const 20)
+ )
+ )
+ (unreachable)
+ )
+)
diff --git a/test/passes/flatten_i64-to-i32-lowering.wast b/test/passes/flatten_i64-to-i32-lowering.wast
index 9b75e683f..52627c9d4 100644
--- a/test/passes/flatten_i64-to-i32-lowering.wast
+++ b/test/passes/flatten_i64-to-i32-lowering.wast
@@ -63,4 +63,15 @@
(global.set $f (i64.const 0x1122334455667788))
)
)
-
+(module
+ (type $i64_f64_i32_=>_none (func (param i64 f64 i32)))
+ (table $0 37 funcref)
+ (func $0
+ (call_indirect (type $i64_f64_i32_=>_none)
+ (unreachable)
+ (f64.const 1)
+ (i32.const -32768)
+ (i32.const 20)
+ )
+ )
+)