aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/regalloc.go
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2017-03-14 18:21:23 -0400
committerCherry Zhang <cherryyz@google.com>2017-03-14 22:55:52 +0000
commit8a44c8efaefbbda6dd7ab4ee9a5e449fefbf5e1a (patch)
tree08ec3c066e1c4fd5c33423850af652f57cd0c291 /src/cmd/compile/internal/ssa/regalloc.go
parent2d78538c12ed63cc931b552c9c98b7c93b91b21d (diff)
downloadgo-8a44c8efaefbbda6dd7ab4ee9a5e449fefbf5e1a.tar.xz
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>
Diffstat (limited to 'src/cmd/compile/internal/ssa/regalloc.go')
-rw-r--r--src/cmd/compile/internal/ssa/regalloc.go11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/ssa/regalloc.go b/src/cmd/compile/internal/ssa/regalloc.go
index aac950a76b..e40fe17ad4 100644
--- a/src/cmd/compile/internal/ssa/regalloc.go
+++ b/src/cmd/compile/internal/ssa/regalloc.go
@@ -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