mirror of
https://github.com/golang/go
synced 2024-11-26 10:38:07 -07:00
cmd/compile: fix offset-generator for storeOneLoad
storeOneLoad decompose Load that is then stored, the offset value must be created on the same block with the Load to be dominated, otherwise, it's unsafe if one does not dominate the other. Fixes #48026 Change-Id: Iee5e6c5d3e1b09862afe4e65f7bcd771b4c57367 Reviewed-on: https://go-review.googlesource.com/c/go/+/345434 Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
5afa555428
commit
6df3aac4ae
@ -852,7 +852,7 @@ func storeOneArg(x *expandState, pos src.XPos, b *Block, locs []*LocalSlot, suff
|
|||||||
|
|
||||||
// storeOneLoad creates a decomposed (one step) load that is then stored.
|
// storeOneLoad creates a decomposed (one step) load that is then stored.
|
||||||
func storeOneLoad(x *expandState, pos src.XPos, b *Block, source, mem *Value, t *types.Type, offArg, offStore int64, loadRegOffset Abi1RO, storeRc registerCursor) *Value {
|
func storeOneLoad(x *expandState, pos src.XPos, b *Block, source, mem *Value, t *types.Type, offArg, offStore int64, loadRegOffset Abi1RO, storeRc registerCursor) *Value {
|
||||||
from := x.offsetFrom(b, source.Args[0], offArg, types.NewPtr(t))
|
from := x.offsetFrom(source.Block, source.Args[0], offArg, types.NewPtr(t))
|
||||||
w := source.Block.NewValue2(source.Pos, OpLoad, t, from, mem)
|
w := source.Block.NewValue2(source.Pos, OpLoad, t, from, mem)
|
||||||
return x.storeArgOrLoad(pos, b, w, mem, t, offStore, loadRegOffset, storeRc)
|
return x.storeArgOrLoad(pos, b, w, mem, t, offStore, loadRegOffset, storeRc)
|
||||||
}
|
}
|
||||||
|
26
test/fixedbugs/issue48026.go
Normal file
26
test/fixedbugs/issue48026.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// compile -d=ssa/check/on
|
||||||
|
|
||||||
|
// Copyright 2021 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package p
|
||||||
|
|
||||||
|
var i int
|
||||||
|
|
||||||
|
type t struct {
|
||||||
|
a, b, c, d, e int
|
||||||
|
}
|
||||||
|
|
||||||
|
func f(p t, q int) int {
|
||||||
|
var a, b, c, d, e, f, g int
|
||||||
|
var h, i, j, k, l, m int
|
||||||
|
_, _, _, _, _, _, _ = a, b, c, d, e, f, g
|
||||||
|
_, _, _, _, _, _ = h, i, j, k, l, m
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func g() int {
|
||||||
|
var v t
|
||||||
|
return f(v, 1<<i)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user