// 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 {
- 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)
return x.storeArgOrLoad(pos, b, w, mem, t, offStore, loadRegOffset, storeRc)
}
--- /dev/null
+// 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)
+}