Skip to content

Commit

Permalink
Auto merge of #29943 - brson:inline-threshold, r=nrc
Browse files Browse the repository at this point in the history
Corresponds directly to llvm's inline-threshold.

I want this so I can experiment out-of-tree with tweaking optimization settings, and this is the most important value that isn't exposed. I can't get it to work either via `-C llvm-args`.

cc @rust-lang/compiler
  • Loading branch information
bors committed Nov 20, 2015
2 parents e5c69b1 + 5c88a1c commit 2228bac
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/librustc/session/config.rs
Expand Up @@ -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"),
}


Expand Down
17 changes: 12 additions & 5 deletions src/librustc_trans/back/write.rs
Expand Up @@ -263,6 +263,7 @@ pub struct ModuleConfig {
vectorize_loop: bool,
vectorize_slp: bool,
merge_functions: bool,
inline_threshold: Option<usize>
}

unsafe impl Send for ModuleConfig { }
Expand All @@ -288,6 +289,7 @@ impl ModuleConfig {
vectorize_loop: false,
vectorize_slp: false,
merge_functions: false,
inline_threshold: None
}
}

Expand All @@ -296,6 +298,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
Expand Down Expand Up @@ -1004,6 +1007,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,
Expand All @@ -1016,17 +1020,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);
}
}
Expand Down

0 comments on commit 2228bac

Please sign in to comment.