mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +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
2 changed files with 18 additions and 23 deletions
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue