]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: optimize ssa if blocks for wasm architecture
authorAgniva De Sarker <agnivade@yahoo.co.in>
Sat, 14 Sep 2019 15:28:30 +0000 (20:58 +0530)
committerAgniva De Sarker <agniva.quicksilver@gmail.com>
Sat, 21 Sep 2019 03:20:07 +0000 (03:20 +0000)
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>
src/cmd/compile/internal/wasm/ssa.go

index 5b366eb08b909fc1e2d8c6c35e2c1258649c65b4..8584fca9be9990e1ace6f87f7061728e12a23c9c 100644 (file)
@@ -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")