Commit 6c5e377d authored by Than McIntosh's avatar Than McIntosh Committed by Ian Lance Taylor

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/24896Reviewed-by: default avatarDavid Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
parent 5f36e9a3
......@@ -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.
......
......@@ -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$"
}
......
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