diff options
| author | thepudds <thepudds1460@gmail.com> | 2025-02-12 18:39:08 -0500 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-05-20 09:19:42 -0700 |
| commit | 326e5e1b7a9f421db972fed0a6e79a1c9601d0ae (patch) | |
| tree | 11635cf6f72d0e2fd3451b4d8bf7e04c49601f71 /src | |
| parent | 1635aed9413233ba8f974447ca3359b7a9159985 (diff) | |
| download | go-326e5e1b7a9f421db972fed0a6e79a1c9601d0ae.tar.xz | |
cmd/compile/internal/escape: additional constant and zero value tests and logging
This adds additional logging for the work that walk does to reduce
how often an interface conversion results in an allocation.
Also, as part of #71359, we will be updating how escape analysis and
walk handle basic literals, composite literals, and zero values,
so add some tests that uses this new logging.
By the end of our CL stack, we address all of these tests.
Updates #71359
Change-Id: I43fde8343d9aacaec1e05360417908014a86c8bd
Reviewed-on: https://go-review.googlesource.com/c/go/+/649076
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: David Chase <drchase@google.com>
Auto-Submit: Keith Randall <khr@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/base/debug.go | 1 | ||||
| -rw-r--r-- | src/cmd/compile/internal/walk/convert.go | 13 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/base/debug.go b/src/cmd/compile/internal/base/debug.go index 7bcbcb3e2c..10393e773c 100644 --- a/src/cmd/compile/internal/base/debug.go +++ b/src/cmd/compile/internal/base/debug.go @@ -29,6 +29,7 @@ type DebugFlags struct { DumpPtrs int `help:"show Node pointers values in dump output"` DwarfInl int `help:"print information about DWARF inlined function creation"` EscapeMutationsCalls int `help:"print extra escape analysis diagnostics about mutations and calls" concurrent:"ok"` + EscapeDebug int `help:"print information about escape analysis and resulting optimizations" concurrent:"ok"` Export int `help:"print export data"` FIPSHash string `help:"hash value for FIPS debugging" concurrent:"ok"` Fmahash string `help:"hash value for use in debugging platform-dependent multiply-add use" concurrent:"ok"` diff --git a/src/cmd/compile/internal/walk/convert.go b/src/cmd/compile/internal/walk/convert.go index fc1e4c84e7..4c443f71b9 100644 --- a/src/cmd/compile/internal/walk/convert.go +++ b/src/cmd/compile/internal/walk/convert.go @@ -141,16 +141,27 @@ func dataWord(conv *ir.ConvExpr, init *ir.Nodes) ir.Node { isInteger = sc.IsInteger() isBool = sc.IsBoolean() } + + diagnose := func(msg string, n ir.Node) { + if base.Debug.EscapeDebug > 0 { + // This output is most useful with -gcflags=-W=2 or similar because + // it often prints a temp variable name. + base.WarnfAt(n.Pos(), "convert: %s: %v", msg, n) + } + } + // Try a bunch of cases to avoid an allocation. var value ir.Node switch { case fromType.Size() == 0: // n is zero-sized. Use zerobase. + diagnose("using global for zero-sized interface value", n) cheapExpr(n, init) // Evaluate n for side-effects. See issue 19246. value = ir.NewLinksymExpr(base.Pos, ir.Syms.Zerobase, types.Types[types.TUINTPTR]) case isBool || fromType.Size() == 1 && isInteger: // n is a bool/byte. Use staticuint64s[n * 8] on little-endian // and staticuint64s[n * 8 + 7] on big-endian. + diagnose("using global for single-byte interface value", n) n = cheapExpr(n, init) n = soleComponent(init, n) // byteindex widens n so that the multiplication doesn't overflow. @@ -166,9 +177,11 @@ func dataWord(conv *ir.ConvExpr, init *ir.Nodes) ir.Node { value = xe case n.Op() == ir.ONAME && n.(*ir.Name).Class == ir.PEXTERN && n.(*ir.Name).Readonly(): // n is a readonly global; use it directly. + diagnose("using global for interface value", n) value = n case conv.Esc() == ir.EscNone && fromType.Size() <= 1024: // n does not escape. Use a stack temporary initialized to n. + diagnose("using stack temporary for interface value", n) value = typecheck.TempAt(base.Pos, ir.CurFunc, fromType) init.Append(typecheck.Stmt(ir.NewAssignStmt(base.Pos, value, n))) } |
