]> Cypherpunks repositories - gostls13.git/commit
[release-branch.go1.19] cmd/compile: handle partially overlapping assignments
authorKeith Randall <khr@golang.org>
Mon, 22 Aug 2022 17:26:50 +0000 (10:26 -0700)
committerHeschi Kreinick <heschi@google.com>
Mon, 29 Aug 2022 19:12:54 +0000 (19:12 +0000)
commitd39fd4f2b74406d6a8c1af13fdc731051d076931
tree0ccb663673ef3c1e291b0dd188fae556bcbfa98c
parentf1b38e8b41ce2b5c6e0135a3ebbd566f90fa916b
[release-branch.go1.19] cmd/compile: handle partially overlapping assignments

Normally, when moving Go values of type T from one location to another,
we don't need to worry about partial overlaps. The two Ts must either be
in disjoint (nonoverlapping) memory or in exactly the same location.
There are 2 cases where this isn't true:
 1) Using unsafe you can arrange partial overlaps.
 2) Since Go 1.17, you can use a cast from a slice to a ptr-to-array.
    https://go.dev/ref/spec#Conversions_from_slice_to_array_pointer
    This feature can be used to construct partial overlaps of array types.
      var a [3]int
      p := (*[2]int)(a[:])
      q := (*[2]int)(a[1:])
      *p = *q
We don't care about solving 1. Or at least, we haven't historically
and no one has complained.
For 2, we need to ensure that if there might be partial overlap,
then we can't use OpMove; we must use memmove instead.
(memmove handles partial overlap by copying in the correct
direction. OpMove does not.)

Note that we have to be careful here not to introduce a call when
we're marshaling arguments to a call or unmarshaling results from a call.

Fixes #54629

Change-Id: I1ca6aba8041576849c1d85f1fa33ae61b80a373d
Reviewed-on: https://go-review.googlesource.com/c/go/+/425076
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
(cherry picked from commit 332a5981d0ae3f21f668f94755f43ecd8ee9a9eb)
Reviewed-on: https://go-review.googlesource.com/c/go/+/425234
src/cmd/compile/internal/ir/symtab.go
src/cmd/compile/internal/ssa/gen/genericOps.go
src/cmd/compile/internal/ssa/rewrite.go
src/cmd/compile/internal/ssagen/ssa.go
test/fixedbugs/issue54467.go [new file with mode: 0644]
test/nilptr5.go