summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/abi/stack.h22
-rw-r--r--test/passes/spill-pointers.txt456
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)
+ )
)
)
)