diff options
author | William Maddox <16312695+wmaddox@users.noreply.github.com> | 2019-07-28 11:02:14 -0700 |
---|---|---|
committer | Alon Zakai <azakai@google.com> | 2019-07-28 11:02:14 -0700 |
commit | be6f7c4795ab3bc135e10162b0d7a1063e5d65ba (patch) | |
tree | 081fcb0744be156ad05b374227d8777cc896ef65 /test | |
parent | 6ac5fa713b421588eede2e791235e4b60b22b172 (diff) | |
download | binaryen-be6f7c4795ab3bc135e10162b0d7a1063e5d65ba.tar.gz binaryen-be6f7c4795ab3bc135e10162b0d7a1063e5d65ba.tar.bz2 binaryen-be6f7c4795ab3bc135e10162b0d7a1063e5d65ba.zip |
Fix stack pointer identification for wasm::ABI::getStackSpace(). (#2243)
* Fix stack pointer identification for wasm::ABI::getStackSpace().
Recent stack pointer simplification in Emscripten broke the --spill-pointers
pass. This fix for #2229 restores this functionality by recognizing an
alternative coding idiom in Emscripten-generated WASM code.
Diffstat (limited to 'test')
-rw-r--r-- | test/passes/spill-pointers.txt | 647 | ||||
-rw-r--r-- | test/passes/spill-pointers.wast | 170 |
2 files changed, 817 insertions, 0 deletions
diff --git a/test/passes/spill-pointers.txt b/test/passes/spill-pointers.txt index debd87eac..8ad136ee3 100644 --- a/test/passes/spill-pointers.txt +++ b/test/passes/spill-pointers.txt @@ -642,3 +642,650 @@ ) ) ) +(module + (type $ii (func (param i32 i32))) + (type $FUNCSIG$vi (func (param i32))) + (type $FUNCSIG$i (func (result i32))) + (type $FUNCSIG$v (func)) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$vd (func (param f64))) + (import "env" "segfault" (func $segfault (param i32))) + (memory $0 10) + (table $0 1 1 funcref) + (global $stack_ptr (mut i32) (i32.const 1716592)) + (export "stackSave" (func $stack_save)) + (func $stack_save (; 1 ;) (type $FUNCSIG$i) (result i32) + (global.get $stack_ptr) + ) + (func $nothing (; 2 ;) (type $FUNCSIG$v) + (nop) + ) + (func $not-alive (; 3 ;) (type $FUNCSIG$v) + (local $x i32) + (local.set $x + (i32.const 1) + ) + (call $nothing) + ) + (func $spill (; 4 ;) (type $FUNCSIG$v) + (local $x i32) + (local $1 i32) + (local.set $1 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $1) + (i32.const 16) + ) + ) + (block + (block + (i32.store + (local.get $1) + (local.get $x) + ) + (call $nothing) + ) + (drop + (local.get $x) + ) + ) + (global.set $stack_ptr + (local.get $1) + ) + ) + (func $ignore-non-pointers (; 5 ;) (type $FUNCSIG$v) + (local $x i32) + (local $y i64) + (local $z f32) + (local $w f64) + (local $4 i32) + (local.set $4 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $4) + (i32.const 16) + ) + ) + (block + (local.set $x + (i32.const 1) + ) + (local.set $y + (i64.const 1) + ) + (local.set $z + (f32.const 1) + ) + (local.set $w + (f64.const 1) + ) + (block + (i32.store + (local.get $4) + (local.get $x) + ) + (call $nothing) + ) + (drop + (local.get $x) + ) + (drop + (local.get $y) + ) + (drop + (local.get $z) + ) + (drop + (local.get $w) + ) + ) + (global.set $stack_ptr + (local.get $4) + ) + ) + (func $spill4 (; 6 ;) (type $FUNCSIG$v) + (local $x i32) + (local $y i32) + (local $z i32) + (local $w i32) + (local $4 i32) + (local.set $4 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $4) + (i32.const 16) + ) + ) + (block + (local.set $x + (i32.const 1) + ) + (local.set $y + (i32.const 1) + ) + (local.set $z + (i32.const 1) + ) + (local.set $w + (i32.const 1) + ) + (block + (i32.store + (local.get $4) + (local.get $x) + ) + (i32.store offset=4 + (local.get $4) + (local.get $y) + ) + (i32.store offset=8 + (local.get $4) + (local.get $z) + ) + (i32.store offset=12 + (local.get $4) + (local.get $w) + ) + (call $nothing) + ) + (drop + (local.get $x) + ) + (drop + (local.get $y) + ) + (drop + (local.get $z) + ) + (drop + (local.get $w) + ) + ) + (global.set $stack_ptr + (local.get $4) + ) + ) + (func $spill5 (; 7 ;) (type $FUNCSIG$v) + (local $x i32) + (local $y i32) + (local $z i32) + (local $w i32) + (local $a i32) + (local $5 i32) + (local.set $5 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $5) + (i32.const 32) + ) + ) + (block + (local.set $x + (i32.const 1) + ) + (local.set $y + (i32.const 1) + ) + (local.set $z + (i32.const 1) + ) + (local.set $w + (i32.const 1) + ) + (local.set $a + (i32.const 1) + ) + (block + (i32.store + (local.get $5) + (local.get $x) + ) + (i32.store offset=4 + (local.get $5) + (local.get $y) + ) + (i32.store offset=8 + (local.get $5) + (local.get $z) + ) + (i32.store offset=12 + (local.get $5) + (local.get $w) + ) + (i32.store offset=16 + (local.get $5) + (local.get $a) + ) + (call $nothing) + ) + (drop + (local.get $x) + ) + (drop + (local.get $y) + ) + (drop + (local.get $z) + ) + (drop + (local.get $w) + ) + (drop + (local.get $a) + ) + ) + (global.set $stack_ptr + (local.get $5) + ) + ) + (func $some-alive (; 8 ;) (type $FUNCSIG$v) + (local $x i32) + (local $y i32) + (local $2 i32) + (local.set $2 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $2) + (i32.const 16) + ) + ) + (block + (block + (i32.store + (local.get $2) + (local.get $x) + ) + (call $nothing) + ) + (drop + (local.get $x) + ) + ) + (global.set $stack_ptr + (local.get $2) + ) + ) + (func $spill-args (; 9 ;) (type $ii) (param $p i32) (param $q i32) + (local $x i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local.set $3 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $3) + (i32.const 16) + ) + ) + (block + (block + (local.set $4 + (i32.const 1) + ) + (local.set $5 + (i32.const 2) + ) + (i32.store offset=8 + (local.get $3) + (local.get $x) + ) + (call $spill-args + (local.get $4) + (local.get $5) + ) + ) + (drop + (local.get $x) + ) + ) + (global.set $stack_ptr + (local.get $3) + ) + ) + (func $spill-ret (; 10 ;) (type $FUNCSIG$i) (result i32) + (local $x i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local.set $1 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $1) + (i32.const 16) + ) + ) + (local.set $4 + (block (result i32) + (block + (i32.store + (local.get $1) + (local.get $x) + ) + (call $nothing) + ) + (drop + (local.get $x) + ) + (if + (i32.const 1) + (block + (local.set $2 + (i32.const 2) + ) + (global.set $stack_ptr + (local.get $1) + ) + (return + (local.get $2) + ) + ) + (block + (local.set $3 + (i32.const 3) + ) + (global.set $stack_ptr + (local.get $1) + ) + (return + (local.get $3) + ) + ) + ) + (i32.const 4) + ) + ) + (global.set $stack_ptr + (local.get $1) + ) + (local.get $4) + ) + (func $spill-unreachable (; 11 ;) (type $FUNCSIG$i) (result i32) + (local $x i32) + (local $1 i32) + (local $2 i32) + (local.set $1 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $1) + (i32.const 16) + ) + ) + (local.set $2 + (block (result i32) + (block + (i32.store + (local.get $1) + (local.get $x) + ) + (call $nothing) + ) + (drop + (local.get $x) + ) + (unreachable) + ) + ) + (global.set $stack_ptr + (local.get $1) + ) + (local.get $2) + ) + (func $spill-call-call0 (; 12 ;) (type $FUNCSIG$ii) (param $p i32) (result i32) + (unreachable) + ) + (func $spill-call-call1 (; 13 ;) (type $FUNCSIG$ii) (param $p i32) (result i32) + (local $x i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local.set $2 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $2) + (i32.const 16) + ) + ) + (local.set $5 + (block (result i32) + (drop + (block (result i32) + (local.set $3 + (block (result i32) + (local.set $4 + (i32.const 1) + ) + (i32.store offset=4 + (local.get $2) + (local.get $x) + ) + (call $spill-call-call1 + (local.get $4) + ) + ) + ) + (i32.store offset=4 + (local.get $2) + (local.get $x) + ) + (call $spill-call-call0 + (local.get $3) + ) + ) + ) + (local.get $x) + ) + ) + (global.set $stack_ptr + (local.get $2) + ) + (local.get $5) + ) + (func $spill-call-ret (; 14 ;) (type $FUNCSIG$ii) (param $p i32) (result i32) + (local $x i32) + (drop + (call $spill-call-call0 + (return + (i32.const 1) + ) + ) + ) + (i32.const 0) + ) + (func $spill-ret-call (; 15 ;) (type $FUNCSIG$ii) (param $p i32) (result i32) + (local $x i32) + (drop + (return + (call $spill-call-call0 + (i32.const 1) + ) + ) + ) + (i32.const 0) + ) + (func $spill-ret-ret (; 16 ;) (type $FUNCSIG$i) (result i32) + (local $x i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local.set $1 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $1) + (i32.const 16) + ) + ) + (local.set $3 + (block (result i32) + (block + (i32.store + (local.get $1) + (local.get $x) + ) + (call $nothing) + ) + (drop + (local.get $x) + ) + (drop + (block + (global.set $stack_ptr + (local.get $1) + ) + (return + (block + (local.set $2 + (i32.const 1) + ) + (global.set $stack_ptr + (local.get $1) + ) + (return + (local.get $2) + ) + ) + ) + ) + ) + (i32.const 0) + ) + ) + (global.set $stack_ptr + (local.get $1) + ) + (local.get $3) + ) + (func $spill-call-othertype (; 17 ;) (type $FUNCSIG$vd) (param $y f64) + (local $x i32) + (local $2 i32) + (local $3 f64) + (local.set $2 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $2) + (i32.const 16) + ) + ) + (block + (block + (local.set $3 + (f64.const 1) + ) + (i32.store + (local.get $2) + (local.get $x) + ) + (call $spill-call-othertype + (local.get $3) + ) + ) + (drop + (local.get $x) + ) + ) + (global.set $stack_ptr + (local.get $2) + ) + ) + (func $spill-call_indirect (; 18 ;) (type $FUNCSIG$v) + (local $x i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local.set $1 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $1) + (i32.const 16) + ) + ) + (block + (block + (local.set $2 + (i32.const 123) + ) + (local.set $3 + (i32.const 456) + ) + (local.set $4 + (i32.const 789) + ) + (i32.store + (local.get $1) + (local.get $x) + ) + (call_indirect (type $ii) + (local.get $2) + (local.get $3) + (local.get $4) + ) + ) + (drop + (local.get $x) + ) + ) + (global.set $stack_ptr + (local.get $1) + ) + ) + (func $spill-call_import (; 19 ;) (type $FUNCSIG$v) + (local $x i32) + (local $1 i32) + (local $2 i32) + (local.set $1 + (global.get $stack_ptr) + ) + (global.set $stack_ptr + (i32.add + (local.get $1) + (i32.const 16) + ) + ) + (block + (block + (local.set $2 + (i32.const 200) + ) + (i32.store + (local.get $1) + (local.get $x) + ) + (call $segfault + (local.get $2) + ) + ) + (drop + (local.get $x) + ) + ) + (global.set $stack_ptr + (local.get $1) + ) + ) +) diff --git a/test/passes/spill-pointers.wast b/test/passes/spill-pointers.wast index ce486ea73..4eb05a721 100644 --- a/test/passes/spill-pointers.wast +++ b/test/passes/spill-pointers.wast @@ -166,3 +166,173 @@ ) ) +(module + (memory 10) + (type $ii (func (param i32 i32))) + (table 1 1 funcref) + (elem (i32.const 0)) + (global $stack_ptr (mut i32) (i32.const 1716592)) + (export "stackSave" (func $stack_save)) + (import "env" "segfault" (func $segfault (param i32))) + (func $stack_save (result i32) + (global.get $stack_ptr) + ) + + (func $nothing + ) + (func $not-alive + (local $x i32) + (local.set $x (i32.const 1)) + (call $nothing) + ) + (func $spill + (local $x i32) + (call $nothing) + (drop (local.get $x)) + ) + (func $ignore-non-pointers + (local $x i32) + (local $y i64) + (local $z f32) + (local $w f64) + (local.set $x (i32.const 1)) + (local.set $y (i64.const 1)) + (local.set $z (f32.const 1)) + (local.set $w (f64.const 1)) + (call $nothing) + (drop (local.get $x)) + (drop (local.get $y)) + (drop (local.get $z)) + (drop (local.get $w)) + ) + (func $spill4 + (local $x i32) + (local $y i32) + (local $z i32) + (local $w i32) + (local.set $x (i32.const 1)) + (local.set $y (i32.const 1)) + (local.set $z (i32.const 1)) + (local.set $w (i32.const 1)) + (call $nothing) + (drop (local.get $x)) + (drop (local.get $y)) + (drop (local.get $z)) + (drop (local.get $w)) + ) + (func $spill5 + (local $x i32) + (local $y i32) + (local $z i32) + (local $w i32) + (local $a i32) + (local.set $x (i32.const 1)) + (local.set $y (i32.const 1)) + (local.set $z (i32.const 1)) + (local.set $w (i32.const 1)) + (local.set $a (i32.const 1)) + (call $nothing) + (drop (local.get $x)) + (drop (local.get $y)) + (drop (local.get $z)) + (drop (local.get $w)) + (drop (local.get $a)) + ) + (func $some-alive + (local $x i32) + (local $y i32) + (call $nothing) + (drop (local.get $x)) + ) + (func $spill-args (param $p i32) (param $q i32) + (local $x i32) + (call $spill-args (i32.const 1) (i32.const 2)) + (drop (local.get $x)) + ) + (func $spill-ret (result i32) + (local $x i32) + (call $nothing) + (drop (local.get $x)) + (if (i32.const 1) + (return (i32.const 2)) + (return (i32.const 3)) + ) + (i32.const 4) + ) + (func $spill-unreachable (result i32) + (local $x i32) + (call $nothing) + (drop (local.get $x)) + (unreachable) + ) + (func $spill-call-call0 (param $p i32) (result i32) + (unreachable) + ) + (func $spill-call-call1 (param $p i32) (result i32) + (local $x i32) + (drop + (call $spill-call-call0 + (call $spill-call-call1 + (i32.const 1) + ) + ) + ) + (local.get $x) + ) + (func $spill-call-ret (param $p i32) (result i32) + (local $x i32) + (drop + (call $spill-call-call0 + (return + (i32.const 1) + ) + ) + ) + (local.get $x) + ) + (func $spill-ret-call (param $p i32) (result i32) + (local $x i32) + (drop + (return + (call $spill-call-call0 + (i32.const 1) + ) + ) + ) + (local.get $x) + ) + (func $spill-ret-ret (result i32) + (local $x i32) + (call $nothing) + (drop (local.get $x)) + (drop + (return + (return + (i32.const 1) + ) + ) + ) + (local.get $x) + ) + (func $spill-call-othertype (param $y f64) + (local $x i32) + (call $spill-call-othertype (f64.const 1)) + (drop (local.get $x)) + ) + (func $spill-call_indirect + (local $x i32) + (call_indirect (type $ii) + (i32.const 123) + (i32.const 456) + (i32.const 789) + ) + (drop (local.get $x)) + ) + (func $spill-call_import + (local $x i32) + (call $segfault + (i32.const 200) + ) + (drop (local.get $x)) + ) +) |