mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: don't inline fn with shape params, but passed no shape arg
This is the same fix as CL 36126, but for the reverse case, function with shape params but passed no shape arg. The same conversion problem may occur in this case, see details explanation there. Fixes #51909 Fixes #51925 Change-Id: Ib0c1973c7511d85b4918a252c80060f1864180cf Reviewed-on: https://go-review.googlesource.com/c/go/+/395854 Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
21680959f8
commit
cb458c05a8
3 changed files with 100 additions and 1 deletions
|
|
@ -701,7 +701,7 @@ func mkinlcall(n *ir.CallExpr, fn *ir.Func, maxCost int32, inlMap map[*ir.Func]b
|
|||
// apparent when we first created the instantiation of the generic function.
|
||||
// We can't handle this if we actually do the inlining, since we want to know
|
||||
// all interface conversions immediately after stenciling. So, we avoid
|
||||
// inlining in this case. See #49309.
|
||||
// inlining in this case. See #49309. (1)
|
||||
if !fn.Type().HasShape() {
|
||||
for _, arg := range n.Args {
|
||||
if arg.Type().HasShape() {
|
||||
|
|
@ -712,6 +712,23 @@ func mkinlcall(n *ir.CallExpr, fn *ir.Func, maxCost int32, inlMap map[*ir.Func]b
|
|||
return n
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Don't inline a function fn that has shape parameters, but is passed no shape arg.
|
||||
// See comments (1) above, and issue #51909
|
||||
inlineable := false
|
||||
for _, arg := range n.Args {
|
||||
if arg.Type().HasShape() {
|
||||
inlineable = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !inlineable {
|
||||
if logopt.Enabled() {
|
||||
logopt.LogOpt(n.Pos(), "cannotInlineCall", "inline", ir.FuncName(ir.CurFunc),
|
||||
fmt.Sprintf("inlining shape function %v with no shape args", ir.FuncName(fn)))
|
||||
}
|
||||
return n
|
||||
}
|
||||
}
|
||||
|
||||
if base.Flag.Cfg.Instrumenting && types.IsRuntimePkg(fn.Sym().Pkg) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue