From: Josh Bleecher Snyder Date: Thu, 23 Jul 2015 04:21:50 +0000 (-0700) Subject: [dev.ssa] cmd/compile: don't alloc new CSE classes X-Git-Tag: go1.7beta1~1623^2^2~355 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=851ceebcebb2ae9352a2be958c86f63e70d344b1;p=gostls13.git [dev.ssa] cmd/compile: don't alloc new CSE classes 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 --- diff --git a/src/cmd/compile/internal/ssa/cse.go b/src/cmd/compile/internal/ssa/cse.go index c98217339b..6851ca9f40 100644 --- a/src/cmd/compile/internal/ssa/cse.go +++ b/src/cmd/compile/internal/ssa/cse.go @@ -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:]) } }