Add -C inline-threshold
Corresponds directly to llvm's inline-threshold
This commit is contained in:
parent
6861c51453
commit
5c88a1cd54
@ -513,6 +513,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
|
||||
"optimize with possible levels 0-3"),
|
||||
debug_assertions: Option<bool> = (None, parse_opt_bool,
|
||||
"explicitly enable the cfg(debug_assertions) directive"),
|
||||
inline_threshold: Option<usize> = (None, parse_opt_uint,
|
||||
"set the inlining threshold for"),
|
||||
}
|
||||
|
||||
|
||||
|
@ -264,6 +264,7 @@ pub struct ModuleConfig {
|
||||
vectorize_loop: bool,
|
||||
vectorize_slp: bool,
|
||||
merge_functions: bool,
|
||||
inline_threshold: Option<usize>
|
||||
}
|
||||
|
||||
unsafe impl Send for ModuleConfig { }
|
||||
@ -289,6 +290,7 @@ impl ModuleConfig {
|
||||
vectorize_loop: false,
|
||||
vectorize_slp: false,
|
||||
merge_functions: false,
|
||||
inline_threshold: None
|
||||
}
|
||||
}
|
||||
|
||||
@ -297,6 +299,7 @@ impl ModuleConfig {
|
||||
self.no_prepopulate_passes = sess.opts.cg.no_prepopulate_passes;
|
||||
self.no_builtins = trans.no_builtins;
|
||||
self.time_passes = sess.time_passes();
|
||||
self.inline_threshold = sess.opts.cg.inline_threshold;
|
||||
|
||||
// Copy what clang does by turning on loop vectorization at O2 and
|
||||
// slp vectorization at O3. Otherwise configure other optimization aspects
|
||||
@ -1005,6 +1008,7 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
|
||||
// manager.
|
||||
let builder = llvm::LLVMPassManagerBuilderCreate();
|
||||
let opt = config.opt_level.unwrap_or(llvm::CodeGenLevelNone);
|
||||
let inline_threshold = config.inline_threshold;
|
||||
|
||||
llvm::LLVMRustConfigurePassManagerBuilder(builder, opt,
|
||||
config.merge_functions,
|
||||
@ -1017,17 +1021,20 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
|
||||
// always-inline functions (but don't add lifetime intrinsics), at O1 we
|
||||
// inline with lifetime intrinsics, and O2+ we add an inliner with a
|
||||
// thresholds copied from clang.
|
||||
match opt {
|
||||
llvm::CodeGenLevelNone => {
|
||||
match (opt, inline_threshold) {
|
||||
(_, Some(t)) => {
|
||||
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, t as u32);
|
||||
}
|
||||
(llvm::CodeGenLevelNone, _) => {
|
||||
llvm::LLVMRustAddAlwaysInlinePass(builder, false);
|
||||
}
|
||||
llvm::CodeGenLevelLess => {
|
||||
(llvm::CodeGenLevelLess, _) => {
|
||||
llvm::LLVMRustAddAlwaysInlinePass(builder, true);
|
||||
}
|
||||
llvm::CodeGenLevelDefault => {
|
||||
(llvm::CodeGenLevelDefault, _) => {
|
||||
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 225);
|
||||
}
|
||||
llvm::CodeGenLevelAggressive => {
|
||||
(llvm::CodeGenLevelAggressive, _) => {
|
||||
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 275);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user