Commit 82625649 authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

cmd/internal/obj/x86: estimate text size

We can’t perfectly predict how large the function
will be, but we can make a safe overestimate.
No significant CPU time changes.

name       old alloc/op    new alloc/op    delta
Template      67.7MB ± 0%     67.5MB ± 0%   -0.24%          (p=0.029 n=4+4)
Unicode       43.9MB ± 0%     43.8MB ± 0%   -0.13%          (p=0.029 n=4+4)
GoTypes        244MB ± 0%      244MB ± 0%   -0.28%          (p=0.029 n=4+4)
Compiler      1.05GB ± 0%     1.05GB ± 0%   -0.38%          (p=0.029 n=4+4)

name       old allocs/op   new allocs/op   delta
Template        795k ± 0%       794k ± 0%   -0.14%          (p=0.029 n=4+4)
Unicode         569k ± 0%       569k ± 0%     ~             (p=0.114 n=4+4)
GoTypes        2.59M ± 0%      2.58M ± 0%   -0.11%          (p=0.029 n=4+4)
Compiler       11.0M ± 0%      11.0M ± 0%   -0.09%          (p=0.029 n=4+4)

Passes toolstash -cmp.

Change-Id: I0a92ab04cba7520540ec58fe7189666d0e771454
Reviewed-on: https://go-review.googlesource.com/20771Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
parent fb950cd7
...@@ -53,6 +53,20 @@ func (s *LSym) Grow(lsiz int64) { ...@@ -53,6 +53,20 @@ func (s *LSym) Grow(lsiz int64) {
s.P = s.P[:siz] s.P = s.P[:siz]
} }
// GrowCap increases the capacity of s.P to c.
func (s *LSym) GrowCap(c int64) {
if int64(cap(s.P)) >= c {
return
}
if s.P == nil {
s.P = make([]byte, 0, c)
return
}
b := make([]byte, len(s.P), c)
copy(b, s.P)
s.P = b
}
// prepwrite prepares to write data of size siz into s at offset off. // prepwrite prepares to write data of size siz into s at offset off.
func (s *LSym) prepwrite(ctxt *Link, off int64, siz int) { func (s *LSym) prepwrite(ctxt *Link, off int64, siz int) {
if off < 0 || siz < 0 || off >= 1<<30 { if off < 0 || siz < 0 || off >= 1<<30 {
......
...@@ -1796,7 +1796,9 @@ func span6(ctxt *obj.Link, s *obj.LSym) { ...@@ -1796,7 +1796,9 @@ func span6(ctxt *obj.Link, s *obj.LSym) {
} }
var q *obj.Prog var q *obj.Prog
var count int64 // rough count of number of instructions
for p := s.Text; p != nil; p = p.Link { for p := s.Text; p != nil; p = p.Link {
count++
p.Back = 2 // use short branches first time through p.Back = 2 // use short branches first time through
q = p.Pcond q = p.Pcond
if q != nil && (q.Back&2 != 0) { if q != nil && (q.Back&2 != 0) {
...@@ -1821,6 +1823,7 @@ func span6(ctxt *obj.Link, s *obj.LSym) { ...@@ -1821,6 +1823,7 @@ func span6(ctxt *obj.Link, s *obj.LSym) {
} }
} }
} }
s.GrowCap(count * 5) // preallocate roughly 5 bytes per instruction
n := 0 n := 0
var c int32 var c int32
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment