mirror of
https://github.com/golang/go
synced 2024-11-22 21:30:02 -07:00
[dev.regabi] cmd/compile: remove toolstash scaffolding
Now that CaptureVars is gone, we can remove the extra code in escape analysis that only served to appease toolstash -cmp. Change-Id: I8c811834f3d966e76702e2d362e3de414c94bea6 Reviewed-on: https://go-review.googlesource.com/c/go/+/281544 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
parent
9821838832
commit
cb05a0aa6a
@ -116,12 +116,6 @@ type escape struct {
|
|||||||
// label with a corresponding backwards "goto" (i.e.,
|
// label with a corresponding backwards "goto" (i.e.,
|
||||||
// unstructured loop).
|
// unstructured loop).
|
||||||
loopDepth int
|
loopDepth int
|
||||||
|
|
||||||
// loopSlop tracks how far off typecheck's "decldepth" variable
|
|
||||||
// would be from loopDepth at the same point during type checking.
|
|
||||||
// It's only needed to match CaptureVars's pessimism until it can be
|
|
||||||
// removed entirely.
|
|
||||||
loopSlop int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// An location represents an abstract location that stores a Go
|
// An location represents an abstract location that stores a Go
|
||||||
@ -131,7 +125,6 @@ type location struct {
|
|||||||
curfn *ir.Func // enclosing function
|
curfn *ir.Func // enclosing function
|
||||||
edges []edge // incoming edges
|
edges []edge // incoming edges
|
||||||
loopDepth int // loopDepth at declaration
|
loopDepth int // loopDepth at declaration
|
||||||
loopSlop int // loopSlop at declaration
|
|
||||||
|
|
||||||
// derefs and walkgen are used during walkOne to track the
|
// derefs and walkgen are used during walkOne to track the
|
||||||
// minimal dereferences from the walk root.
|
// minimal dereferences from the walk root.
|
||||||
@ -233,14 +226,10 @@ func Batch(fns []*ir.Func, recursive bool) {
|
|||||||
// can decide whether closures should capture their free variables
|
// can decide whether closures should capture their free variables
|
||||||
// by value or reference.
|
// by value or reference.
|
||||||
for _, closure := range b.closures {
|
for _, closure := range b.closures {
|
||||||
b.flowClosure(closure.k, closure.clo, false)
|
b.flowClosure(closure.k, closure.clo)
|
||||||
}
|
}
|
||||||
b.closures = nil
|
b.closures = nil
|
||||||
|
|
||||||
for _, orphan := range findOrphans(fns) {
|
|
||||||
b.flowClosure(b.blankLoc.asHole(), orphan, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, loc := range b.allLocs {
|
for _, loc := range b.allLocs {
|
||||||
if why := HeapAllocReason(loc.n); why != "" {
|
if why := HeapAllocReason(loc.n); why != "" {
|
||||||
b.flow(b.heapHole().addr(loc.n, why), loc)
|
b.flow(b.heapHole().addr(loc.n, why), loc)
|
||||||
@ -251,46 +240,6 @@ func Batch(fns []*ir.Func, recursive bool) {
|
|||||||
b.finish(fns)
|
b.finish(fns)
|
||||||
}
|
}
|
||||||
|
|
||||||
// findOrphans finds orphaned closure expressions that were originally
|
|
||||||
// contained within a function in fns, but were lost due to earlier
|
|
||||||
// optimizations.
|
|
||||||
// TODO(mdempsky): Remove after CaptureVars is gone.
|
|
||||||
func findOrphans(fns []*ir.Func) []*ir.ClosureExpr {
|
|
||||||
have := make(map[*ir.Func]bool)
|
|
||||||
for _, fn := range fns {
|
|
||||||
have[fn] = true
|
|
||||||
}
|
|
||||||
|
|
||||||
parent := func(fn *ir.Func) *ir.Func {
|
|
||||||
if len(fn.ClosureVars) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
cv := fn.ClosureVars[0]
|
|
||||||
if cv.Defn == nil {
|
|
||||||
return nil // method value wrapper
|
|
||||||
}
|
|
||||||
return cv.Outer.Curfn
|
|
||||||
}
|
|
||||||
|
|
||||||
outermost := func(fn *ir.Func) *ir.Func {
|
|
||||||
for {
|
|
||||||
outer := parent(fn)
|
|
||||||
if outer == nil {
|
|
||||||
return fn
|
|
||||||
}
|
|
||||||
fn = outer
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var orphans []*ir.ClosureExpr
|
|
||||||
for _, fn := range typecheck.Target.Decls {
|
|
||||||
if fn, ok := fn.(*ir.Func); ok && have[outermost(fn)] && !have[fn] {
|
|
||||||
orphans = append(orphans, fn.OClosure)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return orphans
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *batch) with(fn *ir.Func) *escape {
|
func (b *batch) with(fn *ir.Func) *escape {
|
||||||
return &escape{
|
return &escape{
|
||||||
batch: b,
|
batch: b,
|
||||||
@ -348,15 +297,11 @@ func (b *batch) walkFunc(fn *ir.Func) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *batch) flowClosure(k hole, clo *ir.ClosureExpr, orphan bool) {
|
func (b *batch) flowClosure(k hole, clo *ir.ClosureExpr) {
|
||||||
for _, cv := range clo.Func.ClosureVars {
|
for _, cv := range clo.Func.ClosureVars {
|
||||||
n := cv.Canonical()
|
n := cv.Canonical()
|
||||||
if n.Opt == nil && orphan {
|
|
||||||
continue // n.Curfn must have been an orphan too
|
|
||||||
}
|
|
||||||
|
|
||||||
loc := b.oldLoc(cv)
|
loc := b.oldLoc(cv)
|
||||||
if !loc.captured && !orphan {
|
if !loc.captured {
|
||||||
base.FatalfAt(cv.Pos(), "closure variable never captured: %v", cv)
|
base.FatalfAt(cv.Pos(), "closure variable never captured: %v", cv)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -454,9 +399,6 @@ func (e *escape) stmt(n ir.Node) {
|
|||||||
if base.Flag.LowerM > 2 {
|
if base.Flag.LowerM > 2 {
|
||||||
fmt.Printf("%v:%v non-looping label\n", base.FmtPos(base.Pos), n)
|
fmt.Printf("%v:%v non-looping label\n", base.FmtPos(base.Pos), n)
|
||||||
}
|
}
|
||||||
if s := n.Label.Name; !strings.HasPrefix(s, ".") && !strings.Contains(s, "·") {
|
|
||||||
e.loopSlop++
|
|
||||||
}
|
|
||||||
case looping:
|
case looping:
|
||||||
if base.Flag.LowerM > 2 {
|
if base.Flag.LowerM > 2 {
|
||||||
fmt.Printf("%v: %v looping label\n", base.FmtPos(base.Pos), n)
|
fmt.Printf("%v: %v looping label\n", base.FmtPos(base.Pos), n)
|
||||||
@ -597,7 +539,6 @@ func (e *escape) stmts(l ir.Nodes) {
|
|||||||
func (e *escape) block(l ir.Nodes) {
|
func (e *escape) block(l ir.Nodes) {
|
||||||
old := e.loopDepth
|
old := e.loopDepth
|
||||||
e.stmts(l)
|
e.stmts(l)
|
||||||
e.loopSlop += e.loopDepth - old
|
|
||||||
e.loopDepth = old
|
e.loopDepth = old
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -821,7 +762,7 @@ func (e *escape) exprSkipInit(k hole, n ir.Node) {
|
|||||||
|
|
||||||
// Ignore reassignments to the variable in straightline code
|
// Ignore reassignments to the variable in straightline code
|
||||||
// preceding the first capture by a closure.
|
// preceding the first capture by a closure.
|
||||||
if loc.loopDepth+loc.loopSlop == e.loopDepth+e.loopSlop {
|
if loc.loopDepth == e.loopDepth {
|
||||||
loc.reassigned = false
|
loc.reassigned = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1286,7 +1227,6 @@ func (e *escape) dcl(n *ir.Name) hole {
|
|||||||
}
|
}
|
||||||
loc := e.oldLoc(n)
|
loc := e.oldLoc(n)
|
||||||
loc.loopDepth = e.loopDepth
|
loc.loopDepth = e.loopDepth
|
||||||
loc.loopSlop = e.loopSlop
|
|
||||||
return loc.asHole()
|
return loc.asHole()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1323,7 +1263,6 @@ func (e *escape) newLoc(n ir.Node, transient bool) *location {
|
|||||||
n: n,
|
n: n,
|
||||||
curfn: e.curfn,
|
curfn: e.curfn,
|
||||||
loopDepth: e.loopDepth,
|
loopDepth: e.loopDepth,
|
||||||
loopSlop: e.loopSlop,
|
|
||||||
transient: transient,
|
transient: transient,
|
||||||
}
|
}
|
||||||
e.allLocs = append(e.allLocs, loc)
|
e.allLocs = append(e.allLocs, loc)
|
||||||
|
@ -154,7 +154,6 @@ func s15a8(x *[15]int64) [15]int64 {
|
|||||||
// On not-amd64, test the host architecture and os
|
// On not-amd64, test the host architecture and os
|
||||||
arches := []string{runtime.GOARCH}
|
arches := []string{runtime.GOARCH}
|
||||||
goos0 := runtime.GOOS
|
goos0 := runtime.GOOS
|
||||||
goos0 = "" + goos0 // TODO(mdempsky): Remove once CaptureVars is gone.
|
|
||||||
if runtime.GOARCH == "amd64" { // Test many things with "linux" (wasm will get "js")
|
if runtime.GOARCH == "amd64" { // Test many things with "linux" (wasm will get "js")
|
||||||
arches = []string{"arm", "arm64", "386", "amd64", "mips", "mips64", "ppc64le", "riscv64", "s390x", "wasm"}
|
arches = []string{"arm", "arm64", "386", "amd64", "mips", "mips64", "ppc64le", "riscv64", "s390x", "wasm"}
|
||||||
goos0 = "linux"
|
goos0 = "linux"
|
||||||
|
@ -41,7 +41,6 @@ func main() {
|
|||||||
n := -1
|
n := -1
|
||||||
shouldPanic("makechan: size out of range", func() { _ = make(T, n) })
|
shouldPanic("makechan: size out of range", func() { _ = make(T, n) })
|
||||||
shouldPanic("makechan: size out of range", func() { _ = make(T, int64(n)) })
|
shouldPanic("makechan: size out of range", func() { _ = make(T, int64(n)) })
|
||||||
n = 0 + n // TODO(mdempsky): Remove once CaptureVars is gone.
|
|
||||||
if ptrSize == 8 {
|
if ptrSize == 8 {
|
||||||
// Test mem > maxAlloc
|
// Test mem > maxAlloc
|
||||||
var n2 int64 = 1 << 59
|
var n2 int64 = 1 << 59
|
||||||
|
@ -22,7 +22,6 @@ func main() {
|
|||||||
testMakeInAppend(n)
|
testMakeInAppend(n)
|
||||||
|
|
||||||
var t *byte
|
var t *byte
|
||||||
n = 0 + n // TODO(mdempsky): Remove once CaptureVars is gone.
|
|
||||||
if unsafe.Sizeof(t) == 8 {
|
if unsafe.Sizeof(t) == 8 {
|
||||||
// Test mem > maxAlloc
|
// Test mem > maxAlloc
|
||||||
var n2 int64 = 1 << 59
|
var n2 int64 = 1 << 59
|
||||||
|
Loading…
Reference in New Issue
Block a user