mirror of
https://github.com/golang/go
synced 2024-10-02 22:25:08 +00:00
cmd/compile: relax liveness restrictions on ambiguously live
Update gc liveness to remove special conservative treatment of ambiguously live vars, since there is no longer a need to protect against GCDEBUG=gcdead. Change-Id: Id6e2d03218f7d67911e8436d283005a124e6957f Reviewed-on: https://go-review.googlesource.com/24896 Reviewed-by: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
5f36e9a306
commit
6c5e377d23
|
@ -1188,17 +1188,18 @@ func livenessepilogue(lv *Liveness) {
|
|||
avarinit := bvalloc(nvars)
|
||||
any := bvalloc(nvars)
|
||||
all := bvalloc(nvars)
|
||||
ambig := bvalloc(localswords())
|
||||
pparamout := bvalloc(localswords())
|
||||
|
||||
// Set ambig bit for the pointers to heap-allocated pparamout variables.
|
||||
// These are implicitly read by post-deferreturn code and thus must be
|
||||
// kept live throughout the function (if there is any defer that recovers).
|
||||
// Record pointers to heap-allocated pparamout variables. These
|
||||
// are implicitly read by post-deferreturn code and thus must be
|
||||
// kept live throughout the function (if there is any defer that
|
||||
// recovers).
|
||||
if hasdefer {
|
||||
for _, n := range lv.vars {
|
||||
if n.IsOutputParamHeapAddr() {
|
||||
n.Name.Needzero = true
|
||||
xoffset := n.Xoffset + stkptrsize
|
||||
onebitwalktype1(n.Type, &xoffset, ambig)
|
||||
onebitwalktype1(n.Type, &xoffset, pparamout)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1250,11 +1251,6 @@ func livenessepilogue(lv *Liveness) {
|
|||
if debuglive >= 1 {
|
||||
Warnl(p.Lineno, "%v: %L is ambiguously live", Curfn.Func.Nname, n)
|
||||
}
|
||||
|
||||
// Record in 'ambiguous' bitmap.
|
||||
xoffset := n.Xoffset + stkptrsize
|
||||
|
||||
onebitwalktype1(n.Type, &xoffset, ambig)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1355,11 +1351,9 @@ func livenessepilogue(lv *Liveness) {
|
|||
locals := lv.livepointers[pos]
|
||||
onebitlivepointermap(lv, liveout, lv.vars, args, locals)
|
||||
|
||||
// Ambiguously live variables are zeroed immediately after
|
||||
// function entry. Mark them live for all the non-entry bitmaps
|
||||
// so that GODEBUG=gcdead=1 mode does not poison them.
|
||||
// Mark pparamout variables (as described above)
|
||||
if p.As == obj.ACALL {
|
||||
bvor(locals, locals, ambig)
|
||||
bvor(locals, locals, pparamout)
|
||||
}
|
||||
|
||||
// Show live pointer bitmaps.
|
||||
|
|
19
test/live.go
19
test/live.go
|
@ -47,24 +47,25 @@ func f2(b bool) {
|
|||
}
|
||||
|
||||
func f3(b1, b2 bool) {
|
||||
// Because x and y are ambiguously live, they appear
|
||||
// live throughout the function, to avoid being poisoned
|
||||
// in GODEBUG=gcdead=1 mode.
|
||||
// Here x and y are ambiguously live. In previous go versions they
|
||||
// were marked as live throughout the function to avoid being
|
||||
// poisoned in GODEBUG=gcdead=1 mode; this is now no longer the
|
||||
// case.
|
||||
|
||||
printint(0) // ERROR "live at call to printint: x y$"
|
||||
printint(0)
|
||||
if b1 == false {
|
||||
printint(0) // ERROR "live at call to printint: x y$"
|
||||
printint(0)
|
||||
return
|
||||
}
|
||||
|
||||
if b2 {
|
||||
var x *int
|
||||
printpointer(&x) // ERROR "live at call to printpointer: x y$"
|
||||
printpointer(&x) // ERROR "live at call to printpointer: x y$"
|
||||
printpointer(&x) // ERROR "live at call to printpointer: x$"
|
||||
printpointer(&x) // ERROR "live at call to printpointer: x$"
|
||||
} else {
|
||||
var y *int
|
||||
printpointer(&y) // ERROR "live at call to printpointer: x y$"
|
||||
printpointer(&y) // ERROR "live at call to printpointer: x y$"
|
||||
printpointer(&y) // ERROR "live at call to printpointer: y$"
|
||||
printpointer(&y) // ERROR "live at call to printpointer: y$"
|
||||
}
|
||||
printint(0) // ERROR "f3: x \(type \*int\) is ambiguously live$" "f3: y \(type \*int\) is ambiguously live$" "live at call to printint: x y$"
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue