"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"),
}
vectorize_loop: bool,
vectorize_slp: bool,
merge_functions: bool,
+ inline_threshold: Option<usize>
}
unsafe impl Send for ModuleConfig { }
vectorize_loop: false,
vectorize_slp: false,
merge_functions: false,
+ inline_threshold: None
}
}
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
// 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,
// 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);
}
}