]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: tweak init function prologue
authorKeith Randall <khr@golang.org>
Tue, 26 Jan 2016 23:55:05 +0000 (15:55 -0800)
committerKeith Randall <khr@golang.org>
Fri, 29 Jan 2016 20:22:35 +0000 (20:22 +0000)
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 <drchase@google.com>
src/cmd/compile/internal/gc/init.go

index 6071ab44f0d4c15edc9dc89df6719cefa517ac75..f4a4700049d107d2f3dee3aef38408f6fb37b66b 100644 (file)
@@ -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))