mirror of
https://github.com/golang/go.git
synced 2026-04-02 09:20:29 +09:00
[release-branch.go1.21] cmd/compile: fix missing init nodes for len(string([]byte)) optimization
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 #61781 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> Reviewed-on: https://go-review.googlesource.com/c/go/+/516535
This commit is contained in:
committed by
Michael Knyszek
parent
c19c4c566c
commit
1755d14559
@@ -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
|
||||
}
|
||||
|
||||
|
||||
13
test/fixedbugs/issue61778.go
Normal file
13
test/fixedbugs/issue61778.go
Normal file
@@ -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')):
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user