Commit adfa8b86 authored by Michael Munday's avatar Michael Munday Committed by Brad Fitzpatrick

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: 's avatarKeith Randall <khr@golang.org>
Reviewed-by: 's avatarHeschi Kreinick <heschi@google.com>
parent 23ce272b
......@@ -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] {
......
// 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
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment