mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
Merge "[dev.typeparams] all: merge dev.regabi (063c72f) into dev.typeparams" into dev.typeparams
This commit is contained in:
commit
3432d24bab
5 changed files with 45 additions and 6 deletions
|
|
@ -781,6 +781,16 @@ func (e *escape) exprSkipInit(k hole, n ir.Node) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, n := range fn.Dcl {
|
||||||
|
// Add locations for local variables of the
|
||||||
|
// closure, if needed, in case we're not including
|
||||||
|
// the closure func in the batch for escape
|
||||||
|
// analysis (happens for escape analysis called
|
||||||
|
// from reflectdata.methodWrapper)
|
||||||
|
if n.Op() == ir.ONAME && n.Opt == nil {
|
||||||
|
e.with(fn).newLoc(n, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
e.walkFunc(fn)
|
e.walkFunc(fn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -361,10 +361,16 @@ func (v *hairyVisitor) doNode(n ir.Node) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(danscales) - fix some bugs when budget is lowered below 30
|
// TODO(danscales) - fix some bugs when budget is lowered below 15
|
||||||
// Maybe make budget proportional to number of closure variables, e.g.:
|
// Maybe make budget proportional to number of closure variables, e.g.:
|
||||||
//v.budget -= int32(len(n.(*ir.ClosureExpr).Func.ClosureVars) * 3)
|
//v.budget -= int32(len(n.(*ir.ClosureExpr).Func.ClosureVars) * 3)
|
||||||
v.budget -= 30
|
v.budget -= 15
|
||||||
|
// Scan body of closure (which DoChildren doesn't automatically
|
||||||
|
// do) to check for disallowed ops in the body and include the
|
||||||
|
// body in the budget.
|
||||||
|
if doList(n.(*ir.ClosureExpr).Func.Body, v.do) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
case ir.ORANGE,
|
case ir.ORANGE,
|
||||||
ir.OSELECT,
|
ir.OSELECT,
|
||||||
|
|
|
||||||
|
|
@ -176,6 +176,11 @@ func resolveImportPath(path string) (string, error) {
|
||||||
|
|
||||||
// TODO(mdempsky): Return an error instead.
|
// TODO(mdempsky): Return an error instead.
|
||||||
func importfile(decl *syntax.ImportDecl) *types.Pkg {
|
func importfile(decl *syntax.ImportDecl) *types.Pkg {
|
||||||
|
if decl.Path.Kind != syntax.StringLit {
|
||||||
|
base.Errorf("import path must be a string")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
path, err := strconv.Unquote(decl.Path.Value)
|
path, err := strconv.Unquote(decl.Path.Value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
base.Errorf("import path must be a string")
|
base.Errorf("import path must be a string")
|
||||||
|
|
|
||||||
|
|
@ -299,7 +299,7 @@ func elimUnreadAutos(f *Func) {
|
||||||
// Loop over all ops that affect autos taking note of which
|
// Loop over all ops that affect autos taking note of which
|
||||||
// autos we need and also stores that we might be able to
|
// autos we need and also stores that we might be able to
|
||||||
// eliminate.
|
// eliminate.
|
||||||
seen := make(map[*ir.Name]bool)
|
var seen ir.NameSet
|
||||||
var stores []*Value
|
var stores []*Value
|
||||||
for _, b := range f.Blocks {
|
for _, b := range f.Blocks {
|
||||||
for _, v := range b.Values {
|
for _, v := range b.Values {
|
||||||
|
|
@ -317,7 +317,7 @@ func elimUnreadAutos(f *Func) {
|
||||||
// If we haven't seen the auto yet
|
// If we haven't seen the auto yet
|
||||||
// then this might be a store we can
|
// then this might be a store we can
|
||||||
// eliminate.
|
// eliminate.
|
||||||
if !seen[n] {
|
if !seen.Has(n) {
|
||||||
stores = append(stores, v)
|
stores = append(stores, v)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
@ -327,7 +327,7 @@ func elimUnreadAutos(f *Func) {
|
||||||
// because dead loads haven't been
|
// because dead loads haven't been
|
||||||
// eliminated yet.
|
// eliminated yet.
|
||||||
if v.Uses > 0 {
|
if v.Uses > 0 {
|
||||||
seen[n] = true
|
seen.Add(n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -336,7 +336,7 @@ func elimUnreadAutos(f *Func) {
|
||||||
// Eliminate stores to unread autos.
|
// Eliminate stores to unread autos.
|
||||||
for _, store := range stores {
|
for _, store := range stores {
|
||||||
n, _ := store.Aux.(*ir.Name)
|
n, _ := store.Aux.(*ir.Name)
|
||||||
if seen[n] {
|
if seen.Has(n) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
18
test/closure6.go
Normal file
18
test/closure6.go
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
// compile
|
||||||
|
|
||||||
|
// Copyright 2020 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.
|
||||||
|
|
||||||
|
package p
|
||||||
|
|
||||||
|
type Float64Slice []float64
|
||||||
|
|
||||||
|
func (a Float64Slice) Search1(x float64) int {
|
||||||
|
f := func(q int) bool { return a[q] >= x }
|
||||||
|
i := 0
|
||||||
|
if !f(3) {
|
||||||
|
i = 5
|
||||||
|
}
|
||||||
|
return i
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue