]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_trans/back/write.rs
Auto merge of #29943 - brson:inline-threshold, r=nrc
[rust.git] / src / librustc_trans / back / write.rs
index 1a4007026fba1a8d983eff8201f8d2aeb8ae56a3..5ac27d612279b7af835bcde5a484fbfeb7da301e 100644 (file)
@@ -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 { }
@@ -288,6 +289,7 @@ fn new(tm: TargetMachineRef, passes: Vec<String>) -> ModuleConfig {
             vectorize_loop: false,
             vectorize_slp: false,
             merge_functions: false,
+            inline_threshold: None
         }
     }
 
@@ -296,6 +298,7 @@ fn set_flags(&mut self, sess: &Session, trans: &CrateTranslation) {
         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
@@ -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,
@@ -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);
         }
     }