]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: schedule values dependent on the control later
authorTodd Neal <todd@tneal.org>
Sat, 29 Aug 2015 17:51:04 +0000 (12:51 -0500)
committerTodd Neal <todd@tneal.org>
Mon, 31 Aug 2015 22:17:23 +0000 (22:17 +0000)
To reduce the number of spills, give any non-phi values whose argument
is the control the same priority as the control.

With mask.bash, this reduces regenerated flags from 603 to 240.

Change-Id: I26883d69e80357c56b343428fb528102b3f26e7a
Reviewed-on: https://go-review.googlesource.com/14042
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/ssa/schedule.go

index de0b4acbf478ee2202d6519781d4eec95535e050..cf5f872e0f8d608c722f4a7d77e2d605dee512de 100644 (file)
@@ -89,9 +89,21 @@ func schedule(f *Func) {
                        // Force the control value to be scheduled at the end,
                        // unless it is a phi value (which must be first).
                        score[b.Control.ID] = 4
-                       // TODO: some times control values are used by other values
-                       // in the block.  So the control value will not appear at
-                       // the very end.  Decide if this is a problem or not.
+
+                       // Schedule values dependent on the control value at the end.
+                       // This reduces the number of register spills. We don't find
+                       // all values that depend on the control, just values with a
+                       // direct dependency.  This is cheaper and in testing there
+                       // was no difference in the number of spills.
+                       for _, v := range b.Values {
+                               if v.Op != OpPhi {
+                                       for _, a := range v.Args {
+                                               if a == b.Control {
+                                                       score[v.ID] = 4
+                                               }
+                                       }
+                               }
+                       }
                }
 
                // Initialize priority queue with schedulable values.