rustc: Set release mode cgus to 16 by default

This commit is the next attempt to enable multiple codegen units by default in
release mode, getting some of those sweet, sweet parallelism wins by running
codegen in parallel. Performance should not be lost due to ThinLTO being on by
default as well.

Closes #45320
This commit is contained in:
Alex Crichton 2017-12-21 07:03:16 -08:00
parent de38f49528
commit b5361d0d41
4 changed files with 32 additions and 4 deletions

View File

@ -785,10 +785,7 @@ impl Session {
// As a result 16 was chosen here! Mostly because it was a power of 2 // As a result 16 was chosen here! Mostly because it was a power of 2
// and most benchmarks agreed it was roughly a local optimum. Not very // and most benchmarks agreed it was roughly a local optimum. Not very
// scientific. // scientific.
match self.opts.optimize { 16
config::OptLevel::No => 16,
_ => 1, // FIXME(#46346) this should be 16
}
} }
/// Returns whether ThinLTO is enabled for this compilation /// Returns whether ThinLTO is enabled for this compilation

View File

@ -1732,4 +1732,5 @@ extern "C" {
CU1: *mut *mut c_void, CU1: *mut *mut c_void,
CU2: *mut *mut c_void); CU2: *mut *mut c_void);
pub fn LLVMRustThinLTOPatchDICompileUnit(M: ModuleRef, CU: *mut c_void); pub fn LLVMRustThinLTOPatchDICompileUnit(M: ModuleRef, CU: *mut c_void);
pub fn LLVMRustThinLTORemoveAvailableExternally(M: ModuleRef);
} }

View File

@ -726,6 +726,21 @@ impl ThinModule {
run_pass_manager(cgcx, tm, llmod, config, true); run_pass_manager(cgcx, tm, llmod, config, true);
cgcx.save_temp_bitcode(&mtrans, "thin-lto-after-pm"); cgcx.save_temp_bitcode(&mtrans, "thin-lto-after-pm");
timeline.record("thin-done"); timeline.record("thin-done");
// FIXME: this is a hack around a bug in LLVM right now. Discovered in
// #46910 it was found out that on 32-bit MSVC LLVM will hit a codegen
// error if there's an available_externally function in the LLVM module.
// Typically we don't actually use these functions but ThinLTO makes
// heavy use of them when inlining across modules.
//
// Tracked upstream at https://bugs.llvm.org/show_bug.cgi?id=35736 this
// function call (and its definition on the C++ side of things)
// shouldn't be necessary eventually and we can safetly delete these few
// lines.
llvm::LLVMRustThinLTORemoveAvailableExternally(llmod);
cgcx.save_temp_bitcode(&mtrans, "thin-lto-after-rm-ae");
timeline.record("no-ae");
Ok(mtrans) Ok(mtrans)
} }
} }

View File

@ -1182,6 +1182,15 @@ LLVMRustThinLTOPatchDICompileUnit(LLVMModuleRef Mod, DICompileUnit *Unit) {
MD->addOperand(Unit); MD->addOperand(Unit);
} }
extern "C" void
LLVMRustThinLTORemoveAvailableExternally(LLVMModuleRef Mod) {
Module *M = unwrap(Mod);
for (Function &F : M->functions()) {
if (F.hasAvailableExternallyLinkage())
F.deleteBody();
}
}
#else #else
extern "C" bool extern "C" bool
@ -1272,4 +1281,10 @@ extern "C" void
LLVMRustThinLTOPatchDICompileUnit(LLVMModuleRef Mod) { LLVMRustThinLTOPatchDICompileUnit(LLVMModuleRef Mod) {
report_fatal_error("ThinLTO not available"); report_fatal_error("ThinLTO not available");
} }
extern "C" void
LLVMRustThinLTORemoveAvailableExternally(LLVMModuleRef Mod) {
report_fatal_error("ThinLTO not available");
}
#endif // LLVM_VERSION_GE(4, 0) #endif // LLVM_VERSION_GE(4, 0)