mirror of
https://github.com/golang/go.git
synced 2025-05-30 19:52:53 +00:00
cmd/compile: free value earlier in nilcheck
When we remove a nil check, add it back to the free Value pool immediately. Fixes #18732 Change-Id: I8d644faabbfb52157d3f2d071150ff0342ac28dc Reviewed-on: https://go-review.googlesource.com/58810 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
This commit is contained in:
parent
3723d08022
commit
770d8d8207
@ -175,7 +175,7 @@ func (f *Func) LogStat(key string, args ...interface{}) {
|
|||||||
f.Warnl(f.Entry.Pos, "\t%s\t%s%s\t%s", n, key, value, f.Name)
|
f.Warnl(f.Entry.Pos, "\t%s\t%s%s\t%s", n, key, value, f.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// freeValue frees a value. It must no longer be referenced.
|
// freeValue frees a value. It must no longer be referenced or have any args.
|
||||||
func (f *Func) freeValue(v *Value) {
|
func (f *Func) freeValue(v *Value) {
|
||||||
if v.Block == nil {
|
if v.Block == nil {
|
||||||
f.Fatalf("trying to free an already freed value")
|
f.Fatalf("trying to free an already freed value")
|
||||||
@ -183,6 +183,9 @@ func (f *Func) freeValue(v *Value) {
|
|||||||
if v.Uses != 0 {
|
if v.Uses != 0 {
|
||||||
f.Fatalf("value %s still has %d uses", v, v.Uses)
|
f.Fatalf("value %s still has %d uses", v, v.Uses)
|
||||||
}
|
}
|
||||||
|
if len(v.Args) != 0 {
|
||||||
|
f.Fatalf("value %s still has %d args", v, len(v.Args))
|
||||||
|
}
|
||||||
// Clear everything but ID (which we reuse).
|
// Clear everything but ID (which we reuse).
|
||||||
id := v.ID
|
id := v.ID
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ func nilcheckelim(f *Func) {
|
|||||||
f.Warnl(v.Pos, "removed nil check")
|
f.Warnl(v.Pos, "removed nil check")
|
||||||
}
|
}
|
||||||
v.reset(OpUnknown)
|
v.reset(OpUnknown)
|
||||||
// TODO: f.freeValue(v)
|
f.freeValue(v)
|
||||||
i--
|
i--
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -1569,7 +1569,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
|||||||
if s.f.pass.debug > regDebug {
|
if s.f.pass.debug > regDebug {
|
||||||
fmt.Printf("delete copied value %s\n", c.LongString())
|
fmt.Printf("delete copied value %s\n", c.LongString())
|
||||||
}
|
}
|
||||||
c.Args[0].Uses--
|
c.RemoveArg(0)
|
||||||
f.freeValue(c)
|
f.freeValue(c)
|
||||||
delete(s.copies, c)
|
delete(s.copies, c)
|
||||||
progress = true
|
progress = true
|
||||||
|
Loading…
x
Reference in New Issue
Block a user