From 851ceebcebb2ae9352a2be958c86f63e70d344b1 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 22 Jul 2015 21:21:50 -0700 Subject: [PATCH] [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 --- src/cmd/compile/internal/ssa/cse.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) 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:]) } }