cmd/compile/internal/inline: allow inlining of checkptr arguments

The early return here is meant to suppress inlining of the function
call itself. However, it also suppresses recursing to visit the call
arguments, which are safe to inline.

Change-Id: I75887574c00931cb622277d04a822bc84c29bfa2
Reviewed-on: https://go-review.googlesource.com/c/go/+/543658
Auto-Submit: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Matthew Dempsky 2023-11-19 21:00:17 -08:00 committed by Gopher Robot
parent 0709f1bb00
commit 28a8896d57
3 changed files with 24 additions and 1 deletions

View File

@ -863,7 +863,7 @@ func inlnode(callerfn *ir.Func, n ir.Node, bigCaller bool, inlCalls *[]*ir.Inlin
if base.Debug.Checkptr != 0 { if base.Debug.Checkptr != 0 {
switch types.ReflectSymName(s) { switch types.ReflectSymName(s) {
case "Value.UnsafeAddr", "Value.Pointer": case "Value.UnsafeAddr", "Value.Pointer":
return n n.NoInline = true
} }
} }
} }

View File

@ -0,0 +1,23 @@
// errorcheck -0 -d=checkptr -m
// Copyright 2020 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.
// Test that we can inline the receiver arguments for
// reflect.Value.UnsafeAddr/Pointer, even in checkptr mode.
package main
import (
"reflect"
"unsafe"
)
func main() {
n := 10 // ERROR "moved to heap: n"
m := make(map[string]string) // ERROR "moved to heap: m" "make\(map\[string\]string\) escapes to heap"
_ = unsafe.Pointer(reflect.ValueOf(&n).Elem().UnsafeAddr()) // ERROR "inlining call"
_ = unsafe.Pointer(reflect.ValueOf(&m).Elem().Pointer()) // ERROR "inlining call"
}