diff options
| author | thepudds <thepudds1460@gmail.com> | 2025-06-28 16:53:37 -0400 |
|---|---|---|
| committer | t hepudds <thepudds1460@gmail.com> | 2025-06-30 14:01:43 -0700 |
| commit | e46d586eddfdd2186d77a5e996bbd6415cfcf2f5 (patch) | |
| tree | 3716f626bb9739fd23519a49da3869424e76a444 /src/cmd/compile/internal/walk | |
| parent | 479b51ee1f78a884a45b517c1e993d91c9774e29 (diff) | |
| download | go-e46d586eddfdd2186d77a5e996bbd6415cfcf2f5.tar.xz | |
cmd/compile/internal/escape: add debug hash for literal allocation optimizations
Several CLs earlier in this stack added optimizations to reduce
user allocations by recognizing and taking advantage of literals,
including CL 649555, CL 649079, and CL 649035.
This CL adds debug hashing of those changes, which enables use of the
bisect tool, such as 'bisect -compile=literalalloc go test -run=Foo'.
This also allows these optimizations to be manually disabled via
'-gcflags=all=-d=literalallochash=n'.
Updates #71359
Change-Id: I854f7742a6efa5b17d914932d61a32b2297f0c88
Reviewed-on: https://go-review.googlesource.com/c/go/+/675415
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src/cmd/compile/internal/walk')
| -rw-r--r-- | src/cmd/compile/internal/walk/order.go | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/walk/order.go b/src/cmd/compile/internal/walk/order.go index 8ba8dd96cc..cb022faddf 100644 --- a/src/cmd/compile/internal/walk/order.go +++ b/src/cmd/compile/internal/walk/order.go @@ -246,14 +246,18 @@ func (o *orderState) addrTemp(n ir.Node) ir.Node { if v == nil { v = n } + optEnabled := func(n ir.Node) bool { + // Do this optimization only when enabled for this node. + return base.LiteralAllocHash.MatchPos(n.Pos(), nil) + } if (v.Op() == ir.OSTRUCTLIT || v.Op() == ir.OARRAYLIT) && !base.Ctxt.IsFIPS() { - if ir.IsZero(v) && 0 < v.Type().Size() && v.Type().Size() <= abi.ZeroValSize { + if ir.IsZero(v) && 0 < v.Type().Size() && v.Type().Size() <= abi.ZeroValSize && optEnabled(n) { // This zero value can be represented by the read-only zeroVal. zeroVal := ir.NewLinksymExpr(v.Pos(), ir.Syms.ZeroVal, n.Type()) vstat := typecheck.Expr(zeroVal).(*ir.LinksymOffsetExpr) return vstat } - if isStaticCompositeLiteral(v) { + if isStaticCompositeLiteral(v) && optEnabled(n) { // v can be directly represented in the read-only data section. lit := v.(*ir.CompLitExpr) vstat := readonlystaticname(n.Type()) |
