]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix offset-generator for storeOneLoad
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Sat, 28 Aug 2021 08:27:55 +0000 (15:27 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Sat, 28 Aug 2021 17:05:43 +0000 (17:05 +0000)
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>
src/cmd/compile/internal/ssa/expand_calls.go
test/fixedbugs/issue48026.go [new file with mode: 0644]

index a1ce27cc4a75548a1a9e13b21cb599c7306cc487..b37d3b8c9c03a400f24b46be3bba51d9fa0fed80 100644 (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.
 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)
 }
diff --git a/test/fixedbugs/issue48026.go b/test/fixedbugs/issue48026.go
new file mode 100644 (file)
index 0000000..a693d33
--- /dev/null
@@ -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)
+}