]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: don't alloc new CSE classes
authorJosh Bleecher Snyder <josharian@gmail.com>
Thu, 23 Jul 2015 04:21:50 +0000 (21:21 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 23 Jul 2015 18:13:32 +0000 (18:13 +0000)
This reduces the time to compile
test/slice3.go on my laptop from ~12s to ~3.8s.
It reduces the max memory use from ~4.8gb to
~450mb.

This is still considerably worse than tip,
at 1s and 300mb respectively, but it's
getting closer.

Hopefully this will fix the build at long last.

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

index c98217339be616f0ca01307dc02c01a61ad85ff8..6851ca9f401b7fc48335083ccd88c2de657dc931 100644 (file)
@@ -85,18 +85,22 @@ func cse(f *Func) {
                        e := partition[i]
                        v := e[0]
                        // all values in this equiv class that are not equivalent to v get moved
-                       // into another equiv class q.
-                       var q eqclass
+                       // into another equiv class.
+                       // To avoid allocating while building that equivalence class,
+                       // move the values equivalent to v to the beginning of e,
+                       // other values to the end of e, and track where the split is.
+                       allvals := e
+                       split := len(e)
                eqloop:
                        for j := 1; j < len(e); {
                                w := e[j]
                                for i := 0; i < len(v.Args); i++ {
                                        if valueEqClass[v.Args[i].ID] != valueEqClass[w.Args[i].ID] || !v.Type.Equal(w.Type) {
                                                // w is not equivalent to v.
-                                               // remove w from e
-                                               e, e[j] = e[:len(e)-1], e[len(e)-1]
-                                               // add w to q
-                                               q = append(q, w)
+                                               // move it to the end, shrink e, and move the split.
+                                               e[j], e[len(e)-1] = e[len(e)-1], e[j]
+                                               e = e[:len(e)-1]
+                                               split--
                                                valueEqClass[w.ID] = len(partition)
                                                changed = true
                                                continue eqloop
@@ -106,8 +110,8 @@ func cse(f *Func) {
                                j++
                        }
                        partition[i] = e
-                       if q != nil {
-                               partition = append(partition, q)
+                       if split < len(allvals) {
+                               partition = append(partition, allvals[split:])
                        }
                }