1
Fork 0

Add -C inline-threshold

Corresponds directly to llvm's inline-threshold
This commit is contained in:
Brian Anderson 2015-11-19 16:07:09 -08:00
parent 6861c51453
commit 5c88a1cd54
2 changed files with 14 additions and 5 deletions

View file

@ -513,6 +513,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
"optimize with possible levels 0-3"), "optimize with possible levels 0-3"),
debug_assertions: Option<bool> = (None, parse_opt_bool, debug_assertions: Option<bool> = (None, parse_opt_bool,
"explicitly enable the cfg(debug_assertions) directive"), "explicitly enable the cfg(debug_assertions) directive"),
inline_threshold: Option<usize> = (None, parse_opt_uint,
"set the inlining threshold for"),
} }

View file

@ -264,6 +264,7 @@ pub struct ModuleConfig {
vectorize_loop: bool, vectorize_loop: bool,
vectorize_slp: bool, vectorize_slp: bool,
merge_functions: bool, merge_functions: bool,
inline_threshold: Option<usize>
} }
unsafe impl Send for ModuleConfig { } unsafe impl Send for ModuleConfig { }
@ -289,6 +290,7 @@ impl ModuleConfig {
vectorize_loop: false, vectorize_loop: false,
vectorize_slp: false, vectorize_slp: false,
merge_functions: 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_prepopulate_passes = sess.opts.cg.no_prepopulate_passes;
self.no_builtins = trans.no_builtins; self.no_builtins = trans.no_builtins;
self.time_passes = sess.time_passes(); 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 // Copy what clang does by turning on loop vectorization at O2 and
// slp vectorization at O3. Otherwise configure other optimization aspects // slp vectorization at O3. Otherwise configure other optimization aspects
@ -1005,6 +1008,7 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
// manager. // manager.
let builder = llvm::LLVMPassManagerBuilderCreate(); let builder = llvm::LLVMPassManagerBuilderCreate();
let opt = config.opt_level.unwrap_or(llvm::CodeGenLevelNone); let opt = config.opt_level.unwrap_or(llvm::CodeGenLevelNone);
let inline_threshold = config.inline_threshold;
llvm::LLVMRustConfigurePassManagerBuilder(builder, opt, llvm::LLVMRustConfigurePassManagerBuilder(builder, opt,
config.merge_functions, 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 // always-inline functions (but don't add lifetime intrinsics), at O1 we
// inline with lifetime intrinsics, and O2+ we add an inliner with a // inline with lifetime intrinsics, and O2+ we add an inliner with a
// thresholds copied from clang. // thresholds copied from clang.
match opt { match (opt, inline_threshold) {
llvm::CodeGenLevelNone => { (_, Some(t)) => {
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, t as u32);
}
(llvm::CodeGenLevelNone, _) => {
llvm::LLVMRustAddAlwaysInlinePass(builder, false); llvm::LLVMRustAddAlwaysInlinePass(builder, false);
} }
llvm::CodeGenLevelLess => { (llvm::CodeGenLevelLess, _) => {
llvm::LLVMRustAddAlwaysInlinePass(builder, true); llvm::LLVMRustAddAlwaysInlinePass(builder, true);
} }
llvm::CodeGenLevelDefault => { (llvm::CodeGenLevelDefault, _) => {
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 225); llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 225);
} }
llvm::CodeGenLevelAggressive => { (llvm::CodeGenLevelAggressive, _) => {
llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 275); llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(builder, 275);
} }
} }