Skip to content

Commit

Permalink
cmd/compile: fix missing init nodes for len(string([]byte)) optimization
Browse files Browse the repository at this point in the history
CL 497276 added optimization for len(string([]byte)) by avoiding call to
slicebytetostring. However, the bytes to string expression may contain
init nodes, which need to be preserved. Otherwise, it would make the
liveness analysis confusing about the lifetime of temporary variables
created by init nodes.

Fixes #61778

Change-Id: I6d1280a7d61bcc75f11132af41bda086f084ab54
Reviewed-on: https://go-review.googlesource.com/c/go/+/516375
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
  • Loading branch information
cuonglm authored and gopherbot committed Aug 7, 2023
1 parent 4198193 commit ea565f1
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
5 changes: 4 additions & 1 deletion src/cmd/compile/internal/walk/builtin.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,10 @@ func walkLenCap(n *ir.UnaryExpr, init *ir.Nodes) ir.Node {
return mkcall("countrunes", n.Type(), init, typecheck.Conv(n.X.(*ir.ConvExpr).X, types.Types[types.TSTRING]))
}
if isByteCount(n) {
_, len := backingArrayPtrLen(cheapExpr(n.X.(*ir.ConvExpr).X, init))
conv := n.X.(*ir.ConvExpr)
walkStmtList(conv.Init())
init.Append(ir.TakeInit(conv)...)
_, len := backingArrayPtrLen(cheapExpr(conv.X, init))
return len
}

Expand Down
13 changes: 13 additions & 0 deletions test/fixedbugs/issue61778.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// compile

// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package p

func f(s []byte) {
switch "" {
case string(append(s, 'a')):
}
}

0 comments on commit ea565f1

Please sign in to comment.