mirror of
https://github.com/golang/go
synced 2024-11-11 20:20:23 -07:00
cmd/compile: avoid slicebytetostring call in len(string([]byte))
Change-Id: Ie04503e61400a793a6a29a4b58795254deabe472 Reviewed-on: https://go-review.googlesource.com/c/go/+/497276 Reviewed-by: Keith Randall <khr@golang.org> Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Keith Randall <khr@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
3651d8e516
commit
35a71dc56d
@ -250,6 +250,10 @@ func walkLenCap(n *ir.UnaryExpr, init *ir.Nodes) ir.Node {
|
||||
// Replace len([]rune(string)) with runtime.countrunes(string).
|
||||
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))
|
||||
return len
|
||||
}
|
||||
|
||||
n.X = walkExpr(n.X, init)
|
||||
|
||||
@ -862,3 +866,9 @@ func writebarrierfn(name string, l *types.Type, r *types.Type) ir.Node {
|
||||
func isRuneCount(n ir.Node) bool {
|
||||
return base.Flag.N == 0 && !base.Flag.Cfg.Instrumenting && n.Op() == ir.OLEN && n.(*ir.UnaryExpr).X.Op() == ir.OSTR2RUNES
|
||||
}
|
||||
|
||||
// isByteCount reports whether n is of the form len(string([]byte)).
|
||||
func isByteCount(n ir.Node) bool {
|
||||
return base.Flag.N == 0 && !base.Flag.Cfg.Instrumenting && n.Op() == ir.OLEN &&
|
||||
(n.(*ir.UnaryExpr).X.Op() == ir.OBYTES2STR || n.(*ir.UnaryExpr).X.Op() == ir.OBYTES2STRTMP)
|
||||
}
|
||||
|
@ -14,6 +14,11 @@ func CountRunes(s string) int { // Issue #24923
|
||||
return len([]rune(s))
|
||||
}
|
||||
|
||||
func CountBytes(s []byte) int {
|
||||
// amd64:-`.*runtime.slicebytetostring`
|
||||
return len(string(s))
|
||||
}
|
||||
|
||||
func ToByteSlice() []byte { // Issue #24698
|
||||
// amd64:`LEAQ\ttype:\[3\]uint8`
|
||||
// amd64:`CALL\truntime\.newobject`
|
||||
|
Loading…
Reference in New Issue
Block a user