aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorthepudds <thepudds1460@gmail.com>2025-02-12 18:39:08 -0500
committerGopher Robot <gobot@golang.org>2025-05-20 09:19:42 -0700
commit326e5e1b7a9f421db972fed0a6e79a1c9601d0ae (patch)
tree11635cf6f72d0e2fd3451b4d8bf7e04c49601f71 /src
parent1635aed9413233ba8f974447ca3359b7a9159985 (diff)
downloadgo-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.go1
-rw-r--r--src/cmd/compile/internal/walk/convert.go13
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)))
}