aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/sizeof_test.go
diff options
context:
space:
mode:
authorRichard Musiol <mail@richard-musiol.de>2018-03-09 00:14:58 +0100
committerBrad Fitzpatrick <bradfitz@golang.org>2018-05-23 21:37:59 +0000
commit482d241936deac1e50a77ab340345449f8579886 (patch)
tree2d7a130c9f263f8d4682ebd04725784055e5e4ce /src/cmd/compile/internal/ssa/sizeof_test.go
parent02399fa65c7012acb73abc01703cb751dad6aeff (diff)
downloadgo-482d241936deac1e50a77ab340345449f8579886.tar.gz
go-482d241936deac1e50a77ab340345449f8579886.zip
cmd/compile: add wasm stack optimization
Go's SSA instructions only operate on registers. For example, an add instruction would read two registers, do the addition and then write to a register. WebAssembly's instructions, on the other hand, operate on the stack. The add instruction first pops two values from the stack, does the addition, then pushes the result to the stack. To fulfill Go's semantics, one needs to map Go's single add instruction to 4 WebAssembly instructions: - Push the value of local variable A to the stack - Push the value of local variable B to the stack - Do addition - Write value from stack to local variable C Now consider that B was set to the constant 42 before the addition: - Push constant 42 to the stack - Write value from stack to local variable B This works, but is inefficient. Instead, the stack is used directly by inlining instructions if possible. With inlining it becomes: - Push the value of local variable A to the stack (add) - Push constant 42 to the stack (constant) - Do addition (add) - Write value from stack to local variable C (add) Note that the two SSA instructions can not be generated sequentially anymore, because their WebAssembly instructions are interleaved. Design doc: https://docs.google.com/document/d/131vjr4DH6JFnb-blm_uRdaC0_Nv3OUwjEY5qVCxCup4 Updates #18892 Change-Id: Ie35e1c0bebf4985fddda0d6330eb2066f9ad6dec Reviewed-on: https://go-review.googlesource.com/103535 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/sizeof_test.go')
-rw-r--r--src/cmd/compile/internal/ssa/sizeof_test.go2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/ssa/sizeof_test.go b/src/cmd/compile/internal/ssa/sizeof_test.go
index f8bbed91b4..449788d32a 100644
--- a/src/cmd/compile/internal/ssa/sizeof_test.go
+++ b/src/cmd/compile/internal/ssa/sizeof_test.go
@@ -22,7 +22,7 @@ func TestSizeof(t *testing.T) {
_32bit uintptr // size on 32bit platforms
_64bit uintptr // size on 64bit platforms
}{
- {Value{}, 68, 112},
+ {Value{}, 72, 112},
{Block{}, 152, 288},
{LocalSlot{}, 32, 48},
{valState{}, 28, 40},