aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2016-01-26 15:55:05 -0800
committerKeith Randall <khr@golang.org>2016-01-29 20:22:35 +0000
commitf3575a9561319d2398ab01dd0375e0909e2f2aa8 (patch)
treecc29992c5457e7838cb084f5ba661151ad2c5ff9 /src/cmd
parentf94e0745b3dc922ca7f3d15507e33ed6d3a65ee6 (diff)
downloadgo-f3575a9561319d2398ab01dd0375e0909e2f2aa8.tar.xz
[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 <drchase@google.com>
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/compile/internal/gc/init.go31
1 files changed, 15 insertions, 16 deletions
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))