Set PrepareForThinLTO flag when using ThinLTO
The LLVM PassManager has a PrepareForThinLTO flag, which is intended when compilation occurs in conjunction with linking by ThinLTO. The flag has two effects: * The NameAnonGlobal pass is run after all other passes, which ensures that all globals have a name. * In optimized builds, a number of late passes (mainly related to vectorization and unrolling) are disabled, on the rationale that these a) will increase codesize of the intermediate artifacts and b) will be run by ThinLTO again anyway. This patch enables the use of PrepareForThinLTO if Thin or ThinLocal linking is used. The background for this change is the CI failure in #49479, which we assume to be caused by the NameAnonGlobal pass not being run. As this changes which passes LLVM runs, this might have performance (or other) impact, so we want to land this separately.
This commit is contained in:
parent
c705877b1d
commit
a70ef4cb49
4 changed files with 10 additions and 3 deletions
|
@ -1651,6 +1651,7 @@ extern "C" {
|
||||||
MergeFunctions: bool,
|
MergeFunctions: bool,
|
||||||
SLPVectorize: bool,
|
SLPVectorize: bool,
|
||||||
LoopVectorize: bool,
|
LoopVectorize: bool,
|
||||||
|
PrepareForThinLTO: bool,
|
||||||
PGOGenPath: *const c_char,
|
PGOGenPath: *const c_char,
|
||||||
PGOUsePath: *const c_char);
|
PGOUsePath: *const c_char);
|
||||||
pub fn LLVMRustAddLibraryInfo(PM: PassManagerRef,
|
pub fn LLVMRustAddLibraryInfo(PM: PassManagerRef,
|
||||||
|
|
|
@ -482,7 +482,7 @@ fn run_pass_manager(cgcx: &CodegenContext,
|
||||||
llvm::CodeGenOptLevel::None => llvm::CodeGenOptLevel::Less,
|
llvm::CodeGenOptLevel::None => llvm::CodeGenOptLevel::Less,
|
||||||
level => level,
|
level => level,
|
||||||
};
|
};
|
||||||
with_llvm_pmb(llmod, config, opt_level, &mut |b| {
|
with_llvm_pmb(llmod, config, opt_level, false, &mut |b| {
|
||||||
if thin {
|
if thin {
|
||||||
if !llvm::LLVMRustPassManagerBuilderPopulateThinLTOPassManager(b, pm) {
|
if !llvm::LLVMRustPassManagerBuilderPopulateThinLTOPassManager(b, pm) {
|
||||||
panic!("this version of LLVM does not support ThinLTO");
|
panic!("this version of LLVM does not support ThinLTO");
|
||||||
|
|
|
@ -547,7 +547,8 @@ unsafe fn optimize(cgcx: &CodegenContext,
|
||||||
llvm::LLVMRustAddAnalysisPasses(tm, fpm, llmod);
|
llvm::LLVMRustAddAnalysisPasses(tm, fpm, llmod);
|
||||||
llvm::LLVMRustAddAnalysisPasses(tm, mpm, llmod);
|
llvm::LLVMRustAddAnalysisPasses(tm, mpm, llmod);
|
||||||
let opt_level = config.opt_level.unwrap_or(llvm::CodeGenOptLevel::None);
|
let opt_level = config.opt_level.unwrap_or(llvm::CodeGenOptLevel::None);
|
||||||
with_llvm_pmb(llmod, &config, opt_level, &mut |b| {
|
let prepare_for_thin_lto = cgcx.lto == Lto::Thin || cgcx.lto == Lto::ThinLocal;
|
||||||
|
with_llvm_pmb(llmod, &config, opt_level, prepare_for_thin_lto, &mut |b| {
|
||||||
llvm::LLVMPassManagerBuilderPopulateFunctionPassManager(b, fpm);
|
llvm::LLVMPassManagerBuilderPopulateFunctionPassManager(b, fpm);
|
||||||
llvm::LLVMPassManagerBuilderPopulateModulePassManager(b, mpm);
|
llvm::LLVMPassManagerBuilderPopulateModulePassManager(b, mpm);
|
||||||
})
|
})
|
||||||
|
@ -2042,6 +2043,7 @@ pub fn run_assembler(cgcx: &CodegenContext, handler: &Handler, assembly: &Path,
|
||||||
pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
|
pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
|
||||||
config: &ModuleConfig,
|
config: &ModuleConfig,
|
||||||
opt_level: llvm::CodeGenOptLevel,
|
opt_level: llvm::CodeGenOptLevel,
|
||||||
|
prepare_for_thin_lto: bool,
|
||||||
f: &mut FnMut(llvm::PassManagerBuilderRef)) {
|
f: &mut FnMut(llvm::PassManagerBuilderRef)) {
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
|
||||||
|
@ -2069,6 +2071,7 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
|
||||||
config.merge_functions,
|
config.merge_functions,
|
||||||
config.vectorize_slp,
|
config.vectorize_slp,
|
||||||
config.vectorize_loop,
|
config.vectorize_loop,
|
||||||
|
prepare_for_thin_lto,
|
||||||
pgo_gen_path.as_ref().map_or(ptr::null(), |s| s.as_ptr()),
|
pgo_gen_path.as_ref().map_or(ptr::null(), |s| s.as_ptr()),
|
||||||
pgo_use_path.as_ref().map_or(ptr::null(), |s| s.as_ptr()),
|
pgo_use_path.as_ref().map_or(ptr::null(), |s| s.as_ptr()),
|
||||||
);
|
);
|
||||||
|
|
|
@ -428,13 +428,16 @@ extern "C" void LLVMRustAddAnalysisPasses(LLVMTargetMachineRef TM,
|
||||||
|
|
||||||
extern "C" void LLVMRustConfigurePassManagerBuilder(
|
extern "C" void LLVMRustConfigurePassManagerBuilder(
|
||||||
LLVMPassManagerBuilderRef PMBR, LLVMRustCodeGenOptLevel OptLevel,
|
LLVMPassManagerBuilderRef PMBR, LLVMRustCodeGenOptLevel OptLevel,
|
||||||
bool MergeFunctions, bool SLPVectorize, bool LoopVectorize,
|
bool MergeFunctions, bool SLPVectorize, bool LoopVectorize, bool PrepareForThinLTO,
|
||||||
const char* PGOGenPath, const char* PGOUsePath) {
|
const char* PGOGenPath, const char* PGOUsePath) {
|
||||||
// Ignore mergefunc for now as enabling it causes crashes.
|
// Ignore mergefunc for now as enabling it causes crashes.
|
||||||
// unwrap(PMBR)->MergeFunctions = MergeFunctions;
|
// unwrap(PMBR)->MergeFunctions = MergeFunctions;
|
||||||
unwrap(PMBR)->SLPVectorize = SLPVectorize;
|
unwrap(PMBR)->SLPVectorize = SLPVectorize;
|
||||||
unwrap(PMBR)->OptLevel = fromRust(OptLevel);
|
unwrap(PMBR)->OptLevel = fromRust(OptLevel);
|
||||||
unwrap(PMBR)->LoopVectorize = LoopVectorize;
|
unwrap(PMBR)->LoopVectorize = LoopVectorize;
|
||||||
|
#if LLVM_VERSION_GE(4, 0)
|
||||||
|
unwrap(PMBR)->PrepareForThinLTO = PrepareForThinLTO;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef PGO_AVAILABLE
|
#ifdef PGO_AVAILABLE
|
||||||
if (PGOGenPath) {
|
if (PGOGenPath) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue