diff options
-rw-r--r-- | src/abi/stack.h | 22 | ||||
-rw-r--r-- | test/passes/spill-pointers.txt | 456 |
2 files changed, 277 insertions, 201 deletions
diff --git a/src/abi/stack.h b/src/abi/stack.h index 93a6e4cc1..752aecae4 100644 --- a/src/abi/stack.h +++ b/src/abi/stack.h @@ -38,9 +38,6 @@ inline Index stackAlign(Index size) { // Allocate some space on the stack, and assign it to a local. // The local will have the same constant value in all the function, so you can // just local.get it anywhere there. -// -// FIXME: This function assumes that the stack grows upward, per the convention -// used by fastcomp. The stack grows downward when using the WASM backend. inline void getStackSpace(Index local, Function* func, Index size, Module& wasm) { @@ -55,22 +52,25 @@ getStackSpace(Index local, Function* func, Index size, Module& wasm) { // TODO: find existing stack usage, and add on top of that - carefully Builder builder(wasm); auto* block = builder.makeBlock(); - block->list.push_back(builder.makeLocalSet( - local, builder.makeGlobalGet(stackPointer->name, pointerType))); // TODO: add stack max check Expression* added; if (pointerType == Type::i32) { // The stack goes downward in the LLVM wasm backend. - added = builder.makeBinary(SubInt32, - builder.makeLocalGet(local, pointerType), - builder.makeConst(int32_t(size))); + added = + builder.makeBinary(SubInt32, + builder.makeGlobalGet(stackPointer->name, pointerType), + builder.makeConst(int32_t(size))); } else { WASM_UNREACHABLE("unhandled pointerType"); } - block->list.push_back(builder.makeGlobalSet(stackPointer->name, added)); + block->list.push_back(builder.makeGlobalSet( + stackPointer->name, builder.makeLocalTee(local, added, pointerType))); auto makeStackRestore = [&]() { - return builder.makeGlobalSet(stackPointer->name, - builder.makeLocalGet(local, pointerType)); + return builder.makeGlobalSet( + stackPointer->name, + builder.makeBinary(AddInt32, + builder.makeLocalGet(local, pointerType), + builder.makeConst(int32_t(size)))); }; // add stack restores to the returns FindAllPointers<Return> finder(func->body); diff --git a/test/passes/spill-pointers.txt b/test/passes/spill-pointers.txt index c9b9a4a3e..0c51683ef 100644 --- a/test/passes/spill-pointers.txt +++ b/test/passes/spill-pointers.txt @@ -24,13 +24,12 @@ (func $spill (local $x i32) (local $1 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -46,7 +45,10 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) ) (func $ignore-non-pointers @@ -55,13 +57,12 @@ (local $z f32) (local $w f64) (local $4 i32) - (local.set $4 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $4) - (i32.const 16) + (local.tee $4 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -98,7 +99,10 @@ ) ) (global.set $stack_ptr - (local.get $4) + (i32.add + (local.get $4) + (i32.const 16) + ) ) ) (func $spill4 @@ -107,13 +111,12 @@ (local $z i32) (local $w i32) (local $4 i32) - (local.set $4 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $4) - (i32.const 16) + (local.tee $4 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -162,7 +165,10 @@ ) ) (global.set $stack_ptr - (local.get $4) + (i32.add + (local.get $4) + (i32.const 16) + ) ) ) (func $spill5 @@ -172,13 +178,12 @@ (local $w i32) (local $a i32) (local $5 i32) - (local.set $5 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $5) - (i32.const 32) + (local.tee $5 + (i32.sub + (global.get $stack_ptr) + (i32.const 32) + ) ) ) (block @@ -237,20 +242,22 @@ ) ) (global.set $stack_ptr - (local.get $5) + (i32.add + (local.get $5) + (i32.const 32) + ) ) ) (func $some-alive (local $x i32) (local $y i32) (local $2 i32) - (local.set $2 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $2) - (i32.const 16) + (local.tee $2 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -266,7 +273,10 @@ ) ) (global.set $stack_ptr - (local.get $2) + (i32.add + (local.get $2) + (i32.const 16) + ) ) ) (func $spill-args (param $p i32) (param $q i32) @@ -274,13 +284,12 @@ (local $3 i32) (local $4 i32) (local $5 i32) - (local.set $3 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $3) - (i32.const 16) + (local.tee $3 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -305,7 +314,10 @@ ) ) (global.set $stack_ptr - (local.get $3) + (i32.add + (local.get $3) + (i32.const 16) + ) ) ) (func $spill-ret (result i32) @@ -314,13 +326,12 @@ (local $2 i32) (local $3 i32) (local $4 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (local.set $4 @@ -342,7 +353,10 @@ (i32.const 2) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (return (local.get $2) @@ -353,7 +367,10 @@ (i32.const 3) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (return (local.get $3) @@ -364,7 +381,10 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (local.get $4) ) @@ -372,13 +392,12 @@ (local $x i32) (local $1 i32) (local $2 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (local.set $2 @@ -397,7 +416,10 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (local.get $2) ) @@ -410,13 +432,12 @@ (local $3 i32) (local $4 i32) (local $5 i32) - (local.set $2 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $2) - (i32.const 16) + (local.tee $2 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (local.set $5 @@ -450,7 +471,10 @@ ) ) (global.set $stack_ptr - (local.get $2) + (i32.add + (local.get $2) + (i32.const 16) + ) ) (local.get $5) ) @@ -481,13 +505,12 @@ (local $1 i32) (local $2 i32) (local $3 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (local.set $3 @@ -505,7 +528,10 @@ (drop (block (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (return (block @@ -513,7 +539,10 @@ (i32.const 1) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (return (local.get $2) @@ -526,7 +555,10 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (local.get $3) ) @@ -534,13 +566,12 @@ (local $x i32) (local $2 i32) (local $3 f64) - (local.set $2 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $2) - (i32.const 16) + (local.tee $2 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -561,7 +592,10 @@ ) ) (global.set $stack_ptr - (local.get $2) + (i32.add + (local.get $2) + (i32.const 16) + ) ) ) (func $spill-call_indirect @@ -570,13 +604,12 @@ (local $2 i32) (local $3 i32) (local $4 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -605,20 +638,22 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) ) (func $spill-call_import (local $x i32) (local $1 i32) (local $2 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -639,7 +674,10 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) ) ) @@ -672,13 +710,12 @@ (func $spill (local $x i32) (local $1 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -694,7 +731,10 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) ) (func $ignore-non-pointers @@ -703,13 +743,12 @@ (local $z f32) (local $w f64) (local $4 i32) - (local.set $4 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $4) - (i32.const 16) + (local.tee $4 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -746,7 +785,10 @@ ) ) (global.set $stack_ptr - (local.get $4) + (i32.add + (local.get $4) + (i32.const 16) + ) ) ) (func $spill4 @@ -755,13 +797,12 @@ (local $z i32) (local $w i32) (local $4 i32) - (local.set $4 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $4) - (i32.const 16) + (local.tee $4 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -810,7 +851,10 @@ ) ) (global.set $stack_ptr - (local.get $4) + (i32.add + (local.get $4) + (i32.const 16) + ) ) ) (func $spill5 @@ -820,13 +864,12 @@ (local $w i32) (local $a i32) (local $5 i32) - (local.set $5 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $5) - (i32.const 32) + (local.tee $5 + (i32.sub + (global.get $stack_ptr) + (i32.const 32) + ) ) ) (block @@ -885,20 +928,22 @@ ) ) (global.set $stack_ptr - (local.get $5) + (i32.add + (local.get $5) + (i32.const 32) + ) ) ) (func $some-alive (local $x i32) (local $y i32) (local $2 i32) - (local.set $2 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $2) - (i32.const 16) + (local.tee $2 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -914,7 +959,10 @@ ) ) (global.set $stack_ptr - (local.get $2) + (i32.add + (local.get $2) + (i32.const 16) + ) ) ) (func $spill-args (param $p i32) (param $q i32) @@ -922,13 +970,12 @@ (local $3 i32) (local $4 i32) (local $5 i32) - (local.set $3 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $3) - (i32.const 16) + (local.tee $3 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -953,7 +1000,10 @@ ) ) (global.set $stack_ptr - (local.get $3) + (i32.add + (local.get $3) + (i32.const 16) + ) ) ) (func $spill-ret (result i32) @@ -962,13 +1012,12 @@ (local $2 i32) (local $3 i32) (local $4 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (local.set $4 @@ -990,7 +1039,10 @@ (i32.const 2) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (return (local.get $2) @@ -1001,7 +1053,10 @@ (i32.const 3) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (return (local.get $3) @@ -1012,7 +1067,10 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (local.get $4) ) @@ -1020,13 +1078,12 @@ (local $x i32) (local $1 i32) (local $2 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (local.set $2 @@ -1045,7 +1102,10 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (local.get $2) ) @@ -1058,13 +1118,12 @@ (local $3 i32) (local $4 i32) (local $5 i32) - (local.set $2 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $2) - (i32.const 16) + (local.tee $2 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (local.set $5 @@ -1098,7 +1157,10 @@ ) ) (global.set $stack_ptr - (local.get $2) + (i32.add + (local.get $2) + (i32.const 16) + ) ) (local.get $5) ) @@ -1129,13 +1191,12 @@ (local $1 i32) (local $2 i32) (local $3 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (local.set $3 @@ -1153,7 +1214,10 @@ (drop (block (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (return (block @@ -1161,7 +1225,10 @@ (i32.const 1) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (return (local.get $2) @@ -1174,7 +1241,10 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) (local.get $3) ) @@ -1182,13 +1252,12 @@ (local $x i32) (local $2 i32) (local $3 f64) - (local.set $2 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $2) - (i32.const 16) + (local.tee $2 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -1209,7 +1278,10 @@ ) ) (global.set $stack_ptr - (local.get $2) + (i32.add + (local.get $2) + (i32.const 16) + ) ) ) (func $spill-call_indirect @@ -1218,13 +1290,12 @@ (local $2 i32) (local $3 i32) (local $4 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -1253,20 +1324,22 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) ) (func $spill-call_import (local $x i32) (local $1 i32) (local $2 i32) - (local.set $1 - (global.get $stack_ptr) - ) (global.set $stack_ptr - (i32.sub - (local.get $1) - (i32.const 16) + (local.tee $1 + (i32.sub + (global.get $stack_ptr) + (i32.const 16) + ) ) ) (block @@ -1287,7 +1360,10 @@ ) ) (global.set $stack_ptr - (local.get $1) + (i32.add + (local.get $1) + (i32.const 16) + ) ) ) ) |