aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/wasm
diff options
context:
space:
mode:
authorAgniva De Sarker <agnivade@yahoo.co.in>2019-09-14 20:58:30 +0530
committerAgniva De Sarker <agniva.quicksilver@gmail.com>2019-09-21 03:20:07 +0000
commit9c384cc570fa964cea1fecc061b17d6858cbcc0d (patch)
treeaadab2fec13f697f1b674d4dcb9f760a4fd80443 /src/cmd/compile/internal/wasm
parentf1b6d1016ee8d1c25999bc69bd73558476e2cf34 (diff)
downloadgo-9c384cc570fa964cea1fecc061b17d6858cbcc0d.tar.gz
go-9c384cc570fa964cea1fecc061b17d6858cbcc0d.zip
cmd/compile: optimize ssa if blocks for wasm architecture
Check for the next block and accordingly place the successor blocks. This saves an additional jump instruction if the next block is any one of the successor blocks. While at it, inline the logic of goToBlock. Reduces the size of pkg/js_wasm by 264 bytes. Change-Id: I671ac4322e6edcb0d7e590dcca27e074268068d5 Reviewed-on: https://go-review.googlesource.com/c/go/+/195204 Run-TryBot: Agniva De Sarker <agniva.quicksilver@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Richard Musiol <neelance@gmail.com>
Diffstat (limited to 'src/cmd/compile/internal/wasm')
-rw-r--r--src/cmd/compile/internal/wasm/ssa.go45
1 files changed, 29 insertions, 16 deletions
diff --git a/src/cmd/compile/internal/wasm/ssa.go b/src/cmd/compile/internal/wasm/ssa.go
index 5b366eb08b..8584fca9be 100644
--- a/src/cmd/compile/internal/wasm/ssa.go
+++ b/src/cmd/compile/internal/wasm/ssa.go
@@ -68,24 +68,35 @@ func ssaMarkMoves(s *gc.SSAGenState, b *ssa.Block) {
}
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
- goToBlock := func(block *ssa.Block, canFallthrough bool) {
- if canFallthrough && block == next {
- return
- }
- s.Br(obj.AJMP, block)
- }
-
switch b.Kind {
case ssa.BlockPlain:
- goToBlock(b.Succs[0].Block(), true)
+ if next != b.Succs[0].Block() {
+ s.Br(obj.AJMP, b.Succs[0].Block())
+ }
case ssa.BlockIf:
- getValue32(s, b.Control)
- s.Prog(wasm.AI32Eqz)
- s.Prog(wasm.AIf)
- goToBlock(b.Succs[1].Block(), false)
- s.Prog(wasm.AEnd)
- goToBlock(b.Succs[0].Block(), true)
+ switch next {
+ case b.Succs[0].Block():
+ // if false, jump to b.Succs[1]
+ getValue32(s, b.Control)
+ s.Prog(wasm.AI32Eqz)
+ s.Prog(wasm.AIf)
+ s.Br(obj.AJMP, b.Succs[1].Block())
+ s.Prog(wasm.AEnd)
+ case b.Succs[1].Block():
+ // if true, jump to b.Succs[0]
+ getValue32(s, b.Control)
+ s.Prog(wasm.AIf)
+ s.Br(obj.AJMP, b.Succs[0].Block())
+ s.Prog(wasm.AEnd)
+ default:
+ // if true, jump to b.Succs[0], else jump to b.Succs[1]
+ getValue32(s, b.Control)
+ s.Prog(wasm.AIf)
+ s.Br(obj.AJMP, b.Succs[0].Block())
+ s.Prog(wasm.AEnd)
+ s.Br(obj.AJMP, b.Succs[1].Block())
+ }
case ssa.BlockRet:
s.Prog(obj.ARET)
@@ -104,9 +115,11 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
s.Prog(wasm.AI64Eqz)
s.Prog(wasm.AI32Eqz)
s.Prog(wasm.AIf)
- goToBlock(b.Succs[1].Block(), false)
+ s.Br(obj.AJMP, b.Succs[1].Block())
s.Prog(wasm.AEnd)
- goToBlock(b.Succs[0].Block(), true)
+ if next != b.Succs[0].Block() {
+ s.Br(obj.AJMP, b.Succs[0].Block())
+ }
default:
panic("unexpected block")