mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: enable stack maps everywhere except unsafe points
This modifies issafepoint in liveness analysis to report almost every operation as a safe point. There are four things we don't mark as safe-points: 1. Runtime code (other than at calls). 2. go:nosplit functions (other than at calls). 3. Instructions between the load of the write barrier-enabled flag and the write. 4. Instructions leading up to a uintptr -> unsafe.Pointer conversion. We'll optimize this in later CLs: name old time/op new time/op delta Template 185ms ± 2% 190ms ± 2% +2.95% (p=0.000 n=10+10) Unicode 96.3ms ± 3% 96.4ms ± 1% ~ (p=0.905 n=10+9) GoTypes 658ms ± 0% 669ms ± 1% +1.72% (p=0.000 n=10+9) Compiler 3.14s ± 1% 3.18s ± 1% +1.56% (p=0.000 n=9+10) SSA 7.41s ± 2% 7.59s ± 1% +2.48% (p=0.000 n=9+10) Flate 126ms ± 1% 128ms ± 1% +2.08% (p=0.000 n=10+10) GoParser 153ms ± 1% 157ms ± 2% +2.38% (p=0.000 n=10+10) Reflect 437ms ± 1% 442ms ± 1% +0.98% (p=0.001 n=10+10) Tar 178ms ± 1% 179ms ± 1% +0.67% (p=0.035 n=10+9) XML 223ms ± 1% 229ms ± 1% +2.58% (p=0.000 n=10+10) [Geo mean] 394ms 401ms +1.75% No effect on binary size because we're not yet emitting these extra safe points. For #24543. Change-Id: I16a1eebb9183cad7cef9d53c0fd21a973cad6859 Reviewed-on: https://go-review.googlesource.com/109348 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
d7d9df8a5b
commit
a367f44c18
5 changed files with 207 additions and 11 deletions
|
|
@ -111,6 +111,7 @@ func writebarrier(f *Func) {
|
|||
// order values in store order
|
||||
b.Values = storeOrder(b.Values, sset, storeNumber)
|
||||
|
||||
firstSplit := true
|
||||
again:
|
||||
// find the start and end of the last contiguous WB store sequence.
|
||||
// a branch will be inserted there. values after it will be moved
|
||||
|
|
@ -268,6 +269,23 @@ func writebarrier(f *Func) {
|
|||
w.Block = bEnd
|
||||
}
|
||||
|
||||
// Preemption is unsafe between loading the write
|
||||
// barrier-enabled flag and performing the write
|
||||
// because that would allow a GC phase transition,
|
||||
// which would invalidate the flag. Remember the
|
||||
// conditional block so liveness analysis can disable
|
||||
// safe-points. This is somewhat subtle because we're
|
||||
// splitting b bottom-up.
|
||||
if firstSplit {
|
||||
// Add b itself.
|
||||
b.Func.WBLoads = append(b.Func.WBLoads, b)
|
||||
firstSplit = false
|
||||
} else {
|
||||
// We've already split b, so we just pushed a
|
||||
// write barrier test into bEnd.
|
||||
b.Func.WBLoads = append(b.Func.WBLoads, bEnd)
|
||||
}
|
||||
|
||||
// if we have more stores in this block, do this block again
|
||||
if nWBops > 0 {
|
||||
goto again
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue