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:
Cuong Manh Le 2022-03-25 23:29:44 +07:00
parent 21680959f8
commit cb458c05a8
3 changed files with 100 additions and 1 deletions

View file

@ -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) {