]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/compile/internal/ssagen/ssa.go
cmd/compile: restore zero-copy string->[]byte optimization
[gostls13.git] / src / cmd / compile / internal / ssagen / ssa.go
index fe4a24200229094fd10ebc3a41110cda009e77f7..28f68e01bc83444970cc612067986fc429e58cc8 100644 (file)
@@ -2659,6 +2659,14 @@ func (s *state) exprCheckPtr(n ir.Node, checkPtrOK bool) *ssa.Value {
                n := n.(*ir.ConvExpr)
                str := s.expr(n.X)
                ptr := s.newValue1(ssa.OpStringPtr, s.f.Config.Types.BytePtr, str)
+               if !n.NonNil() {
+                       // We need to ensure []byte("") evaluates to []byte{}, and not []byte(nil).
+                       //
+                       // TODO(mdempsky): Investigate using "len != 0" instead of "ptr != nil".
+                       cond := s.newValue2(ssa.OpNeqPtr, types.Types[types.TBOOL], ptr, s.constNil(ptr.Type))
+                       zerobase := s.newValue1A(ssa.OpAddr, ptr.Type, ir.Syms.Zerobase, s.sb)
+                       ptr = s.ternary(cond, ptr, zerobase)
+               }
                len := s.newValue1(ssa.OpStringLen, types.Types[types.TINT], str)
                return s.newValue3(ssa.OpSliceMake, n.Type(), ptr, len, len)
        case ir.OCFUNC: