Skip to content

Commit c245c5b

Browse files
spernsteinerpcwalton
authored andcommitted
enable parallel codegen by default
Enable parallel codegen (2 units) by default when --opt-level is 0 or 1. This gives a minor speedup on large crates (~10%), with only a tiny slowdown (~2%) for small ones (which usually build in under a second regardless). The current default (no parallelization) is used when the user requests optimization (--opt-level 2 or 3), and when the user has enabled LTO (which is incompatible with parallel codegen). This commit also changes the rust build system to use parallel codegen when appropriate. This means codegen-units=4 for stage0 always, and also for stage1 and stage2 when configured with --disable-optimize. (Other settings use codegen-units=1 for stage1 and stage2, to get maximum performance for release binaries.) The build system also sets codegen-units=1 for compiletest tests (compiletest does its own parallelization) and uses the same setting as stage2 for crate tests.
1 parent 4764c16 commit c245c5b

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

mk/main.mk

+7
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,13 @@ RUSTFLAGS_STAGE1 += -C prefer-dynamic
157157
# by not emitting them.
158158
RUSTFLAGS_STAGE0 += -Z no-landing-pads
159159

160+
# Go fast for stage0, and also for stage1/stage2 if optimization is off.
161+
RUSTFLAGS_STAGE0 += -C codegen-units=4
162+
ifdef CFG_DISABLE_OPTIMIZE
163+
RUSTFLAGS_STAGE1 += -C codegen-units=4
164+
RUSTFLAGS_STAGE2 += -C codegen-units=4
165+
endif
166+
160167
# platform-specific auto-configuration
161168
include $(CFG_SRC_DIR)mk/platform.mk
162169

mk/tests.mk

+4
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,10 @@ CTEST_RUSTC_FLAGS := $$(subst -O,,$$(CTEST_RUSTC_FLAGS))
628628
ifndef CFG_DISABLE_OPTIMIZE_TESTS
629629
CTEST_RUSTC_FLAGS += -O
630630
endif
631+
# Force codegen-units=1 for compiletest tests. compiletest does its own
632+
# parallelization internally, so rustc's default codegen-units=2 will actually
633+
# slow things down.
634+
CTEST_RUSTC_FLAGS += -C codegen-units=1
631635

632636
CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) := \
633637
--compile-lib-path $$(HLIB$(1)_H_$(3)) \

src/librustc/driver/config.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,20 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
780780
early_warn("the --crate-file-name argument has been renamed to \
781781
--print-file-name");
782782
}
783-
let cg = build_codegen_options(matches);
783+
784+
let mut cg = build_codegen_options(matches);
785+
786+
if cg.codegen_units == 0 {
787+
match opt_level {
788+
// `-C lto` doesn't work with multiple codegen units.
789+
_ if cg.lto => cg.codegen_units = 1,
790+
791+
No | Less => cg.codegen_units = 2,
792+
Default | Aggressive => cg.codegen_units = 1,
793+
}
794+
}
795+
let cg = cg;
796+
784797

785798
if !cg.remark.is_empty() && debuginfo == NoDebugInfo {
786799
early_warn("-C remark will not show source locations without --debuginfo");

0 commit comments

Comments
 (0)