]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile/internal/inline: adjust isBigFunc to recognize unified IR codegen
authorMatthew Dempsky <mdempsky@google.com>
Tue, 3 Jan 2023 20:11:44 +0000 (12:11 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 26 Jan 2023 23:27:24 +0000 (23:27 +0000)
Unified IR generates uniform IR for "a, b = f()" to be able to insert
implicit conversion expressions, but the result is somewhat more
verbose and trips up the inliner's naive cost metrics.

The hairyVisitor.doNode method was already adjusted to account for
this, but isBigFunc needs the same adjustment.

Fixes #57563.

Change-Id: Ia8d86a6e314ec60190c78f40ace4fb30dadc4413
Reviewed-on: https://go-review.googlesource.com/c/go/+/460395
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/compile/internal/inline/inl.go

index 11a64fde0c9ce640fa448bca5d8a978dbcdf4d50..99cbda8e9c91213a193d6a37780760fffe3d41d6 100644 (file)
@@ -643,6 +643,8 @@ func (v *hairyVisitor) doNode(n ir.Node) bool {
                // minimize impact to the existing inlining heuristics (in
                // particular, to avoid breaking the existing inlinability regress
                // tests), we need to compensate for this here.
+               //
+               // See also identical logic in isBigFunc.
                if init := n.Rhs[0].Init(); len(init) == 1 {
                        if _, ok := init[0].(*ir.AssignListStmt); ok {
                                // 4 for each value, because each temporary variable now
@@ -684,6 +686,16 @@ func (v *hairyVisitor) doNode(n ir.Node) bool {
 func isBigFunc(fn *ir.Func) bool {
        budget := inlineBigFunctionNodes
        return ir.Any(fn, func(n ir.Node) bool {
+               // See logic in hairyVisitor.doNode, explaining unified IR's
+               // handling of "a, b = f()" assignments.
+               if n, ok := n.(*ir.AssignListStmt); ok && n.Op() == ir.OAS2 {
+                       if init := n.Rhs[0].Init(); len(init) == 1 {
+                               if _, ok := init[0].(*ir.AssignListStmt); ok {
+                                       budget += 4*len(n.Lhs) + 1
+                               }
+                       }
+               }
+
                budget--
                return budget <= 0
        })