]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[dev.typeparams] all: merge dev.regabi (063c72f) into dev.typeparams
authorMatthew Dempsky <mdempsky@google.com>
Mon, 25 Jan 2021 01:36:59 +0000 (17:36 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Mon, 25 Jan 2021 01:37:23 +0000 (17:37 -0800)
Eager re-sync-branch to keep Git history reasonably accurate, since
Git lacks a better way of encoding partial merges like CL 286172.

Conflicts:

- src/cmd/compile/internal/inline/inl.go
- src/cmd/compile/internal/noder/import.go
- src/cmd/compile/internal/noder/noder.go

Merge List:

+ 2021-01-25 063c72f06d [dev.regabi] cmd/compile: backport changes from dev.typeparams (9456804)
+ 2021-01-23 d05d6fab32 [dev.regabi] cmd/compile: replace ir.Name map with ir.NameSet for SSA 2
+ 2021-01-23 48badc5fa8 [dev.regabi] cmd/compile: fix escape analysis problem with closures
+ 2021-01-23 51e1819a8d [dev.regabi] cmd/compile: scan body of closure in tooHairy to check for disallowed nodes

Change-Id: I48c0435f7aaf56f4aec26518a7459e9d95a51e9c

src/cmd/compile/internal/escape/escape.go
src/cmd/compile/internal/inline/inl.go
src/cmd/compile/internal/noder/import.go
src/cmd/compile/internal/ssa/deadstore.go
test/closure6.go [new file with mode: 0644]

index 883e68a730c1c3fc5dbf78f637a804590427bad4..58cad73c76230082e931d41bcdaf4e52b06051b3 100644 (file)
@@ -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)
                }
 
index f0be169f561deb84513c46fe0eec7b4aebf27fe1..bbbdaa63d4b3448e8ad53d5bf93537420dc89aeb 100644 (file)
@@ -361,10 +361,16 @@ func (v *hairyVisitor) doNode(n ir.Node) bool {
                        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.:
                //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,
                ir.OSELECT,
index aa02c01cff9acdf39e98aec2e510ad40aa2ef041..89a2598833f47e13d515c2464b17d21badc6ebf0 100644 (file)
@@ -176,6 +176,11 @@ func resolveImportPath(path string) (string, error) {
 
 // TODO(mdempsky): Return an error instead.
 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)
        if err != nil {
                base.Errorf("import path must be a string")
index 0cf9931dbcd83d077890c9c0c937555abf3bc4f3..31d3f62d4e7cef68637d8c2552f22a7ad085122d 100644 (file)
@@ -299,7 +299,7 @@ func elimUnreadAutos(f *Func) {
        // Loop over all ops that affect autos taking note of which
        // autos we need and also stores that we might be able to
        // eliminate.
-       seen := make(map[*ir.Name]bool)
+       var seen ir.NameSet
        var stores []*Value
        for _, b := range f.Blocks {
                for _, v := range b.Values {
@@ -317,7 +317,7 @@ func elimUnreadAutos(f *Func) {
                                // If we haven't seen the auto yet
                                // then this might be a store we can
                                // eliminate.
-                               if !seen[n] {
+                               if !seen.Has(n) {
                                        stores = append(stores, v)
                                }
                        default:
@@ -327,7 +327,7 @@ func elimUnreadAutos(f *Func) {
                                // because dead loads haven't been
                                // eliminated yet.
                                if v.Uses > 0 {
-                                       seen[n] = true
+                                       seen.Add(n)
                                }
                        }
                }
@@ -336,7 +336,7 @@ func elimUnreadAutos(f *Func) {
        // Eliminate stores to unread autos.
        for _, store := range stores {
                n, _ := store.Aux.(*ir.Name)
-               if seen[n] {
+               if seen.Has(n) {
                        continue
                }
 
diff --git a/test/closure6.go b/test/closure6.go
new file mode 100644 (file)
index 0000000..b5592ad
--- /dev/null
@@ -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
+}