mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: don't spill rematerializeable value when resolving merge edges
Fixes #19515. Change-Id: I4bcce152cef52d00fbb5ab4daf72a6e742bae27c Reviewed-on: https://go-review.googlesource.com/38158 Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
2d78538c12
commit
8a44c8efae
2 changed files with 58 additions and 4 deletions
|
|
@ -2227,6 +2227,7 @@ func (e *edgeState) findRegFor(typ Type) Location {
|
|||
// 1) an unused register
|
||||
// 2) a non-unique register not holding a final value
|
||||
// 3) a non-unique register
|
||||
// 4) TODO: a register holding a rematerializeable value
|
||||
x := m &^ e.usedRegs
|
||||
if x != 0 {
|
||||
return &e.s.registers[pickReg(x)]
|
||||
|
|
@ -2252,10 +2253,12 @@ func (e *edgeState) findRegFor(typ Type) Location {
|
|||
a := e.cache[vid]
|
||||
for _, c := range a {
|
||||
if r, ok := e.s.f.getHome(c.ID).(*Register); ok && m>>uint(r.num)&1 != 0 {
|
||||
x := e.p.NewValue1(c.Pos, OpStoreReg, c.Type, c)
|
||||
e.set(t, vid, x, false, c.Pos)
|
||||
if e.s.f.pass.debug > regDebug {
|
||||
fmt.Printf(" SPILL %s->%s %s\n", r.Name(), t.Name(), x.LongString())
|
||||
if !c.rematerializeable() {
|
||||
x := e.p.NewValue1(c.Pos, OpStoreReg, c.Type, c)
|
||||
e.set(t, vid, x, false, c.Pos)
|
||||
if e.s.f.pass.debug > regDebug {
|
||||
fmt.Printf(" SPILL %s->%s %s\n", r.Name(), t.Name(), x.LongString())
|
||||
}
|
||||
}
|
||||
// r will now be overwritten by the caller. At some point
|
||||
// later, the newly saved value will be moved back to its
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue