Skip to content

Commit

Permalink
cmd/compile: fuse escape analysis parameter tagging loops
Browse files Browse the repository at this point in the history
Simplifies the code somewhat and allows removing Param.Field.

Passes toolstash-check.

Change-Id: Id854416aea8afd27ce4830ff0f5ff940f7353792
Reviewed-on: https://go-review.googlesource.com/99336
Run-TryBot: Matthew Dempsky <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Cherry Zhang <[email protected]>
  • Loading branch information
mdempsky committed Mar 8, 2018
1 parent 7d654af commit e3127f0
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 35 deletions.
10 changes: 0 additions & 10 deletions src/cmd/compile/internal/gc/dcl.go
Original file line number Diff line number Diff line change
Expand Up @@ -668,11 +668,6 @@ func tofunargs(l []*Node, funarg types.Funarg) *types.Type {
for i, n := range l {
f := structfield(n)
f.Funarg = funarg

// esc.go needs to find f given a PPARAM to add the tag.
if n.Left != nil && n.Left.Class() == PPARAM {
n.Left.Name.Param.Field = f
}
if f.Broke() {
t.SetBroke(true)
}
Expand All @@ -688,11 +683,6 @@ func tofunargsfield(fields []*types.Field, funarg types.Funarg) *types.Type {

for _, f := range fields {
f.Funarg = funarg

// esc.go needs to find f given a PPARAM to add the tag.
if asNode(f.Nname) != nil && asNode(f.Nname).Class() == PPARAM {
asNode(f.Nname).Name.Param.Field = f
}
}
t.SetFields(fields)
return t
Expand Down
32 changes: 11 additions & 21 deletions src/cmd/compile/internal/gc/esc.go
Original file line number Diff line number Diff line change
Expand Up @@ -2238,27 +2238,6 @@ func (e *EscState) esctag(fn *Node) {
}
}

for _, ln := range fn.Func.Dcl {
if ln.Op != ONAME {
continue
}

switch ln.Esc & EscMask {
case EscNone, // not touched by escflood
EscReturn:
if types.Haspointers(ln.Type) { // don't bother tagging for scalars
if ln.Name.Param.Field.Note != uintptrEscapesTag {
ln.Name.Param.Field.Note = mktag(int(ln.Esc))
}
}

case EscHeap: // touched by escflood, moved to heap
}
}

// Unnamed parameters are unused and therefore do not escape.
// (Unnamed parameters are not in the Dcl list in the loop above
// so we need to mark them separately.)
for _, fs := range types.RecvsParams {
for _, f := range fs(fn.Type).Fields().Slice() {
if !types.Haspointers(f.Type) { // don't bother tagging for scalars
Expand All @@ -2268,8 +2247,19 @@ func (e *EscState) esctag(fn *Node) {
// Note is already set in the loop above.
continue
}

// Unnamed parameters are unused and therefore do not escape.
if f.Sym == nil || f.Sym.IsBlank() {
f.Note = mktag(EscNone)
continue
}

switch esc := asNode(f.Nname).Esc; esc & EscMask {
case EscNone, // not touched by escflood
EscReturn:
f.Note = mktag(int(esc))

case EscHeap: // touched by escflood, moved to heap
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/compile/internal/gc/sizeof_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func TestSizeof(t *testing.T) {
}{
{Func{}, 128, 232},
{Name{}, 32, 56},
{Param{}, 28, 56},
{Param{}, 24, 48},
{Node{}, 76, 128},
}

Expand Down
3 changes: 0 additions & 3 deletions src/cmd/compile/internal/gc/syntax.go
Original file line number Diff line number Diff line change
Expand Up @@ -279,9 +279,6 @@ type Param struct {
// ONAME PAUTOHEAP
Stackcopy *Node // the PPARAM/PPARAMOUT on-stack slot (moved func params only)

// ONAME PPARAM
Field *types.Field // TFIELD in arg struct

// ONAME closure linkage
// Consider:
//
Expand Down

0 comments on commit e3127f0

Please sign in to comment.