]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: make encoding/binary appends cheaper to inline
authorWayne Zuo <wdvxdr@golangcn.org>
Thu, 15 Sep 2022 07:14:52 +0000 (15:14 +0800)
committerGopher Robot <gobot@golang.org>
Thu, 15 Sep 2022 21:05:02 +0000 (21:05 +0000)
Go 1.19 introduce new append-like APIs in package encoding/binary, this
change teaches the inliner to treat calls to these methods as cheap, so
that code using them will be more inlineable.

Updates #42958

Change-Id: Ie3dd4906e285430f435bdedbf8a11fdffce9302d
Reviewed-on: https://go-review.googlesource.com/c/go/+/431015
Auto-Submit: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Jenny Rakoczy <jenny@golang.org>
Reviewed-by: Jenny Rakoczy <jenny@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Jenny Rakoczy <jenny@golang.org>
Run-TryBot: Wayne Zuo <wdvxdr@golangcn.org>
Reviewed-by: Keith Randall <khr@google.com>
src/cmd/compile/internal/inline/inl.go
test/inline_endian.go

index 817f2fd99950bec60da2da9ab112dfddcd252a3a..702b1d1cc51a00a49a996c87855f7e4101f040d2 100644 (file)
@@ -304,7 +304,9 @@ func (v *hairyVisitor) doNode(n ir.Node) bool {
                                                case "littleEndian.Uint64", "littleEndian.Uint32", "littleEndian.Uint16",
                                                        "bigEndian.Uint64", "bigEndian.Uint32", "bigEndian.Uint16",
                                                        "littleEndian.PutUint64", "littleEndian.PutUint32", "littleEndian.PutUint16",
-                                                       "bigEndian.PutUint64", "bigEndian.PutUint32", "bigEndian.PutUint16":
+                                                       "bigEndian.PutUint64", "bigEndian.PutUint32", "bigEndian.PutUint16",
+                                                       "littleEndian.AppendUint64", "littleEndian.AppendUint32", "littleEndian.AppendUint16",
+                                                       "bigEndian.AppendUint64", "bigEndian.AppendUint32", "bigEndian.AppendUint16":
                                                        cheap = true
                                                }
                                        }
index e00e06a75ee9598283f50ff15f2b11cf85de032a..fc94321de03b94beefb7440244f1484ac7170a1e 100644 (file)
@@ -1,8 +1,6 @@
 // errorcheckwithauto -0 -m -d=inlfuncswithclosures=1
 
 //go:build (386 || amd64 || arm64 || ppc64le || s390x) && !gcflags_noopt
-// +build 386 amd64 arm64 ppc64le s390x
-// +build !gcflags_noopt
 
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -21,3 +19,17 @@ import (
 func endian(b []byte) uint64 { // ERROR "can inline endian" "b does not escape"
        return binary.LittleEndian.Uint64(b) + binary.BigEndian.Uint64(b) // ERROR "inlining call to binary.littleEndian.Uint64" "inlining call to binary.bigEndian.Uint64"
 }
+
+func appendLittleEndian(b []byte) []byte { // ERROR "can inline appendLittleEndian" "leaking param: b to result ~r0 level=0"
+       b = binary.LittleEndian.AppendUint64(b, 64) // ERROR "inlining call to binary.littleEndian.AppendUint64"
+       b = binary.LittleEndian.AppendUint32(b, 32) // ERROR "inlining call to binary.littleEndian.AppendUint32"
+       b = binary.LittleEndian.AppendUint16(b, 16) // ERROR "inlining call to binary.littleEndian.AppendUint16"
+       return b
+}
+
+func appendBigEndian(b []byte) []byte { // ERROR "can inline appendBigEndian" "leaking param: b to result ~r0 level=0"
+       b = binary.BigEndian.AppendUint64(b, 64) // ERROR "inlining call to binary.bigEndian.AppendUint64"
+       b = binary.BigEndian.AppendUint32(b, 32) // ERROR "inlining call to binary.bigEndian.AppendUint32"
+       b = binary.BigEndian.AppendUint16(b, 16) // ERROR "inlining call to binary.bigEndian.AppendUint16"
+       return b
+}