mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: add recursive-invalidate Value method, use in expand_calls
This removes more unused values during transformation. Leaving them in the tree can create type conflicts in OpArg* references. Updates #40724. Updates #44816. Fixes #45417. Change-Id: I07dcb7b4b2bf8d79e22e0543cb2fb52c2ececb96 Reviewed-on: https://go-review.googlesource.com/c/go/+/308589 Trust: David Chase <drchase@google.com> Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
parent
7e583806d8
commit
a9e475a15a
2 changed files with 36 additions and 4 deletions
|
|
@ -1015,7 +1015,7 @@ func (x *expandState) rewriteArgs(v *Value, firstArg int) {
|
||||||
if x.debug {
|
if x.debug {
|
||||||
x.Printf("...marking %v unused\n", a.LongString())
|
x.Printf("...marking %v unused\n", a.LongString())
|
||||||
}
|
}
|
||||||
a.reset(OpInvalid)
|
a.invalidateRecursively()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1140,7 +1140,7 @@ func expandCalls(f *Func) {
|
||||||
if x.debug {
|
if x.debug {
|
||||||
x.Printf("...marking %v unused\n", a.LongString())
|
x.Printf("...marking %v unused\n", a.LongString())
|
||||||
}
|
}
|
||||||
a.reset(OpInvalid)
|
a.invalidateRecursively()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if x.debug {
|
if x.debug {
|
||||||
|
|
@ -1343,6 +1343,9 @@ func expandCalls(f *Func) {
|
||||||
if dupe == nil {
|
if dupe == nil {
|
||||||
x.commonSelectors[sk] = v
|
x.commonSelectors[sk] = v
|
||||||
} else if x.sdom.IsAncestorEq(dupe.Block, v.Block) {
|
} else if x.sdom.IsAncestorEq(dupe.Block, v.Block) {
|
||||||
|
if x.debug {
|
||||||
|
x.Printf("Duplicate, make %s copy of %s\n", v, dupe)
|
||||||
|
}
|
||||||
v.copyOf(dupe)
|
v.copyOf(dupe)
|
||||||
} else {
|
} else {
|
||||||
// Because values are processed in dominator order, the old common[s] will never dominate after a miss is seen.
|
// Because values are processed in dominator order, the old common[s] will never dominate after a miss is seen.
|
||||||
|
|
@ -1361,7 +1364,7 @@ func expandCalls(f *Func) {
|
||||||
x.Printf("allOrdered[%d] = b%d, %s, uses=%d\n", i, b.ID, v.LongString(), v.Uses)
|
x.Printf("allOrdered[%d] = b%d, %s, uses=%d\n", i, b.ID, v.LongString(), v.Uses)
|
||||||
}
|
}
|
||||||
if v.Uses == 0 {
|
if v.Uses == 0 {
|
||||||
v.reset(OpInvalid)
|
v.invalidateRecursively()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if v.Op == OpCopy {
|
if v.Op == OpCopy {
|
||||||
|
|
@ -1456,7 +1459,7 @@ func expandCalls(f *Func) {
|
||||||
v.SetArg(i, aa)
|
v.SetArg(i, aa)
|
||||||
for a.Uses == 0 {
|
for a.Uses == 0 {
|
||||||
b := a.Args[0]
|
b := a.Args[0]
|
||||||
a.reset(OpInvalid)
|
a.invalidateRecursively()
|
||||||
a = b
|
a = b
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -348,6 +348,35 @@ func (v *Value) reset(op Op) {
|
||||||
v.Aux = nil
|
v.Aux = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// invalidateRecursively marks a value as invalid (unused)
|
||||||
|
// and after decrementing reference counts on its Args,
|
||||||
|
// also recursively invalidates any of those whose use
|
||||||
|
// count goes to zero.
|
||||||
|
//
|
||||||
|
// BEWARE of doing this *before* you've applied intended
|
||||||
|
// updates to SSA.
|
||||||
|
func (v *Value) invalidateRecursively() {
|
||||||
|
if v.InCache {
|
||||||
|
v.Block.Func.unCache(v)
|
||||||
|
}
|
||||||
|
v.Op = OpInvalid
|
||||||
|
|
||||||
|
for _, a := range v.Args {
|
||||||
|
a.Uses--
|
||||||
|
if a.Uses == 0 {
|
||||||
|
a.invalidateRecursively()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v.argstorage[0] = nil
|
||||||
|
v.argstorage[1] = nil
|
||||||
|
v.argstorage[2] = nil
|
||||||
|
v.Args = v.argstorage[:0]
|
||||||
|
|
||||||
|
v.AuxInt = 0
|
||||||
|
v.Aux = nil
|
||||||
|
}
|
||||||
|
|
||||||
// copyOf is called from rewrite rules.
|
// copyOf is called from rewrite rules.
|
||||||
// It modifies v to be (Copy a).
|
// It modifies v to be (Copy a).
|
||||||
//go:noinline
|
//go:noinline
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue