mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: reuse temporaries in order pass
Instead of allocating a new temporary each time one
is needed, keep a list of temporaries which are free
(have already been VARKILLed on every path) and use
one of them.
Should save a lot of stack space. In a function like this:
func main() {
fmt.Printf("%d %d\n", 2, 3)
fmt.Printf("%d %d\n", 4, 5)
fmt.Printf("%d %d\n", 6, 7)
}
The three [2]interface{} arrays used to hold the ... args
all use the same autotmp, instead of 3 different autotmps
as happened previous to this CL.
Change-Id: I2d728e226f81e05ae68ca8247af62014a1b032d3
Reviewed-on: https://go-review.googlesource.com/c/140301
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
0e9f8a21f8
commit
389e942745
4 changed files with 75 additions and 43 deletions
|
|
@ -751,7 +751,7 @@ func fixedlit(ctxt initContext, kind initKind, n *Node, var_ *Node, init *Nodes)
|
|||
case initKindStatic:
|
||||
genAsStatic(a)
|
||||
case initKindDynamic, initKindLocalCode:
|
||||
a = orderStmtInPlace(a)
|
||||
a = orderStmtInPlace(a, map[string][]*Node{})
|
||||
a = walkstmt(a)
|
||||
init.Append(a)
|
||||
default:
|
||||
|
|
@ -909,7 +909,7 @@ func slicelit(ctxt initContext, n *Node, var_ *Node, init *Nodes) {
|
|||
a = nod(OAS, a, value)
|
||||
|
||||
a = typecheck(a, Etop)
|
||||
a = orderStmtInPlace(a)
|
||||
a = orderStmtInPlace(a, map[string][]*Node{})
|
||||
a = walkstmt(a)
|
||||
init.Append(a)
|
||||
}
|
||||
|
|
@ -918,7 +918,7 @@ func slicelit(ctxt initContext, n *Node, var_ *Node, init *Nodes) {
|
|||
a = nod(OAS, var_, nod(OSLICE, vauto, nil))
|
||||
|
||||
a = typecheck(a, Etop)
|
||||
a = orderStmtInPlace(a)
|
||||
a = orderStmtInPlace(a, map[string][]*Node{})
|
||||
a = walkstmt(a)
|
||||
init.Append(a)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue