aboutsummaryrefslogtreecommitdiff
path: root/test/inline.go
diff options
context:
space:
mode:
authorEgon Elbre <egonelbre@gmail.com>2021-01-02 16:28:11 +0200
committerJosh Bleecher Snyder <josharian@gmail.com>2021-02-24 17:00:14 +0000
commitadb467ffd2d82b796de12bdd8effa2cfefe01f29 (patch)
tree5aedd704525f3103c568813e9fd9a6078680efce /test/inline.go
parent27684ea195641ead8a8f08cb345925da889a12ed (diff)
downloadgo-adb467ffd2d82b796de12bdd8effa2cfefe01f29.tar.gz
go-adb467ffd2d82b796de12bdd8effa2cfefe01f29.zip
cmd/compile: reduce inline cost of OCONVOP
OCONVOP doesn't have effect in the compiled code so, it can be safely excluded from inline cost calculation. Also make sequence ODEREF OCONVNOP* OADDR cost 1. This is rather common conversion, such as *(*uint32)(unsafe.Pointer(&x)). Fixes #42788 Change-Id: I5001f7e89d985c198b6405694cdd5b819cf3f47a Reviewed-on: https://go-review.googlesource.com/c/go/+/281232 Reviewed-by: Keith Randall <khr@golang.org> Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Trust: Elias Naur <mail@eliasnaur.com>
Diffstat (limited to 'test/inline.go')
-rw-r--r--test/inline.go23
1 files changed, 23 insertions, 0 deletions
diff --git a/test/inline.go b/test/inline.go
index 37965c0d9d..a79f5589fb 100644
--- a/test/inline.go
+++ b/test/inline.go
@@ -10,6 +10,7 @@
package foo
import (
+ "math"
"runtime"
"unsafe"
)
@@ -262,3 +263,25 @@ func gd2() int { // ERROR "can inline gd2"
func gd3() func() { // ERROR "can inline gd3"
return ii
}
+
+// Issue #42788 - ensure ODEREF OCONVNOP* OADDR is low cost.
+func EncodeQuad(d []uint32, x [6]float32) { // ERROR "can inline EncodeQuad" "d does not escape"
+ _ = d[:6]
+ d[0] = math.Float32bits(x[0]) // ERROR "inlining call to math.Float32bits"
+ d[1] = math.Float32bits(x[1]) // ERROR "inlining call to math.Float32bits"
+ d[2] = math.Float32bits(x[2]) // ERROR "inlining call to math.Float32bits"
+ d[3] = math.Float32bits(x[3]) // ERROR "inlining call to math.Float32bits"
+ d[4] = math.Float32bits(x[4]) // ERROR "inlining call to math.Float32bits"
+ d[5] = math.Float32bits(x[5]) // ERROR "inlining call to math.Float32bits"
+}
+
+// Ensure OCONVNOP is zero cost.
+func Conv(v uint64) uint64 { // ERROR "can inline Conv"
+ return conv2(conv2(conv2(v))) // ERROR "inlining call to (conv1|conv2)"
+}
+func conv2(v uint64) uint64 { // ERROR "can inline conv2"
+ return conv1(conv1(conv1(conv1(v)))) // ERROR "inlining call to conv1"
+}
+func conv1(v uint64) uint64 { // ERROR "can inline conv1"
+ return uint64(uint64(uint64(uint64(uint64(uint64(uint64(uint64(uint64(uint64(uint64(v)))))))))))
+}