mirror of
https://github.com/golang/go
synced 2024-11-11 20:50:23 -07:00
cmd/compile: keep autos whose address reaches a phi
If the address of an auto reaches a phi then any further stores to the pointer represented by the phi probably need to be kept. This is because stores to the other arguments to the phi may be visible to the program. Fixes #26153. Change-Id: Ic506c6c543bf70d792e5b1a64bdde1e5fdf1126a Reviewed-on: https://go-review.googlesource.com/121796 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Heschi Kreinick <heschi@google.com>
This commit is contained in:
parent
23ce272bb1
commit
adfa8b8691
@ -203,7 +203,8 @@ func elimDeadAutosGeneric(f *Func) {
|
||||
|
||||
// If the address of the auto reaches a memory or control
|
||||
// operation not covered above then we probably need to keep it.
|
||||
if v.Type.IsMemory() || v.Type.IsFlags() || (v.Op != OpPhi && v.MemoryArg() != nil) {
|
||||
// We also need to keep autos if they reach Phis (issue #26153).
|
||||
if v.Type.IsMemory() || v.Type.IsFlags() || v.Op == OpPhi || v.MemoryArg() != nil {
|
||||
for _, a := range args {
|
||||
if n, ok := addr[a]; ok {
|
||||
if !used[n] {
|
||||
|
29
test/fixedbugs/issue26153.go
Normal file
29
test/fixedbugs/issue26153.go
Normal file
@ -0,0 +1,29 @@
|
||||
// run
|
||||
|
||||
// Copyright 2018 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.
|
||||
|
||||
// Issue 26153. The write to ps was incorrectly
|
||||
// removed by the dead auto elimination pass.
|
||||
|
||||
package main
|
||||
|
||||
const hello = "hello world"
|
||||
|
||||
func main() {
|
||||
var s string
|
||||
mangle(&s)
|
||||
if s != hello {
|
||||
panic("write incorrectly elided")
|
||||
}
|
||||
}
|
||||
|
||||
//go:noinline
|
||||
func mangle(ps *string) {
|
||||
if ps == nil {
|
||||
var s string
|
||||
ps = &s
|
||||
}
|
||||
*ps = hello
|
||||
}
|
Loading…
Reference in New Issue
Block a user