mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: make link register allocatable in non-leaf functions
We save and restore the link register in non-leaf functions because it is clobbered by CALLs. It is therefore available for general purpose use. Only enabled on s390x currently. The RC4 benchmarks in particular benefit from the extra register: name old speed new speed delta RC4_128 243MB/s ± 2% 341MB/s ± 2% +40.46% (p=0.008 n=5+5) RC4_1K 267MB/s ± 0% 359MB/s ± 1% +34.32% (p=0.008 n=5+5) RC4_8K 271MB/s ± 0% 362MB/s ± 0% +33.61% (p=0.008 n=5+5) Change-Id: Id23bff95e771da9425353da2f32668b8e34ba09f Reviewed-on: https://go-review.googlesource.com/30597 Reviewed-by: Cherry Zhang <cherryyz@google.com> Run-TryBot: Michael Munday <munday@ca.ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
809a1de1ac
commit
15817e409b
11 changed files with 358 additions and 315 deletions
|
|
@ -460,6 +460,18 @@ func (s *regAllocState) allocValToReg(v *Value, mask regMask, nospill bool, line
|
|||
return c
|
||||
}
|
||||
|
||||
// isLeaf reports whether f performs any calls.
|
||||
func isLeaf(f *Func) bool {
|
||||
for _, b := range f.Blocks {
|
||||
for _, v := range b.Values {
|
||||
if opcodeTable[v.Op].call {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *regAllocState) init(f *Func) {
|
||||
s.f = f
|
||||
s.registers = f.Config.registers
|
||||
|
|
@ -510,6 +522,12 @@ func (s *regAllocState) init(f *Func) {
|
|||
s.allocatable &^= 1 << 12 // R12
|
||||
}
|
||||
}
|
||||
if s.f.Config.LinkReg != -1 {
|
||||
if isLeaf(f) {
|
||||
// Leaf functions don't save/restore the link register.
|
||||
s.allocatable &^= 1 << uint(s.f.Config.LinkReg)
|
||||
}
|
||||
}
|
||||
if s.f.Config.ctxt.Flag_dynlink {
|
||||
switch s.f.Config.arch {
|
||||
case "amd64":
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue