]> Cypherpunks repositories - gostls13.git/commit
cmd/compile: Use Sreedhar+Gao phi building algorithm
authorKeith Randall <khr@golang.org>
Fri, 30 Sep 2016 17:12:32 +0000 (10:12 -0700)
committerKeith Randall <khr@golang.org>
Mon, 3 Oct 2016 20:30:08 +0000 (20:30 +0000)
commit5a6e511c614a158cb58150fb62bfbc207a33922d
tree311639b9551d49020a3dde7138ac8e0a06794bf2
parentd0e92f61e5c5c59395d9b1a3b4f5c7b90dec5bc8
cmd/compile: Use Sreedhar+Gao phi building algorithm

Should be more asymptotically happy.

We process each variable in turn to find all the
locations where it needs a phi (the dominance frontier
of all of its definitions).  Then we add all those phis.
This takes O(n * #variables), although hopefully much less.

Then we do a single tree walk to match all the
FwdRefs with the nearest definition or phi.
This takes O(n) time.

The one remaining inefficiency is that we might end up
introducing a bunch of dead phis in the first step.
A TODO is to introduce phis only where they might be
used by a read.

The old algorithm is still faster on small functions,
so there's a cutover size (currently 500 blocks).

This algorithm supercedes the David's sparse phi
placement algorithm for large functions.

Lowers compile time of example from #14934 from
~10 sec to ~4 sec.
Lowers compile time of example from #16361 from
~4.5 sec to ~3 sec.
Lowers #16407 from ~20 min to ~30 sec.

Update #14934
Update #16361
Fixes #16407

Change-Id: I1cff6364e1623c143190b6a924d7599e309db58f
Reviewed-on: https://go-review.googlesource.com/30163
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/gc/phi.go [new file with mode: 0644]
src/cmd/compile/internal/gc/racewalk.go
src/cmd/compile/internal/gc/sparselocatephifunctions.go [deleted file]
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/ssa/block.go
src/cmd/compile/internal/ssa/func.go