mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd: remove GOEXPERIMENT=nounified knob
This CL removes the GOEXPERIMENT=nounified knob, and any conditional statements that depend on that knob. Further CLs to remove unreachable code follow this one. Updates #57410. Change-Id: I39c147e1a83601c73f8316a001705778fee64a91 Reviewed-on: https://go-review.googlesource.com/c/go/+/458615 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
parent
3d49b683c6
commit
4f467f1082
32 changed files with 71 additions and 533 deletions
|
|
@ -57,58 +57,52 @@ func Call(call *ir.CallExpr) {
|
|||
return
|
||||
}
|
||||
|
||||
if base.Debug.Unified != 0 {
|
||||
// N.B., stencil.go converts shape-typed values to interface type
|
||||
// using OEFACE instead of OCONVIFACE, so devirtualization fails
|
||||
// above instead. That's why this code is specific to unified IR.
|
||||
// If typ is a shape type, then it was a type argument originally
|
||||
// and we'd need an indirect call through the dictionary anyway.
|
||||
// We're unable to devirtualize this call.
|
||||
if typ.IsShape() {
|
||||
return
|
||||
}
|
||||
|
||||
// If typ is a shape type, then it was a type argument originally
|
||||
// and we'd need an indirect call through the dictionary anyway.
|
||||
// We're unable to devirtualize this call.
|
||||
if typ.IsShape() {
|
||||
return
|
||||
// If typ *has* a shape type, then it's an shaped, instantiated
|
||||
// type like T[go.shape.int], and its methods (may) have an extra
|
||||
// dictionary parameter. We could devirtualize this call if we
|
||||
// could derive an appropriate dictionary argument.
|
||||
//
|
||||
// TODO(mdempsky): If typ has has a promoted non-generic method,
|
||||
// then that method won't require a dictionary argument. We could
|
||||
// still devirtualize those calls.
|
||||
//
|
||||
// TODO(mdempsky): We have the *runtime.itab in recv.TypeWord. It
|
||||
// should be possible to compute the represented type's runtime
|
||||
// dictionary from this (e.g., by adding a pointer from T[int]'s
|
||||
// *runtime._type to .dict.T[int]; or by recognizing static
|
||||
// references to go:itab.T[int],iface and constructing a direct
|
||||
// reference to .dict.T[int]).
|
||||
if typ.HasShape() {
|
||||
if base.Flag.LowerM != 0 {
|
||||
base.WarnfAt(call.Pos(), "cannot devirtualize %v: shaped receiver %v", call, typ)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// If typ *has* a shape type, then it's an shaped, instantiated
|
||||
// type like T[go.shape.int], and its methods (may) have an extra
|
||||
// dictionary parameter. We could devirtualize this call if we
|
||||
// could derive an appropriate dictionary argument.
|
||||
//
|
||||
// TODO(mdempsky): If typ has has a promoted non-generic method,
|
||||
// then that method won't require a dictionary argument. We could
|
||||
// still devirtualize those calls.
|
||||
//
|
||||
// TODO(mdempsky): We have the *runtime.itab in recv.TypeWord. It
|
||||
// should be possible to compute the represented type's runtime
|
||||
// dictionary from this (e.g., by adding a pointer from T[int]'s
|
||||
// *runtime._type to .dict.T[int]; or by recognizing static
|
||||
// references to go:itab.T[int],iface and constructing a direct
|
||||
// reference to .dict.T[int]).
|
||||
if typ.HasShape() {
|
||||
if base.Flag.LowerM != 0 {
|
||||
base.WarnfAt(call.Pos(), "cannot devirtualize %v: shaped receiver %v", call, typ)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Further, if sel.X's type has a shape type, then it's a shaped
|
||||
// interface type. In this case, the (non-dynamic) TypeAssertExpr
|
||||
// we construct below would attempt to create an itab
|
||||
// corresponding to this shaped interface type; but the actual
|
||||
// itab pointer in the interface value will correspond to the
|
||||
// original (non-shaped) interface type instead. These are
|
||||
// functionally equivalent, but they have distinct pointer
|
||||
// identities, which leads to the type assertion failing.
|
||||
//
|
||||
// TODO(mdempsky): We know the type assertion here is safe, so we
|
||||
// could instead set a flag so that walk skips the itab check. For
|
||||
// now, punting is easy and safe.
|
||||
if sel.X.Type().HasShape() {
|
||||
if base.Flag.LowerM != 0 {
|
||||
base.WarnfAt(call.Pos(), "cannot devirtualize %v: shaped interface %v", call, sel.X.Type())
|
||||
}
|
||||
return
|
||||
// Further, if sel.X's type has a shape type, then it's a shaped
|
||||
// interface type. In this case, the (non-dynamic) TypeAssertExpr
|
||||
// we construct below would attempt to create an itab
|
||||
// corresponding to this shaped interface type; but the actual
|
||||
// itab pointer in the interface value will correspond to the
|
||||
// original (non-shaped) interface type instead. These are
|
||||
// functionally equivalent, but they have distinct pointer
|
||||
// identities, which leads to the type assertion failing.
|
||||
//
|
||||
// TODO(mdempsky): We know the type assertion here is safe, so we
|
||||
// could instead set a flag so that walk skips the itab check. For
|
||||
// now, punting is easy and safe.
|
||||
if sel.X.Type().HasShape() {
|
||||
if base.Flag.LowerM != 0 {
|
||||
base.WarnfAt(call.Pos(), "cannot devirtualize %v: shaped interface %v", call, sel.X.Type())
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
dt := ir.NewTypeAssertExpr(sel.Pos(), sel.X, nil)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue