Some of the issues in that doc should be addressed now (e.g., the first
two), but the "Assignment to indirect escapes" case still applies.

The issue here is we don't do any points-to analysis during escape
analysis, so we conservatively assume "*p = x" might assign x to the heap.

Ideally, I think we fix this by moving escape analysis to SSA.

In the meantime, what might be reasonable is to at least recognize
assignments through pointer variables that are initialized and then never
re-assigned. We already recognize variables of this form for recognizing
when we can inline calls to closures that were assigned to local variables.

On Thu, Mar 5, 2020 at 10:55 AM Ian Lance Taylor <i...@golang.org> wrote:

> [ +mdempsky ]
>
> On Thu, Mar 5, 2020 at 2:58 AM Ethan Burns <burns.et...@gmail.com> wrote:
> >
> > Thanks. I'll give that doc a read. Just to make sure, I noticed that the
> doc is dated 2015, but the escape analysis implementation seemed to change
> just recently from that implemented in esc.go to a new one in escape.go.
> Dose the doc still apply to the new implementation?
> >
> > On Thu, Mar 5, 2020 at 4:20 AM tokers <zchao1...@gmail.com> wrote:
> >>
> >> This is a known deficiency of Go's escape analysis, which is recorded
> in this doc:
> https://docs.google.com/document/d/1CxgUBPlx9iJzkz9JWkb6tIpTe5q32QDmz8l0BouG0Cw/view#
> >>
> >> On Thursday, March 5, 2020 at 5:58:37 AM UTC+8, burns...@gmail.com
> wrote:
> >>>
> >>> Hi All,
> >>>
> >>> I am trying to debug why a byte slice is escaping in my program. I
> have a small reproducible example here:
> >>>
> >>> % cat escape.go
> >>> package main
> >>>
> >>> func main() {
> >>> x := make([]byte, 5)
> >>> y := new([]byte)
> >>> *y = x
> >>> nothing((*y)[3])
> >>> }
> >>>
> >>> func nothing(b byte) {}
> >>> % go tool compile -m -m -l escape.go
> >>> escape.go:4:11: make([]byte, 5) escapes to heap:
> >>> escape.go:4:11:   flow: x = &{storage for make([]byte, 5)}:
> >>> escape.go:4:11:     from make([]byte, 5) (spill) at escape.go:4:11
> >>> escape.go:4:11:     from x := make([]byte, 5) (assign) at escape.go:4:4
> >>> escape.go:4:11:   flow: {heap} = x:
> >>> escape.go:4:11:     from *y = x (assign) at escape.go:6:5
> >>> escape.go:4:11: make([]byte, 5) escapes to heap
> >>> escape.go:5:10: new([]byte) does not escape
> >>>
> >>> It seems to me like neither x nor it's backing array should escape,
> but I'm having trouble figuring out why it's flagged as escaping from the
> debug output.
> >>>
> >>> % go version
> >>> go version go1.14 darwin/amd64
> >>>
> >>>
> >>> Any help would be appreciated.
> >>>
> >>> Ethan
> >>>
> >> --
> >> You received this message because you are subscribed to a topic in the
> Google Groups "golang-nuts" group.
> >> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/golang-nuts/2s0_gQjR7yE/unsubscribe.
> >> To unsubscribe from this group and all its topics, send an email to
> golang-nuts+unsubscr...@googlegroups.com.
> >> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/646ff0ef-2feb-409b-9ac4-8c667b40b392%40googlegroups.com
> .
> >
> > --
> > You received this message because you are subscribed to the Google
> Groups "golang-nuts" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> an email to golang-nuts+unsubscr...@googlegroups.com.
> > To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/CAGE%3DEi2Bdzydu%2BzGHA0-xmMd0NTrBePBcTFAAvm1A-1RLiaa9Q%40mail.gmail.com
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAF52%2BS6QYjQWYdLp9_mbHQQ-0qg4A_tt%3DiGv9A8TOkKCL7HhNg%40mail.gmail.com.

Reply via email to