Skip to content

Commit 61fb2f6

Browse files
committed
cmd/compile: speed up hot phi insertion code
This speeds up compilation of the code in #8225 by 25%-30%. The complexity of the algorithm is unchanged, but this shrinks the constant factor so much that it doesn't matter, even the size of the giant type switch gets scaled up dramatically. name old time/op new time/op delta Template 218ms ± 5% 217ms ±10% ~ (p=0.163 n=27+30) Unicode 98.2ms ± 6% 97.7ms ±10% ~ (p=0.150 n=27+29) GoTypes 654ms ± 5% 650ms ± 5% ~ (p=0.350 n=30+30) Compiler 2.70s ± 4% 2.68s ± 3% ~ (p=0.128 n=30+29) name old user-ns/op new user-ns/op delta Template 276user-ms ± 6% 271user-ms ± 7% -1.83% (p=0.003 n=29+28) Unicode 138user-ms ± 5% 137user-ms ± 4% ~ (p=0.071 n=27+27) GoTypes 881user-ms ± 4% 877user-ms ± 4% ~ (p=0.423 n=30+30) Compiler 3.76user-s ± 4% 3.72user-s ± 2% -0.84% (p=0.028 n=30+29) name old alloc/op new alloc/op delta Template 40.7MB ± 0% 40.7MB ± 0% ~ (p=0.936 n=30+30) Unicode 30.8MB ± 0% 30.8MB ± 0% ~ (p=0.859 n=28+30) GoTypes 123MB ± 0% 123MB ± 0% ~ (p=0.273 n=30+30) Compiler 472MB ± 0% 472MB ± 0% ~ (p=0.432 n=30+30) name old allocs/op new allocs/op delta Template 401k ± 1% 401k ± 1% ~ (p=0.859 n=30+30) Unicode 331k ± 0% 331k ± 1% ~ (p=0.823 n=28+30) GoTypes 1.24M ± 0% 1.24M ± 0% ~ (p=0.286 n=30+30) Compiler 4.26M ± 0% 4.26M ± 0% ~ (p=0.359 n=30+30) Change-Id: Ia850065a9a84c07a5b0b4e23c1758b5679498da7 Reviewed-on: https://go-review.googlesource.com/36112 Run-TryBot: Josh Bleecher Snyder <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Keith Randall <[email protected]>
1 parent 69e1634 commit 61fb2f6

File tree

1 file changed

+6
-1
lines changed
  • src/cmd/compile/internal/gc

1 file changed

+6
-1
lines changed

src/cmd/compile/internal/gc/phi.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,12 @@ func (s *phiState) resolveFwdRefs() {
343343
if v.Op != ssa.OpPhi {
344344
break // All phis will be at the end of the block during phi building.
345345
}
346-
v.SetArg(i, values[v.AuxInt])
346+
// Only set arguments that have been resolved.
347+
// For very wide CFGs, this significantly speeds up phi resolution.
348+
// See golang.org/issue/8225.
349+
if w := values[v.AuxInt]; w.Op != ssa.OpUnknown {
350+
v.SetArg(i, w)
351+
}
347352
}
348353
}
349354

0 commit comments

Comments
 (0)