summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2020-03-16 10:30:02 -0700
committerGitHub <noreply@github.com>2020-03-16 10:30:02 -0700
commita3bbe87a97fe6cafa665d3e1a03c28f31b82eff5 (patch)
treeab34ddd658044969945a0fa5f0af5a0af85ecde1
parent5c0bf993bc530a5b69caac1a9d70eec13c887d70 (diff)
downloadbinaryen-a3bbe87a97fe6cafa665d3e1a03c28f31b82eff5.tar.gz
binaryen-a3bbe87a97fe6cafa665d3e1a03c28f31b82eff5.tar.bz2
binaryen-a3bbe87a97fe6cafa665d3e1a03c28f31b82eff5.zip
Handle unreachable in TupleExtract::finalize (#2692)
-rw-r--r--src/wasm/wasm.cpp8
-rw-r--r--test/multivalue.wast9
-rw-r--r--test/multivalue.wast.from-wast31
-rw-r--r--test/multivalue.wast.fromBinary31
-rw-r--r--test/multivalue.wast.fromBinary.noDebugInfo31
5 files changed, 76 insertions, 34 deletions
diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp
index 4e4186d08..35fa8b5c5 100644
--- a/src/wasm/wasm.cpp
+++ b/src/wasm/wasm.cpp
@@ -926,7 +926,13 @@ void TupleMake::finalize() {
type = Type(types);
}
-void TupleExtract::finalize() { type = tuple->type.expand()[index]; }
+void TupleExtract::finalize() {
+ if (tuple->type == Type::unreachable) {
+ type = Type::unreachable;
+ } else {
+ type = tuple->type.expand()[index];
+ }
+}
size_t Function::getNumParams() { return sig.params.size(); }
diff --git a/test/multivalue.wast b/test/multivalue.wast
index 25e161ef4..d2deaef89 100644
--- a/test/multivalue.wast
+++ b/test/multivalue.wast
@@ -41,6 +41,15 @@
)
)
)
+ (func $unreachable (result i64)
+ (tuple.extract 1
+ (tuple.make
+ (i32.const 42)
+ (i64.const 7)
+ (unreachable)
+ )
+ )
+ )
;; Test lowering of multivalue drops
(func $drop-call
diff --git a/test/multivalue.wast.from-wast b/test/multivalue.wast.from-wast
index 57abbc21d..293ec8cb0 100644
--- a/test/multivalue.wast.from-wast
+++ b/test/multivalue.wast.from-wast
@@ -1,10 +1,10 @@
(module
(type $none_=>_i32_i64 (func (result i32 i64)))
(type $none_=>_none (func))
+ (type $none_=>_i64 (func (result i64)))
(type $none_=>_f32_i64_i32 (func (result f32 i64 i32)))
(type $none_=>_i32 (func (result i32)))
(type $none_=>_i32_i64_f32 (func (result i32 i64 f32)))
- (type $none_=>_i64 (func (result i64)))
(type $none_=>_f32 (func (result f32)))
(import "env" "pair" (func $pair (result i32 i64)))
(func $triple (; 1 ;) (result i32 i64 f32)
@@ -46,12 +46,21 @@
)
)
)
- (func $drop-call (; 6 ;)
+ (func $unreachable (; 6 ;) (result i64)
+ (tuple.extract 1
+ (tuple.make
+ (i32.const 42)
+ (i64.const 7)
+ (unreachable)
+ )
+ )
+ )
+ (func $drop-call (; 7 ;)
(drop
(call $pair)
)
)
- (func $drop-tuple-make (; 7 ;)
+ (func $drop-tuple-make (; 8 ;)
(drop
(tuple.make
(i32.const 42)
@@ -59,7 +68,7 @@
)
)
)
- (func $drop-block (; 8 ;)
+ (func $drop-block (; 9 ;)
(drop
(block $block (result i32 i64)
(tuple.make
@@ -69,7 +78,7 @@
)
)
)
- (func $mv-return (; 9 ;) (result i32 i64)
+ (func $mv-return (; 10 ;) (result i32 i64)
(return
(tuple.make
(i32.const 42)
@@ -77,7 +86,7 @@
)
)
)
- (func $mv-return-in-block (; 10 ;) (result i32 i64)
+ (func $mv-return-in-block (; 11 ;) (result i32 i64)
(block $block (result i32 i64)
(return
(tuple.make
@@ -87,7 +96,7 @@
)
)
)
- (func $mv-block-break (; 11 ;) (result i32 i64)
+ (func $mv-block-break (; 12 ;) (result i32 i64)
(block $l (result i32 i64)
(br $l
(tuple.make
@@ -97,7 +106,7 @@
)
)
)
- (func $mv-block-br-if (; 12 ;) (result i32 i64)
+ (func $mv-block-br-if (; 13 ;) (result i32 i64)
(block $l (result i32 i64)
(br_if $l
(tuple.make
@@ -108,7 +117,7 @@
)
)
)
- (func $mv-if (; 13 ;) (result i32 i64)
+ (func $mv-if (; 14 ;) (result i32 i64)
(if (result i32 i64)
(i32.const 1)
(tuple.make
@@ -121,7 +130,7 @@
)
)
)
- (func $mv-loop (; 14 ;) (result i32 i64)
+ (func $mv-loop (; 15 ;) (result i32 i64)
(loop $loop-in (result i32 i64)
(tuple.make
(i32.const 42)
@@ -129,7 +138,7 @@
)
)
)
- (func $mv-switch (; 15 ;) (result i32 i64)
+ (func $mv-switch (; 16 ;) (result i32 i64)
(block $a (result i32 i64)
(block $b (result i32 i64)
(br_table $a $b
diff --git a/test/multivalue.wast.fromBinary b/test/multivalue.wast.fromBinary
index 90d1331b1..9bd9d5e58 100644
--- a/test/multivalue.wast.fromBinary
+++ b/test/multivalue.wast.fromBinary
@@ -1,10 +1,10 @@
(module
(type $none_=>_i32_i64 (func (result i32 i64)))
(type $none_=>_none (func))
+ (type $none_=>_i64 (func (result i64)))
(type $none_=>_f32_i64_i32 (func (result f32 i64 i32)))
(type $none_=>_i32 (func (result i32)))
(type $none_=>_i32_i64_f32 (func (result i32 i64 f32)))
- (type $none_=>_i64 (func (result i64)))
(type $none_=>_f32 (func (result f32)))
(import "env" "pair" (func $pair (result i32 i64)))
(func $triple (; 1 ;) (result i32 i64 f32)
@@ -224,7 +224,16 @@
)
)
)
- (func $drop-call (; 6 ;)
+ (func $unreachable (; 6 ;) (result i64)
+ (drop
+ (i32.const 42)
+ )
+ (drop
+ (i64.const 7)
+ )
+ (unreachable)
+ )
+ (func $drop-call (; 7 ;)
(local $0 (i32 i64))
(local $1 i32)
(local.set $0
@@ -246,7 +255,7 @@
)
)
)
- (func $drop-tuple-make (; 7 ;)
+ (func $drop-tuple-make (; 8 ;)
(local $0 i32)
(drop
(block (result i32)
@@ -260,7 +269,7 @@
)
)
)
- (func $drop-block (; 8 ;)
+ (func $drop-block (; 9 ;)
(local $0 (i32 i64))
(local $1 i32)
(local.set $0
@@ -287,7 +296,7 @@
)
)
)
- (func $mv-return (; 9 ;) (result i32 i64)
+ (func $mv-return (; 10 ;) (result i32 i64)
(return
(tuple.make
(i32.const 42)
@@ -295,7 +304,7 @@
)
)
)
- (func $mv-return-in-block (; 10 ;) (result i32 i64)
+ (func $mv-return-in-block (; 11 ;) (result i32 i64)
(return
(tuple.make
(i32.const 42)
@@ -303,7 +312,7 @@
)
)
)
- (func $mv-block-break (; 11 ;) (result i32 i64)
+ (func $mv-block-break (; 12 ;) (result i32 i64)
(local $0 (i32 i64))
(local.set $0
(block $label$1 (result i32 i64)
@@ -324,7 +333,7 @@
)
)
)
- (func $mv-block-br-if (; 12 ;) (result i32 i64)
+ (func $mv-block-br-if (; 13 ;) (result i32 i64)
(local $0 (i32 i64))
(local $1 (i32 i64))
(local.set $1
@@ -357,7 +366,7 @@
)
)
)
- (func $mv-if (; 13 ;) (result i32 i64)
+ (func $mv-if (; 14 ;) (result i32 i64)
(local $0 (i32 i64))
(local.set $0
(if (result i32 i64)
@@ -381,7 +390,7 @@
)
)
)
- (func $mv-loop (; 14 ;) (result i32 i64)
+ (func $mv-loop (; 15 ;) (result i32 i64)
(local $0 (i32 i64))
(local.set $0
(loop $label$1 (result i32 i64)
@@ -400,7 +409,7 @@
)
)
)
- (func $mv-switch (; 15 ;) (result i32 i64)
+ (func $mv-switch (; 16 ;) (result i32 i64)
(local $0 (i32 i64))
(local $1 (i32 i64))
(local.set $1
diff --git a/test/multivalue.wast.fromBinary.noDebugInfo b/test/multivalue.wast.fromBinary.noDebugInfo
index ba4634b47..71d0939ba 100644
--- a/test/multivalue.wast.fromBinary.noDebugInfo
+++ b/test/multivalue.wast.fromBinary.noDebugInfo
@@ -1,10 +1,10 @@
(module
(type $none_=>_i32_i64 (func (result i32 i64)))
(type $none_=>_none (func))
+ (type $none_=>_i64 (func (result i64)))
(type $none_=>_f32_i64_i32 (func (result f32 i64 i32)))
(type $none_=>_i32 (func (result i32)))
(type $none_=>_i32_i64_f32 (func (result i32 i64 f32)))
- (type $none_=>_i64 (func (result i64)))
(type $none_=>_f32 (func (result f32)))
(import "env" "pair" (func $fimport$0 (result i32 i64)))
(func $0 (; 1 ;) (result i32 i64 f32)
@@ -224,7 +224,16 @@
)
)
)
- (func $5 (; 6 ;)
+ (func $5 (; 6 ;) (result i64)
+ (drop
+ (i32.const 42)
+ )
+ (drop
+ (i64.const 7)
+ )
+ (unreachable)
+ )
+ (func $6 (; 7 ;)
(local $0 (i32 i64))
(local $1 i32)
(local.set $0
@@ -246,7 +255,7 @@
)
)
)
- (func $6 (; 7 ;)
+ (func $7 (; 8 ;)
(local $0 i32)
(drop
(block (result i32)
@@ -260,7 +269,7 @@
)
)
)
- (func $7 (; 8 ;)
+ (func $8 (; 9 ;)
(local $0 (i32 i64))
(local $1 i32)
(local.set $0
@@ -287,7 +296,7 @@
)
)
)
- (func $8 (; 9 ;) (result i32 i64)
+ (func $9 (; 10 ;) (result i32 i64)
(return
(tuple.make
(i32.const 42)
@@ -295,7 +304,7 @@
)
)
)
- (func $9 (; 10 ;) (result i32 i64)
+ (func $10 (; 11 ;) (result i32 i64)
(return
(tuple.make
(i32.const 42)
@@ -303,7 +312,7 @@
)
)
)
- (func $10 (; 11 ;) (result i32 i64)
+ (func $11 (; 12 ;) (result i32 i64)
(local $0 (i32 i64))
(local.set $0
(block $label$1 (result i32 i64)
@@ -324,7 +333,7 @@
)
)
)
- (func $11 (; 12 ;) (result i32 i64)
+ (func $12 (; 13 ;) (result i32 i64)
(local $0 (i32 i64))
(local $1 (i32 i64))
(local.set $1
@@ -357,7 +366,7 @@
)
)
)
- (func $12 (; 13 ;) (result i32 i64)
+ (func $13 (; 14 ;) (result i32 i64)
(local $0 (i32 i64))
(local.set $0
(if (result i32 i64)
@@ -381,7 +390,7 @@
)
)
)
- (func $13 (; 14 ;) (result i32 i64)
+ (func $14 (; 15 ;) (result i32 i64)
(local $0 (i32 i64))
(local.set $0
(loop $label$1 (result i32 i64)
@@ -400,7 +409,7 @@
)
)
)
- (func $14 (; 15 ;) (result i32 i64)
+ (func $15 (; 16 ;) (result i32 i64)
(local $0 (i32 i64))
(local $1 (i32 i64))
(local.set $1