]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.regabi] cmd/compile: decouple escape analysis from Name.Vargen
authorMatthew Dempsky <mdempsky@google.com>
Mon, 11 Jan 2021 22:30:16 +0000 (14:30 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 12 Jan 2021 01:25:32 +0000 (01:25 +0000)
Escape analysis needs to know the index of result parameters for
recording escape-flow information. It currently relies on Vargen for
this, but it can easily figure this out for itself. So just do that
instead, so that we can remove Vargen.

Passes toolstash -cmp.

For #43633.

Change-Id: I65dedc2d73bc25e85ff400f308e50b73dc503630
Reviewed-on: https://go-review.googlesource.com/c/go/+/283192
Trust: Matthew Dempsky <mdempsky@google.com>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Dan Scales <danscales@google.com>
src/cmd/compile/internal/escape/escape.go

index c63383af43a9f6156793be7b05c4d4e54062cb39..bee3878f10039b8d2a564a79d65a5ccc71dc7a5c 100644 (file)
@@ -126,6 +126,11 @@ type location struct {
        edges     []edge   // incoming edges
        loopDepth int      // loopDepth at declaration
 
+       // resultIndex records the tuple index (starting at 1) for
+       // PPARAMOUT variables within their function's result type.
+       // For non-PPARAMOUT variables it's 0.
+       resultIndex int
+
        // derefs and walkgen are used during walkOne to track the
        // minimal dereferences from the walk root.
        derefs  int // >= -1
@@ -259,11 +264,16 @@ func (b *batch) initFunc(fn *ir.Func) {
        }
 
        // Allocate locations for local variables.
-       for _, dcl := range fn.Dcl {
-               if dcl.Op() == ir.ONAME {
-                       e.newLoc(dcl, false)
+       for _, n := range fn.Dcl {
+               if n.Op() == ir.ONAME {
+                       e.newLoc(n, false)
                }
        }
+
+       // Initialize resultIndex for result parameters.
+       for i, f := range fn.Type().Results().FieldSlice() {
+               e.oldLoc(f.Nname.(*ir.Name)).resultIndex = 1 + i
+       }
 }
 
 func (b *batch) walkFunc(fn *ir.Func) {
@@ -1609,8 +1619,7 @@ func (l *location) leakTo(sink *location, derefs int) {
        // If sink is a result parameter and we can fit return bits
        // into the escape analysis tag, then record a return leak.
        if sink.isName(ir.PPARAMOUT) && sink.curfn == l.curfn {
-               // TODO(mdempsky): Eliminate dependency on Vargen here.
-               ri := int(sink.n.Name().Vargen) - 1
+               ri := sink.resultIndex - 1
                if ri < numEscResults {
                        // Leak to result parameter.
                        l.paramEsc.AddResult(ri, derefs)