diff --git a/src/cmd/compile/internal/ssa/_gen/generic.rules b/src/cmd/compile/internal/ssa/_gen/generic.rules index c5e2507a14f..6255045c6f5 100644 --- a/src/cmd/compile/internal/ssa/_gen/generic.rules +++ b/src/cmd/compile/internal/ssa/_gen/generic.rules @@ -2778,10 +2778,10 @@ (Load (ITab (IMake (Convert (Addr {s} sb) _) _)) _) && isFixedSym(s, 0) => (Addr {fixedSym(b.Func, s, 0)} sb) // Loading constant values from abi.PtrType.Elem. -(Load (OffPtr [off] (Addr {s} sb) ) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(s, off)} sb) -(Load (OffPtr [off] (Convert (Addr {s} sb) _) ) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(s, off)} sb) -(Load (OffPtr [off] (ITab (IMake (Addr {s} sb) _))) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(s, off)} sb) -(Load (OffPtr [off] (ITab (IMake (Convert (Addr {s} sb) _) _))) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(s, off)} sb) +(Load (OffPtr [off] (Addr {s} sb) ) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(b.Func, s, off)} sb) +(Load (OffPtr [off] (Convert (Addr {s} sb) _) ) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(b.Func, s, off)} sb) +(Load (OffPtr [off] (ITab (IMake (Addr {s} sb) _))) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(b.Func, s, off)} sb) +(Load (OffPtr [off] (ITab (IMake (Convert (Addr {s} sb) _) _))) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(b.Func, s, off)} sb) // Loading constant values from runtime._type.hash. (Load (OffPtr [off] (Addr {sym} _) ) _) && t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off) => (Const32 [fixed32(config, sym, off)]) diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 8f331c283a6..a4242c2141d 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -2029,14 +2029,16 @@ func isPtrElem(sym Sym, off int64) bool { } return false } -func ptrElem(sym Sym, off int64) Sym { +func ptrElem(f *Func, sym Sym, off int64) Sym { lsym := sym.(*obj.LSym) if strings.HasPrefix(lsym.Name, "type:*") { if ti, ok := (*lsym.Extra).(*obj.TypeInfo); ok { t := ti.Type.(*types.Type) if t.Kind() == types.TPTR { if off == rttype.PtrType.OffsetOf("Elem") { - return reflectdata.TypeLinksym(t.Elem()) + elemSym := reflectdata.TypeLinksym(t.Elem()) + reflectdata.MarkTypeSymUsedInInterface(elemSym, f.fe.Func().Linksym()) + return elemSym } } } diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index a0a4960397d..e776ea5301b 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -15083,7 +15083,7 @@ func rewriteValuegeneric_OpLoad(v *Value) bool { } // match: (Load (OffPtr [off] (Addr {s} sb) ) _) // cond: t.IsPtr() && isPtrElem(s, off) - // result: (Addr {ptrElem(s, off)} sb) + // result: (Addr {ptrElem(b.Func, s, off)} sb) for { t := v.Type if v_0.Op != OpOffPtr { @@ -15100,13 +15100,13 @@ func rewriteValuegeneric_OpLoad(v *Value) bool { break } v.reset(OpAddr) - v.Aux = symToAux(ptrElem(s, off)) + v.Aux = symToAux(ptrElem(b.Func, s, off)) v.AddArg(sb) return true } // match: (Load (OffPtr [off] (Convert (Addr {s} sb) _) ) _) // cond: t.IsPtr() && isPtrElem(s, off) - // result: (Addr {ptrElem(s, off)} sb) + // result: (Addr {ptrElem(b.Func, s, off)} sb) for { t := v.Type if v_0.Op != OpOffPtr { @@ -15127,13 +15127,13 @@ func rewriteValuegeneric_OpLoad(v *Value) bool { break } v.reset(OpAddr) - v.Aux = symToAux(ptrElem(s, off)) + v.Aux = symToAux(ptrElem(b.Func, s, off)) v.AddArg(sb) return true } // match: (Load (OffPtr [off] (ITab (IMake (Addr {s} sb) _))) _) // cond: t.IsPtr() && isPtrElem(s, off) - // result: (Addr {ptrElem(s, off)} sb) + // result: (Addr {ptrElem(b.Func, s, off)} sb) for { t := v.Type if v_0.Op != OpOffPtr { @@ -15158,13 +15158,13 @@ func rewriteValuegeneric_OpLoad(v *Value) bool { break } v.reset(OpAddr) - v.Aux = symToAux(ptrElem(s, off)) + v.Aux = symToAux(ptrElem(b.Func, s, off)) v.AddArg(sb) return true } // match: (Load (OffPtr [off] (ITab (IMake (Convert (Addr {s} sb) _) _))) _) // cond: t.IsPtr() && isPtrElem(s, off) - // result: (Addr {ptrElem(s, off)} sb) + // result: (Addr {ptrElem(b.Func, s, off)} sb) for { t := v.Type if v_0.Op != OpOffPtr { @@ -15193,7 +15193,7 @@ func rewriteValuegeneric_OpLoad(v *Value) bool { break } v.reset(OpAddr) - v.Aux = symToAux(ptrElem(s, off)) + v.Aux = symToAux(ptrElem(b.Func, s, off)) v.AddArg(sb) return true }