]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: compile all functions concurrently
authorJosh Bleecher Snyder <josharian@gmail.com>
Sun, 23 Apr 2017 12:06:22 +0000 (05:06 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Fri, 30 Mar 2018 21:38:50 +0000 (21:38 +0000)
CL 40693 added concurrent backend compilation support,
and used it for user-provided functions.
Autogenerated functions were still compiled serially.
This CL brings them into the fold.
As of this CL, when requested,
no functions are compiled serially.

There generally aren't many autogenerated functions.
When there are, this CL can help a lot,
because autogenerated functions are usually short.
Many short functions is the best case scenario
for concurrent compilation; see CL 41192.

One example of such a package comes from Dave Cheney's benchjuju:
github.com/juju/govmomi/vim25/types.
It has thousands of autogenerated functions.
This CL improves performance on the entire benchmark
by around a second on my machine at c=8, or about ~5%.

Updates #15756

Change-Id: Ia21e302b2469a9ed743df02244ec7ebde55b32f3
Reviewed-on: https://go-review.googlesource.com/41503
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/gc/main.go
src/cmd/compile/internal/gc/obj.go

index 33fbb90be422b46d18048bed416ee63ad8c4a15f..e72bdfa2d6bcb8ca6500ecdd01572b291a6630ef 100644 (file)
@@ -626,13 +626,6 @@ func Main(archInit func(*Arch)) {
 
                compileFunctions()
 
-               // We autogenerate and compile some small functions
-               // such as method wrappers and equality/hash routines
-               // while exporting code.
-               // Disable concurrent compilation from here on,
-               // at least until this convoluted structure has been unwound.
-               nBackendWorkers = 1
-
                if nowritebarrierrecCheck != nil {
                        // Write barriers are now known. Check the
                        // call graph.
index a694e61099b9d01d9f3ecf2a114bb51273352da4..6b33f2467bd8f7568cb7029c4c946788449defb1 100644 (file)
@@ -140,6 +140,17 @@ func dumpLinkerObj(bout *bio.Writer) {
        dumpimportstrings()
        dumpbasictypes()
 
+       // The first call to dumpsignats can generate functions,
+       // like method wrappers and hash and equality routines.
+       compileFunctions()
+
+       // Process any new signats added during compilation.
+       // No need to loop here; signats from compiling the generated
+       // functions should not themselves generate new functions.
+       // If they do, we'll know about it; the sanity check of
+       // len(compilequeue) in gc.Main will fail.
+       dumpsignats()
+
        // Dump extra globals.
        tmp := externdcl