Fix unreachable insertion when returning none (#557)

This commit is contained in:
Max Graey 2019-03-24 11:18:05 +02:00 committed by Daniel Wirtz
parent f9a8d2f1db
commit 74ce9bf386
3 changed files with 70 additions and 54 deletions

View File

@ -1746,13 +1746,8 @@ export class BinaryModule {
/** Tests if an expression needs an explicit 'unreachable' when it is the terminating statement. */ /** Tests if an expression needs an explicit 'unreachable' when it is the terminating statement. */
export function needsExplicitUnreachable(expr: ExpressionRef): bool { export function needsExplicitUnreachable(expr: ExpressionRef): bool {
// not applicable if pushing a value to the stack // not applicable if pushing a value to the stack
switch (_BinaryenExpressionGetType(expr)) { if (_BinaryenExpressionGetType(expr) != NativeType.Unreachable) return false;
case NativeType.I32:
case NativeType.I64:
case NativeType.F32:
case NativeType.F64:
case NativeType.V128: return false;
}
switch (_BinaryenExpressionGetId(expr)) { switch (_BinaryenExpressionGetId(expr)) {
case ExpressionId.Unreachable: case ExpressionId.Unreachable:
case ExpressionId.Return: return false; case ExpressionId.Return: return false;

View File

@ -1,35 +1,41 @@
function v(): void {} function _(): void {}
function v(): void { return; }
function i(): i32 { return 0; } function i(): i32 { return 0; }
function I(): i64 { return 0; } function j(): i64 { return 0; }
function f(): f32 { return 0; } function f(): f32 { return 0; }
function F(): f64 { return 0; } function d(): f64 { return 0; }
_();
v(); v();
i(); i();
I(); j();
f(); f();
F(); d();
function iv(a: i32): void {} function i_(a: i32): void {}
function iv(a: i32): void { return; }
function ii(a: i32): i32 { return a; } function ii(a: i32): i32 { return a; }
function II(a: i64): i64 { return a; } function jj(a: i64): i64 { return a; }
function ff(a: f32): f32 { return a; } function ff(a: f32): f32 { return a; }
function FF(a: f64): f64 { return a; } function dd(a: f64): f64 { return a; }
i_(0);
iv(0); iv(0);
ii(0); ii(0);
II(0); jj(0);
ff(0); ff(0);
FF(0); dd(0);
function iiv(a: i32, b: i32): void {} function ii_(a: i32, b: i32): void {}
function iiv(a: i32, b: i32): void { return; }
function iii(a: i32, b: i32): i32 { return a + b; } function iii(a: i32, b: i32): i32 { return a + b; }
function III(a: i64, b: i32): i64 { return a + b; } function jjj(a: i64, b: i32): i64 { return a + b; }
function fff(a: f32, b: f32): f32 { return a + b; } function fff(a: f32, b: f32): f32 { return a + b; }
function FFF(a: f64, b: f64): f64 { return a + b; } function ddd(a: f64, b: f64): f64 { return a + b; }
ii_(1, 2);
iiv(1, 2); iiv(1, 2);
iii(1, 2); iii(1, 2);
III(1, 2); jjj(1, 2);
fff(1, 2); fff(1, 2);
FFF(1, 2); ddd(1, 2);

View File

@ -21,86 +21,101 @@
(export "memory" (memory $0)) (export "memory" (memory $0))
(export "table" (table $0)) (export "table" (table $0))
(start $start) (start $start)
(func $function/v (; 0 ;) (type $FUNCSIG$v) (func $function/_ (; 0 ;) (type $FUNCSIG$v)
nop nop
) )
(func $function/i (; 1 ;) (type $FUNCSIG$i) (result i32) (func $function/v (; 1 ;) (type $FUNCSIG$v)
nop
)
(func $function/i (; 2 ;) (type $FUNCSIG$i) (result i32)
i32.const 0 i32.const 0
) )
(func $function/I (; 2 ;) (type $FUNCSIG$j) (result i64) (func $function/j (; 3 ;) (type $FUNCSIG$j) (result i64)
i64.const 0 i64.const 0
) )
(func $function/f (; 3 ;) (type $FUNCSIG$f) (result f32) (func $function/f (; 4 ;) (type $FUNCSIG$f) (result f32)
f32.const 0 f32.const 0
) )
(func $function/F (; 4 ;) (type $FUNCSIG$d) (result f64) (func $function/d (; 5 ;) (type $FUNCSIG$d) (result f64)
f64.const 0 f64.const 0
) )
(func $function/iv (; 5 ;) (type $FUNCSIG$vi) (param $0 i32) (func $function/i_ (; 6 ;) (type $FUNCSIG$vi) (param $0 i32)
nop nop
) )
(func $function/ii (; 6 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (func $function/iv (; 7 ;) (type $FUNCSIG$vi) (param $0 i32)
local.get $0
)
(func $function/II (; 7 ;) (type $FUNCSIG$jj) (param $0 i64) (result i64)
local.get $0
)
(func $function/ff (; 8 ;) (type $FUNCSIG$ff) (param $0 f32) (result f32)
local.get $0
)
(func $function/FF (; 9 ;) (type $FUNCSIG$dd) (param $0 f64) (result f64)
local.get $0
)
(func $function/iiv (; 10 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32)
nop nop
) )
(func $function/iii (; 11 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (func $function/ii (; 8 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
local.get $0
)
(func $function/jj (; 9 ;) (type $FUNCSIG$jj) (param $0 i64) (result i64)
local.get $0
)
(func $function/ff (; 10 ;) (type $FUNCSIG$ff) (param $0 f32) (result f32)
local.get $0
)
(func $function/dd (; 11 ;) (type $FUNCSIG$dd) (param $0 f64) (result f64)
local.get $0
)
(func $function/ii_ (; 12 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32)
nop
)
(func $function/iiv (; 13 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32)
nop
)
(func $function/iii (; 14 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.add i32.add
) )
(func $function/III (; 12 ;) (type $FUNCSIG$jji) (param $0 i64) (param $1 i32) (result i64) (func $function/jjj (; 15 ;) (type $FUNCSIG$jji) (param $0 i64) (param $1 i32) (result i64)
local.get $0 local.get $0
local.get $1 local.get $1
i64.extend_i32_s i64.extend_i32_s
i64.add i64.add
) )
(func $function/fff (; 13 ;) (type $FUNCSIG$fff) (param $0 f32) (param $1 f32) (result f32) (func $function/fff (; 16 ;) (type $FUNCSIG$fff) (param $0 f32) (param $1 f32) (result f32)
local.get $0 local.get $0
local.get $1 local.get $1
f32.add f32.add
) )
(func $function/FFF (; 14 ;) (type $FUNCSIG$ddd) (param $0 f64) (param $1 f64) (result f64) (func $function/ddd (; 17 ;) (type $FUNCSIG$ddd) (param $0 f64) (param $1 f64) (result f64)
local.get $0 local.get $0
local.get $1 local.get $1
f64.add f64.add
) )
(func $start:function (; 15 ;) (type $FUNCSIG$v) (func $start:function (; 18 ;) (type $FUNCSIG$v)
call $function/_
call $function/v call $function/v
call $function/i call $function/i
drop drop
call $function/I call $function/j
drop drop
call $function/f call $function/f
drop drop
call $function/F call $function/d
drop drop
i32.const 0 i32.const 0
call $function/i_
i32.const 0
call $function/iv call $function/iv
i32.const 0 i32.const 0
call $function/ii call $function/ii
drop drop
i64.const 0 i64.const 0
call $function/II call $function/jj
drop drop
f32.const 0 f32.const 0
call $function/ff call $function/ff
drop drop
f64.const 0 f64.const 0
call $function/FF call $function/dd
drop drop
i32.const 1 i32.const 1
i32.const 2 i32.const 2
call $function/ii_
i32.const 1
i32.const 2
call $function/iiv call $function/iiv
i32.const 1 i32.const 1
i32.const 2 i32.const 2
@ -108,7 +123,7 @@
drop drop
i64.const 1 i64.const 1
i32.const 2 i32.const 2
call $function/III call $function/jjj
drop drop
f32.const 1 f32.const 1
f32.const 2 f32.const 2
@ -116,12 +131,12 @@
drop drop
f64.const 1 f64.const 1
f64.const 2 f64.const 2
call $function/FFF call $function/ddd
drop drop
) )
(func $start (; 16 ;) (type $FUNCSIG$v) (func $start (; 19 ;) (type $FUNCSIG$v)
call $start:function call $start:function
) )
(func $null (; 17 ;) (type $FUNCSIG$v) (func $null (; 20 ;) (type $FUNCSIG$v)
) )
) )