Skip to content

Commit 9c384cc

Browse files
committed
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 <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Richard Musiol <[email protected]>
1 parent f1b6d10 commit 9c384cc

File tree

1 file changed

+29
-16
lines changed
  • src/cmd/compile/internal/wasm

1 file changed

+29
-16
lines changed

src/cmd/compile/internal/wasm/ssa.go

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,24 +68,35 @@ func ssaMarkMoves(s *gc.SSAGenState, b *ssa.Block) {
6868
}
6969

7070
func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
71-
goToBlock := func(block *ssa.Block, canFallthrough bool) {
72-
if canFallthrough && block == next {
73-
return
74-
}
75-
s.Br(obj.AJMP, block)
76-
}
77-
7871
switch b.Kind {
7972
case ssa.BlockPlain:
80-
goToBlock(b.Succs[0].Block(), true)
73+
if next != b.Succs[0].Block() {
74+
s.Br(obj.AJMP, b.Succs[0].Block())
75+
}
8176

8277
case ssa.BlockIf:
83-
getValue32(s, b.Control)
84-
s.Prog(wasm.AI32Eqz)
85-
s.Prog(wasm.AIf)
86-
goToBlock(b.Succs[1].Block(), false)
87-
s.Prog(wasm.AEnd)
88-
goToBlock(b.Succs[0].Block(), true)
78+
switch next {
79+
case b.Succs[0].Block():
80+
// if false, jump to b.Succs[1]
81+
getValue32(s, b.Control)
82+
s.Prog(wasm.AI32Eqz)
83+
s.Prog(wasm.AIf)
84+
s.Br(obj.AJMP, b.Succs[1].Block())
85+
s.Prog(wasm.AEnd)
86+
case b.Succs[1].Block():
87+
// if true, jump to b.Succs[0]
88+
getValue32(s, b.Control)
89+
s.Prog(wasm.AIf)
90+
s.Br(obj.AJMP, b.Succs[0].Block())
91+
s.Prog(wasm.AEnd)
92+
default:
93+
// if true, jump to b.Succs[0], else jump to b.Succs[1]
94+
getValue32(s, b.Control)
95+
s.Prog(wasm.AIf)
96+
s.Br(obj.AJMP, b.Succs[0].Block())
97+
s.Prog(wasm.AEnd)
98+
s.Br(obj.AJMP, b.Succs[1].Block())
99+
}
89100

90101
case ssa.BlockRet:
91102
s.Prog(obj.ARET)
@@ -104,9 +115,11 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) {
104115
s.Prog(wasm.AI64Eqz)
105116
s.Prog(wasm.AI32Eqz)
106117
s.Prog(wasm.AIf)
107-
goToBlock(b.Succs[1].Block(), false)
118+
s.Br(obj.AJMP, b.Succs[1].Block())
108119
s.Prog(wasm.AEnd)
109-
goToBlock(b.Succs[0].Block(), true)
120+
if next != b.Succs[0].Block() {
121+
s.Br(obj.AJMP, b.Succs[0].Block())
122+
}
110123

111124
default:
112125
panic("unexpected block")

0 commit comments

Comments
 (0)