mirror of
https://github.com/golang/go.git
synced 2024-09-21 10:28:27 +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
@ -2227,6 +2227,7 @@ func (e *edgeState) findRegFor(typ Type) Location {
|
|||||||
// 1) an unused register
|
// 1) an unused register
|
||||||
// 2) a non-unique register not holding a final value
|
// 2) a non-unique register not holding a final value
|
||||||
// 3) a non-unique register
|
// 3) a non-unique register
|
||||||
|
// 4) TODO: a register holding a rematerializeable value
|
||||||
x := m &^ e.usedRegs
|
x := m &^ e.usedRegs
|
||||||
if x != 0 {
|
if x != 0 {
|
||||||
return &e.s.registers[pickReg(x)]
|
return &e.s.registers[pickReg(x)]
|
||||||
@ -2252,10 +2253,12 @@ func (e *edgeState) findRegFor(typ Type) Location {
|
|||||||
a := e.cache[vid]
|
a := e.cache[vid]
|
||||||
for _, c := range a {
|
for _, c := range a {
|
||||||
if r, ok := e.s.f.getHome(c.ID).(*Register); ok && m>>uint(r.num)&1 != 0 {
|
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)
|
if !c.rematerializeable() {
|
||||||
e.set(t, vid, x, false, c.Pos)
|
x := e.p.NewValue1(c.Pos, OpStoreReg, c.Type, c)
|
||||||
if e.s.f.pass.debug > regDebug {
|
e.set(t, vid, x, false, c.Pos)
|
||||||
fmt.Printf(" SPILL %s->%s %s\n", r.Name(), t.Name(), x.LongString())
|
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
|
// r will now be overwritten by the caller. At some point
|
||||||
// later, the newly saved value will be moved back to its
|
// later, the newly saved value will be moved back to its
|
||||||
|
51
test/fixedbugs/issue19515.go
Normal file
51
test/fixedbugs/issue19515.go
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
// compile
|
||||||
|
|
||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Issue 19515: compiler panics on spilling int128 constant.
|
||||||
|
|
||||||
|
package x
|
||||||
|
|
||||||
|
type VScrollPanel struct {
|
||||||
|
x, y int
|
||||||
|
}
|
||||||
|
|
||||||
|
type Color struct {
|
||||||
|
R, G, B, A float32
|
||||||
|
}
|
||||||
|
|
||||||
|
func maxF(a, b float32) float32 {
|
||||||
|
if a > b {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
type TransformMatrix [6]float32
|
||||||
|
|
||||||
|
type Paint struct {
|
||||||
|
xform TransformMatrix
|
||||||
|
feather float32
|
||||||
|
innerColor Color
|
||||||
|
outerColor Color
|
||||||
|
}
|
||||||
|
|
||||||
|
func BoxGradient(x, y, w, h, f float32, iColor, oColor Color) Paint {
|
||||||
|
return Paint{
|
||||||
|
xform: TransformMatrix{9, 0, 0, 0, x, y},
|
||||||
|
feather: maxF(1.0, f),
|
||||||
|
innerColor: iColor,
|
||||||
|
outerColor: oColor,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *VScrollPanel) Draw() {
|
||||||
|
x := float32(v.x)
|
||||||
|
y := float32(v.y)
|
||||||
|
|
||||||
|
BoxGradient(x+x-2, y-1, 0, 0, 0, Color{}, Color{})
|
||||||
|
BoxGradient(x+y-2, y-1, 0, 0, 0, Color{}, Color{})
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user