rustc_llvm: rustc_trans: Thread the PGO config down to the pass manager builder.
Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
This commit is contained in:
parent
50a38725e1
commit
324ca7acd5
3 changed files with 46 additions and 7 deletions
|
@ -1641,7 +1641,9 @@ extern "C" {
|
||||||
OptLevel: CodeGenOptLevel,
|
OptLevel: CodeGenOptLevel,
|
||||||
MergeFunctions: bool,
|
MergeFunctions: bool,
|
||||||
SLPVectorize: bool,
|
SLPVectorize: bool,
|
||||||
LoopVectorize: bool);
|
LoopVectorize: bool,
|
||||||
|
PGOGenPath: *const c_char,
|
||||||
|
PGOUsePath: *const c_char);
|
||||||
pub fn LLVMRustAddLibraryInfo(PM: PassManagerRef,
|
pub fn LLVMRustAddLibraryInfo(PM: PassManagerRef,
|
||||||
M: ModuleRef,
|
M: ModuleRef,
|
||||||
DisableSimplifyLibCalls: bool);
|
DisableSimplifyLibCalls: bool);
|
||||||
|
|
|
@ -240,6 +240,9 @@ pub struct ModuleConfig {
|
||||||
/// Some(level) to optimize binary size, or None to not affect program size.
|
/// Some(level) to optimize binary size, or None to not affect program size.
|
||||||
opt_size: Option<llvm::CodeGenOptSize>,
|
opt_size: Option<llvm::CodeGenOptSize>,
|
||||||
|
|
||||||
|
pgo_gen: Option<String>,
|
||||||
|
pgo_use: String,
|
||||||
|
|
||||||
// Flags indicating which outputs to produce.
|
// Flags indicating which outputs to produce.
|
||||||
emit_no_opt_bc: bool,
|
emit_no_opt_bc: bool,
|
||||||
emit_bc: bool,
|
emit_bc: bool,
|
||||||
|
@ -274,6 +277,9 @@ impl ModuleConfig {
|
||||||
opt_level: None,
|
opt_level: None,
|
||||||
opt_size: None,
|
opt_size: None,
|
||||||
|
|
||||||
|
pgo_gen: None,
|
||||||
|
pgo_use: String::new(),
|
||||||
|
|
||||||
emit_no_opt_bc: false,
|
emit_no_opt_bc: false,
|
||||||
emit_bc: false,
|
emit_bc: false,
|
||||||
emit_bc_compressed: false,
|
emit_bc_compressed: false,
|
||||||
|
@ -932,6 +938,9 @@ pub fn start_async_translation(tcx: TyCtxt,
|
||||||
modules_config.passes.push("insert-gcov-profiling".to_owned())
|
modules_config.passes.push("insert-gcov-profiling".to_owned())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
modules_config.pgo_gen = sess.opts.cg.pgo_gen.clone();
|
||||||
|
modules_config.pgo_use = sess.opts.cg.pgo_use.clone();
|
||||||
|
|
||||||
modules_config.opt_level = Some(get_llvm_opt_level(sess.opts.optimize));
|
modules_config.opt_level = Some(get_llvm_opt_level(sess.opts.optimize));
|
||||||
modules_config.opt_size = Some(get_llvm_opt_size(sess.opts.optimize));
|
modules_config.opt_size = Some(get_llvm_opt_size(sess.opts.optimize));
|
||||||
|
|
||||||
|
@ -2046,6 +2055,8 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
|
||||||
config: &ModuleConfig,
|
config: &ModuleConfig,
|
||||||
opt_level: llvm::CodeGenOptLevel,
|
opt_level: llvm::CodeGenOptLevel,
|
||||||
f: &mut FnMut(llvm::PassManagerBuilderRef)) {
|
f: &mut FnMut(llvm::PassManagerBuilderRef)) {
|
||||||
|
use std::ptr;
|
||||||
|
|
||||||
// Create the PassManagerBuilder for LLVM. We configure it with
|
// Create the PassManagerBuilder for LLVM. We configure it with
|
||||||
// reasonable defaults and prepare it to actually populate the pass
|
// reasonable defaults and prepare it to actually populate the pass
|
||||||
// manager.
|
// manager.
|
||||||
|
@ -2053,11 +2064,27 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
|
||||||
let opt_size = config.opt_size.unwrap_or(llvm::CodeGenOptSizeNone);
|
let opt_size = config.opt_size.unwrap_or(llvm::CodeGenOptSizeNone);
|
||||||
let inline_threshold = config.inline_threshold;
|
let inline_threshold = config.inline_threshold;
|
||||||
|
|
||||||
llvm::LLVMRustConfigurePassManagerBuilder(builder,
|
let pgo_gen_path = config.pgo_gen.as_ref().map(|s| {
|
||||||
opt_level,
|
let s = if s.is_empty() { "default_%m.profraw" } else { s };
|
||||||
config.merge_functions,
|
CString::new(s.as_bytes()).unwrap()
|
||||||
config.vectorize_slp,
|
});
|
||||||
config.vectorize_loop);
|
|
||||||
|
let pgo_use_path = if config.pgo_use.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(CString::new(config.pgo_use.as_bytes()).unwrap())
|
||||||
|
};
|
||||||
|
|
||||||
|
llvm::LLVMRustConfigurePassManagerBuilder(
|
||||||
|
builder,
|
||||||
|
opt_level,
|
||||||
|
config.merge_functions,
|
||||||
|
config.vectorize_slp,
|
||||||
|
config.vectorize_loop,
|
||||||
|
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()),
|
||||||
|
);
|
||||||
|
|
||||||
llvm::LLVMPassManagerBuilderSetSizeLevel(builder, opt_size as u32);
|
llvm::LLVMPassManagerBuilderSetSizeLevel(builder, opt_size as u32);
|
||||||
|
|
||||||
if opt_size != llvm::CodeGenOptSizeNone {
|
if opt_size != llvm::CodeGenOptSizeNone {
|
||||||
|
|
|
@ -428,12 +428,22 @@ 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,
|
||||||
|
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 (PGOGenPath) {
|
||||||
|
assert(!PGOUsePath);
|
||||||
|
unwrap(PMBR)->EnablePGOInstrGen = true;
|
||||||
|
unwrap(PMBR)->PGOInstrGen = PGOGenPath;
|
||||||
|
}
|
||||||
|
if (PGOUsePath) {
|
||||||
|
assert(!PGOGenPath);
|
||||||
|
unwrap(PMBR)->PGOInstrUse = PGOUsePath;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unfortunately, the LLVM C API doesn't provide a way to set the `LibraryInfo`
|
// Unfortunately, the LLVM C API doesn't provide a way to set the `LibraryInfo`
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue