mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
Revert "cmd/compile: allow more inlining of functions that construct closures"
This reverts commit http://go.dev/cl//479095 Reason for revert: causes failures in google-internal testing Change-Id: If1018b35be0b8627e2959f116179ada24d44d67c Reviewed-on: https://go-review.googlesource.com/c/go/+/481637 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Michael Pratt <mpratt@google.com> Run-TryBot: Than McIntosh <thanm@google.com>
This commit is contained in:
parent
8edcdddb23
commit
f5371581c7
2 changed files with 17 additions and 20 deletions
|
|
@ -446,8 +446,6 @@ func (v *hairyVisitor) tooHairy(fn *ir.Func) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// doNode visits n and its children, updates the state in v, and returns true if
|
|
||||||
// n makes the current function too hairy for inlining.
|
|
||||||
func (v *hairyVisitor) doNode(n ir.Node) bool {
|
func (v *hairyVisitor) doNode(n ir.Node) bool {
|
||||||
if n == nil {
|
if n == nil {
|
||||||
return false
|
return false
|
||||||
|
|
@ -579,10 +577,13 @@ func (v *hairyVisitor) doNode(n ir.Node) bool {
|
||||||
// TODO(danscales): Maybe make budget proportional to number of closure
|
// TODO(danscales): Maybe make budget proportional to number of closure
|
||||||
// variables, e.g.:
|
// variables, e.g.:
|
||||||
//v.budget -= int32(len(n.(*ir.ClosureExpr).Func.ClosureVars) * 3)
|
//v.budget -= int32(len(n.(*ir.ClosureExpr).Func.ClosureVars) * 3)
|
||||||
// TODO(austin): However, if we're able to inline this closure into
|
|
||||||
// v.curFunc, then we actually pay nothing for the closure captures. We
|
|
||||||
// should try to account for that if we're going to account for captures.
|
|
||||||
v.budget -= 15
|
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.OGO,
|
case ir.OGO,
|
||||||
ir.ODEFER,
|
ir.ODEFER,
|
||||||
|
|
|
||||||
|
|
@ -232,15 +232,15 @@ func main() {
|
||||||
|
|
||||||
{
|
{
|
||||||
c := 3
|
c := 3
|
||||||
func() { // ERROR "can inline main.func26"
|
func() { // ERROR "func literal does not escape"
|
||||||
c = 4
|
c = 4
|
||||||
func() {
|
func() { // ERROR "func literal does not escape"
|
||||||
if c != 4 {
|
if c != 4 {
|
||||||
ppanic("c != 4")
|
ppanic("c != 4")
|
||||||
}
|
}
|
||||||
recover() // prevent inlining
|
recover() // prevent inlining
|
||||||
}()
|
}()
|
||||||
}() // ERROR "inlining call to main.func26" "func literal does not escape"
|
}()
|
||||||
if c != 4 {
|
if c != 4 {
|
||||||
ppanic("c != 4")
|
ppanic("c != 4")
|
||||||
}
|
}
|
||||||
|
|
@ -248,37 +248,33 @@ func main() {
|
||||||
|
|
||||||
{
|
{
|
||||||
a := 2
|
a := 2
|
||||||
// This has an unfortunate exponential growth, where as we visit each
|
if r := func(x int) int { // ERROR "func literal does not escape"
|
||||||
// function, we inline the inner closure, and that constructs a new
|
|
||||||
// function for any closures inside the inner function, and then we
|
|
||||||
// revisit those. E.g., func34 and func36 are constructed by the inliner.
|
|
||||||
if r := func(x int) int { // ERROR "can inline main.func27"
|
|
||||||
b := 3
|
b := 3
|
||||||
return func(y int) int { // ERROR "can inline main.func27.1" "can inline main.func34"
|
return func(y int) int { // ERROR "can inline main.func27.1"
|
||||||
c := 5
|
c := 5
|
||||||
return func(z int) int { // ERROR "can inline main.func27.1.1" "can inline main.func27.(func)?2" "can inline main.func34.1" "can inline main.func36"
|
return func(z int) int { // ERROR "can inline main.func27.1.1" "can inline main.func27.(func)?2"
|
||||||
return a*x + b*y + c*z
|
return a*x + b*y + c*z
|
||||||
}(10) // ERROR "inlining call to main.func27.1.1"
|
}(10) // ERROR "inlining call to main.func27.1.1"
|
||||||
}(100) // ERROR "inlining call to main.func27.1" "inlining call to main.func27.(func)?2"
|
}(100) // ERROR "inlining call to main.func27.1" "inlining call to main.func27.(func)?2"
|
||||||
}(1000); r != 2350 { // ERROR "inlining call to main.func27" "inlining call to main.func34" "inlining call to main.func36"
|
}(1000); r != 2350 {
|
||||||
ppanic("r != 2350")
|
ppanic("r != 2350")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
a := 2
|
a := 2
|
||||||
if r := func(x int) int { // ERROR "can inline main.func28"
|
if r := func(x int) int { // ERROR "func literal does not escape"
|
||||||
b := 3
|
b := 3
|
||||||
return func(y int) int { // ERROR "can inline main.func28.1" "can inline main.func35"
|
return func(y int) int { // ERROR "can inline main.func28.1"
|
||||||
c := 5
|
c := 5
|
||||||
func(z int) { // ERROR "can inline main.func28.1.1" "can inline main.func28.(func)?2" "can inline main.func35.1" "can inline main.func37"
|
func(z int) { // ERROR "can inline main.func28.1.1" "can inline main.func28.(func)?2"
|
||||||
a = a * x
|
a = a * x
|
||||||
b = b * y
|
b = b * y
|
||||||
c = c * z
|
c = c * z
|
||||||
}(10) // ERROR "inlining call to main.func28.1.1"
|
}(10) // ERROR "inlining call to main.func28.1.1"
|
||||||
return a + c
|
return a + c
|
||||||
}(100) + b // ERROR "inlining call to main.func28.1" "inlining call to main.func28.(func)?2"
|
}(100) + b // ERROR "inlining call to main.func28.1" "inlining call to main.func28.(func)?2"
|
||||||
}(1000); r != 2350 { // ERROR "inlining call to main.func28" "inlining call to main.func35" "inlining call to main.func37"
|
}(1000); r != 2350 {
|
||||||
ppanic("r != 2350")
|
ppanic("r != 2350")
|
||||||
}
|
}
|
||||||
if a != 2000 {
|
if a != 2000 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue