1
0
mirror of https://github.com/golang/go synced 2024-11-18 04:04:49 -07:00

cmd/compile/internal/gc: remove unnecessary bitvector in plive

In livenessepilogue, if we save liveness information for instructions
before updating liveout, we can avoid an extra bitvector temporary and
some extra copying around.

Passes toolstash-check -all.

Change-Id: I10d5803167ef3eba2e9e95094adc7e3d33929cc7
Reviewed-on: https://go-review.googlesource.com/38408
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
This commit is contained in:
Matthew Dempsky 2017-03-22 11:21:35 -07:00
parent d8ed449d8e
commit e95989c1c1

View File

@ -583,7 +583,6 @@ func livenesssolve(lv *Liveness) {
// variables at each safe point locations.
func livenessepilogue(lv *Liveness) {
nvars := int32(len(lv.vars))
livein := bvalloc(nvars)
liveout := bvalloc(nvars)
any := bvalloc(nvars)
all := bvalloc(nvars)
@ -655,9 +654,7 @@ func livenessepilogue(lv *Liveness) {
// Annotate ambiguously live variables so that they can
// be zeroed at function entry.
// livein and liveout are dead here and used as temporaries.
livein.Clear()
// liveout is dead here and used as a temporary.
liveout.AndNot(any, all)
if !liveout.IsEmpty() {
for pos := int32(0); pos < liveout.n; pos++ {
@ -688,51 +685,44 @@ func livenessepilogue(lv *Liveness) {
be := lv.blockEffects(b)
// walk backward, emit pcdata and populate the maps
pos := int32(be.lastbitmapindex)
if pos < 0 {
index := int32(be.lastbitmapindex)
if index < 0 {
// the first block we encounter should have the ATEXT so
// at no point should pos ever be less than zero.
Fatalf("livenessepilogue")
}
livein.Copy(be.liveout)
liveout.Copy(be.liveout)
for i := len(b.Values) - 1; i >= 0; i-- {
v := b.Values[i]
// Propagate liveness information
{
pos, e := lv.valueEffects(v)
liveout.Copy(livein)
if e&varkill != 0 {
livein.Unset(pos)
}
if e&uevar != 0 {
livein.Set(pos)
}
if issafepoint(v) {
// Found an interesting instruction, record the
// corresponding liveness information.
live := lv.livevars[index]
live.Or(live, liveout)
live.Or(live, livedefer) // only for non-entry safe points
index--
}
if !issafepoint(v) {
continue
// Update liveness information.
pos, e := lv.valueEffects(v)
if e&varkill != 0 {
liveout.Unset(pos)
}
if e&uevar != 0 {
liveout.Set(pos)
}
// Found an interesting instruction, record the
// corresponding liveness information.
// Record live variables.
live := lv.livevars[pos]
live.Or(live, liveout)
live.Or(live, livedefer) // only for non-entry safe points
pos--
}
if b == lv.f.Entry {
if pos != 0 {
Fatalf("bad pos for entry point: %v", pos)
if index != 0 {
Fatalf("bad index for entry point: %v", index)
}
// Record live variables.
live := lv.livevars[pos]
live := lv.livevars[index]
live.Or(live, liveout)
}
}