Skip to content
Snippets Groups Projects
  • Matthew Dempsky's avatar
    ff47dd1d
    cmd/compile/internal/escape: optimize indirect closure calls · ff47dd1d
    Matthew Dempsky authored
    This CL extends escape analysis in two ways.
    
    First, we already optimize directly called closures. For example,
    given:
    
    	var x int  // already stack allocated today
    	p := func() *int { return &x }()
    
    we don't need to move x to the heap, because we can statically track
    where &x flows. This CL extends the same idea to work for indirectly
    called closures too, as long as we know everywhere that they're
    called. For example:
    
    	var x int  // stack allocated after this CL
    	f := func() *int { return &x }
    	p := f()
    
    This will allow a subsequent CL to move the generation of go/defer
    wrappers earlier.
    
    Second, this CL adds tracking to detect when pointer values flow to
    the pointee operand of an indirect assignment statement (i.e., flows
    to p in "*p = x") or to builtins that modify memory (append, copy,
    clear). This isn't utilized in the current CL, but a subsequent CL
    will make use of it to better optimize string->[]byte conversions.
    
    Updates #2205.
    
    Change-Id: I610f9c531e135129c947684833e288ce64406f35
    Reviewed-on: https://go-review.googlesource.com/c/go/+/520259
    
    
    Run-TryBot: Matthew Dempsky <mdempsky@google.com>
    TryBot-Result: Gopher Robot <gobot@golang.org>
    Auto-Submit: Matthew Dempsky <mdempsky@google.com>
    Reviewed-by: default avatarCuong Manh Le <cuong.manhle.vn@gmail.com>
    Reviewed-by: default avatarDmitri Shuralyov <dmitshur@google.com>
    ff47dd1d
    History
    cmd/compile/internal/escape: optimize indirect closure calls
    Matthew Dempsky authored
    This CL extends escape analysis in two ways.
    
    First, we already optimize directly called closures. For example,
    given:
    
    	var x int  // already stack allocated today
    	p := func() *int { return &x }()
    
    we don't need to move x to the heap, because we can statically track
    where &x flows. This CL extends the same idea to work for indirectly
    called closures too, as long as we know everywhere that they're
    called. For example:
    
    	var x int  // stack allocated after this CL
    	f := func() *int { return &x }
    	p := f()
    
    This will allow a subsequent CL to move the generation of go/defer
    wrappers earlier.
    
    Second, this CL adds tracking to detect when pointer values flow to
    the pointee operand of an indirect assignment statement (i.e., flows
    to p in "*p = x") or to builtins that modify memory (append, copy,
    clear). This isn't utilized in the current CL, but a subsequent CL
    will make use of it to better optimize string->[]byte conversions.
    
    Updates #2205.
    
    Change-Id: I610f9c531e135129c947684833e288ce64406f35
    Reviewed-on: https://go-review.googlesource.com/c/go/+/520259
    
    
    Run-TryBot: Matthew Dempsky <mdempsky@google.com>
    TryBot-Result: Gopher Robot <gobot@golang.org>
    Auto-Submit: Matthew Dempsky <mdempsky@google.com>
    Reviewed-by: default avatarCuong Manh Le <cuong.manhle.vn@gmail.com>
    Reviewed-by: default avatarDmitri Shuralyov <dmitshur@google.com>
Code owners
Assign users and groups as approvers for specific file changes. Learn more.