• Hugues Bruant's avatar
    cmd/compile: fix reassignment check · 483e298d
    Hugues Bruant authored
    CL 65071 enabled inlining for local closures with no captures.
    
    To determine safety of inlining a call sites, we check whether the
    variable holding the closure has any assignments after its original
    definition.
    
    Unfortunately, that check did not catch OAS2MAPR and OAS2DOTTYPE,
    leading to incorrect inlining when a variable holding a closure was
    subsequently reassigned through a type conversion or a 2-valued map
    access.
    
    There was another more subtle issue wherein reassignment check would
    always return a false positive for closure calls inside other
    closures. This was caused by the Name.Curfn field of local variables
    pointing to the OCLOSURE node instead of the corresponding ODCLFUNC,
    which resulted in reassigned walking an empty Nbody and thus never
    seeing any reassignments.
    
    This CL fixes these oversights and adds many more tests for closure
    inlining which ensure not only that inlining triggers but also the
    correctness of the resulting code.
    
    Updates #15561
    
    Change-Id: I74bdae849c4ecfa328546d6d62b512e8d54d04ce
    Reviewed-on: https://go-review.googlesource.com/75770Reviewed-by: 's avatarHugues Bruant <hugues.bruant@gmail.com>
    Reviewed-by: 's avatarMatthew Dempsky <mdempsky@google.com>
    Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    483e298d
Name
Last commit
Last update
..
addr2line Loading commit data...
api Loading commit data...
asm Loading commit data...
buildid Loading commit data...
cgo Loading commit data...
compile Loading commit data...
cover Loading commit data...
dist Loading commit data...
doc Loading commit data...
fix Loading commit data...
go Loading commit data...
gofmt Loading commit data...
internal Loading commit data...
link Loading commit data...
nm Loading commit data...
objdump Loading commit data...
pack Loading commit data...
pprof Loading commit data...
trace Loading commit data...
vendor Loading commit data...
vet Loading commit data...