• Vladimir Kuzmin's avatar
    cmd/compile: avoid extra mapaccess in "m[k] op= r" · 73950831
    Vladimir Kuzmin authored
    Currently, order desugars map assignment operations like
    
        m[k] op= r
    
    into
    
        m[k] = m[k] op r
    
    which in turn is transformed during walk into:
    
        tmp := *mapaccess(m, k)
        tmp = tmp op r
        *mapassign(m, k) = tmp
    
    However, this is suboptimal, as we could instead produce just:
    
        *mapassign(m, k) op= r
    
    One complication though is if "r == 0", then "m[k] /= r" and "m[k] %=
    r" will panic, and they need to do so *before* calling mapassign,
    otherwise we may insert a new zero-value element into the map.
    
    It would be spec compliant to just emit the "r != 0" check before
    calling mapassign (see #23735), but currently these checks aren't
    generated until SSA construction. For now, it's simpler to continue
    desugaring /= and %= into two map indexing operations.
    
    Fixes #23661.
    
    Change-Id: I46e3739d9adef10e92b46fdd78b88d5aabe68952
    Reviewed-on: https://go-review.googlesource.com/91557
    Run-TryBot: Matthew Dempsky <mdempsky@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarAustin Clements <austin@google.com>
    73950831
walk.go 95.2 KB