]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/gc: separate Name-only Node fields
authorJosh Bleecher Snyder <josharian@gmail.com>
Sat, 4 Apr 2015 00:43:38 +0000 (17:43 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Fri, 15 May 2015 15:22:12 +0000 (15:22 +0000)
Name will be converted from an anonymous to a
named field in a subsequent, automated CL.

No functional changes. Passes toolstash -cmp.

This reduces the size of gc.Node from 424 to 400 bytes.
This in turn reduces the permanent (pprof -inuse_space)
memory usage while compiling the test/rotate?.go tests:

test old(MB) new(MB) change
rotate0 379.49 367.30 -3.21%
rotate1 373.42 361.59 -3.16%
rotate2 381.17 368.77 -3.25%
rotate3 374.30 362.48 -3.15%

Updates #9933.

Change-Id: I21479527c136add4f1efb9342774e3be3e276e83
Reviewed-on: https://go-review.googlesource.com/10120
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/internal/gc/subr.go
src/cmd/internal/gc/syntax.go
src/cmd/internal/gc/typecheck.go

index b09f4232aa299cdb6c05fc926e35365cc40c349f..7f9e78810f7ce95f675bb27f7911be33d0bc3fe5 100644 (file)
@@ -380,6 +380,8 @@ func Nod(op int, nleft *Node, nright *Node) *Node {
        switch op {
        case OCLOSURE, ODCLFUNC:
                n.Func = new(Func)
+       case ONAME:
+               n.Name = new(Name)
        }
        return n
 }
@@ -771,7 +773,6 @@ func treecopy(n *Node) *Node {
                }
                fallthrough
 
-               // fall through
        case ONAME, OLITERAL, OTYPE:
                m = n
        }
index 70c6f3f5674cd837df7ea569f0de8d6cdeaf3c71..9ef00a09cbd99da0721d2a4c224e9fa6eaf66e04 100644 (file)
@@ -30,7 +30,6 @@ type Node struct {
        Etype       uint8 // op for OASOP, etype for OTYPE, exclam for export
        Bounded     bool  // bounds check unnecessary
        Class       uint8 // PPARAM, PAUTO, PEXTERN, etc
-       Method      bool  // OCALLMETH is direct method call
        Embedded    uint8 // ODCLFIELD embedded type
        Colas       bool  // OAS resulting from :=
        Diag        uint8 // already printed error about this
@@ -42,15 +41,11 @@ type Node struct {
        Initorder   uint8
        Used        bool
        Isddd       bool // is the argument variadic
-       Readonly    bool
        Implicit    bool
        Addrtaken   bool   // address taken, even if not moved to heap
        Assigned    bool   // is the variable ever assigned to
-       Captured    bool   // is the variable captured by a closure
-       Byval       bool   // is the variable captured by value or by reference
        Likely      int8   // likeliness of if statement
        Hasbreak    bool   // has break statement
-       Needzero    bool   // if it contains pointers, needs to be zeroed on function entry
        Esc         uint16 // EscXXX
        Funcdepth   int32
 
@@ -69,15 +64,14 @@ type Node struct {
        Reg int16
 
        // ONAME
-       Ntype     *Node
-       Defn      *Node // ONAME: initializing assignment; OLABEL: labeled statement
-       Pack      *Node // real package for import . names
-       Curfn     *Node // function for local variables
-       Paramfld  *Type // TFIELD for this PPARAM; also for ODOT, curfn
-       Decldepth int   // declaration loop depth, increased for every loop or label
+       *Name
+       Ntype    *Node
+       Defn     *Node // ONAME: initializing assignment; OLABEL: labeled statement
+       Pack     *Node // real package for import . names
+       Curfn    *Node // function for local variables
+       Paramfld *Type // TFIELD for this PPARAM; also for ODOT, curfn
 
        // ONAME func param with PHEAP
-       Heapaddr   *Node // temp holding heap address of param
        Outerexpr  *Node // expression copied into closure for variable
        Stackparam *Node // OPARAM node referring to stack copy of param
        Alloc      *Node // allocation call
@@ -87,9 +81,6 @@ type Node struct {
        Closure *Node // ONAME/PHEAP <-> ONAME/PPARAMREF
        Top     int   // top context (Ecall, Eproc, etc)
 
-       // ONAME substitute while inlining
-       Inlvar *Node
-
        // OPACK
        Pkg *Pkg
 
@@ -113,6 +104,18 @@ type Node struct {
        Opt      interface{} // for optimization passes
 }
 
+// Name holds Node fields used only by ONAME nodes.
+type Name struct {
+       Heapaddr  *Node // temp holding heap address of param
+       Inlvar    *Node // ONAME substitute while inlining
+       Decldepth int   // declaration loop depth, increased for every loop or label
+       Method    bool  // OCALLMETH name
+       Readonly  bool
+       Captured  bool // is the variable captured by a closure
+       Byval     bool // is the variable captured by value or by reference
+       Needzero  bool // if it contains pointers, needs to be zeroed on function entry
+}
+
 // Func holds Node fields used only with function-like nodes.
 type Func struct {
        Shortname *Node
index bc6bbdb7e3d7e8e038df47d2a1b9423aaafeba9d..6ad8c82c32d7a8c9655205aed3fe54b31320a82d 100644 (file)
@@ -891,6 +891,9 @@ OpSwitch:
                        }
 
                        n.Op = ONAME
+                       if n.Name == nil {
+                               n.Name = new(Name)
+                       }
                        n.Sym = n.Right.Sym
                        n.Type = methodfunc(n.Type, n.Left.Type)
                        n.Xoffset = 0