1
0
mirror of https://github.com/golang/go synced 2024-11-26 08:27:56 -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:
Cuong Manh Le 2021-08-28 15:27:55 +07:00
parent 5afa555428
commit 6df3aac4ae
2 changed files with 27 additions and 1 deletions

View File

@ -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)
} }

View 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)
}