]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/gc: remove unnecessary bitvector in plive
authorMatthew Dempsky <mdempsky@google.com>
Wed, 22 Mar 2017 18:21:35 +0000 (11:21 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 23 Mar 2017 17:57:25 +0000 (17:57 +0000)
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>
src/cmd/compile/internal/gc/plive.go

index 03243e9d6bba9380eb476c12d8b42c89ded14282..c38d2a45bf13ac07190f853eb011c93e4546fb55 100644 (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.
 
-                       if !issafepoint(v) {
-                               continue
+                               live := lv.livevars[index]
+                               live.Or(live, liveout)
+                               live.Or(live, livedefer) // only for non-entry safe points
+                               index--
                        }
 
-                       // 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--
+                       // Update liveness information.
+                       pos, e := lv.valueEffects(v)
+                       if e&varkill != 0 {
+                               liveout.Unset(pos)
+                       }
+                       if e&uevar != 0 {
+                               liveout.Set(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)
                }
        }