diff options
| author | Vladimir Kuzmin <vkuzmin@uber.com> | 2018-02-01 21:33:56 -0800 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2018-03-12 19:27:44 +0000 |
| commit | 7395083136539331537d46875ab9d196797a2173 (patch) | |
| tree | 1442dc0384c3d7916339e84d296d22f554985373 /src/runtime/string_test.go | |
| parent | 85a8d25d535a9b70f6c908e44f8558c207366ff1 (diff) | |
| download | go-7395083136539331537d46875ab9d196797a2173.tar.xz | |
cmd/compile: avoid extra mapaccess in "m[k] op= r"
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: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime/string_test.go')
0 files changed, 0 insertions, 0 deletions
