From: Keith Randall Date: Tue, 26 Jan 2016 23:55:05 +0000 (-0800) Subject: [dev.ssa] cmd/compile: tweak init function prologue X-Git-Tag: go1.7beta1~1623^2^2~76 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f3575a9561319d2398ab01dd0375e0909e2f2aa8;p=gostls13.git [dev.ssa] cmd/compile: tweak init function prologue We used to compare the init state with == to 0 and 2, which requires 2 comparisons. Instead, compare with 1 and use <, ==. That requires only one comparison. This isn't a big deal performance-wise, as it is just init code. But there is a fair amount of init code, so this should help a bit with code size. Change-Id: I4a2765f1005776f0edce28ac143f4b7596d95a68 Reviewed-on: https://go-review.googlesource.com/18948 Reviewed-by: David Chase --- diff --git a/src/cmd/compile/internal/gc/init.go b/src/cmd/compile/internal/gc/init.go index 6071ab44f0..f4a4700049 100644 --- a/src/cmd/compile/internal/gc/init.go +++ b/src/cmd/compile/internal/gc/init.go @@ -33,10 +33,10 @@ func renameinit() *Sym { // hand-craft the following initialization code // var initdone· uint8 (1) // func init() (2) -// if initdone· != 0 { (3) -// if initdone· == 2 (4) -// return -// throw(); (5) +// if initdone· > 1 { (3) +// return (3a) +// if initdone· == 1 { (4) +// throw(); (4a) // } // initdone· = 1; (6) // // over all matching imported symbols @@ -118,22 +118,21 @@ func fninit(n *NodeList) { // (3) a := Nod(OIF, nil, nil) - - a.Left = Nod(ONE, gatevar, Nodintconst(0)) + a.Left = Nod(OGT, gatevar, Nodintconst(1)) + a.Likely = 1 r = list(r, a) + // (3a) + a.Nbody = list1(Nod(ORETURN, nil, nil)) // (4) b := Nod(OIF, nil, nil) - - b.Left = Nod(OEQ, gatevar, Nodintconst(2)) - b.Nbody = list1(Nod(ORETURN, nil, nil)) - a.Nbody = list1(b) - - // (5) - b = syslook("throwinit", 0) - - b = Nod(OCALL, b, nil) - a.Nbody = list(a.Nbody, b) + b.Left = Nod(OEQ, gatevar, Nodintconst(1)) + // this actually isn't likely, but code layout is better + // like this: no JMP needed after the call. + b.Likely = 1 + r = list(r, b) + // (4a) + b.Nbody = list1(Nod(OCALL, syslook("throwinit", 0), nil)) // (6) a = Nod(OAS, gatevar, Nodintconst(1))