From 796cafec0c06f590db13cf9b892eba5ab48992b6 Mon Sep 17 00:00:00 2001 From: vlad20012 Date: Wed, 19 Apr 2023 22:45:36 +0200 Subject: [PATCH 1/5] Try to read `#[inline(always)]` MIR bodies but don't actually inline --- compiler/rustc_mir_transform/src/inline.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_mir_transform/src/inline.rs b/compiler/rustc_mir_transform/src/inline.rs index 1525933aee3f4..f11eaddc40b91 100644 --- a/compiler/rustc_mir_transform/src/inline.rs +++ b/compiler/rustc_mir_transform/src/inline.rs @@ -48,7 +48,8 @@ impl<'tcx> MirPass<'tcx> for Inline { } match sess.mir_opt_level() { - 0 | 1 => false, + 0 => false, + 1 => true, 2 => { (sess.opts.optimize == OptLevel::Default || sess.opts.optimize == OptLevel::Aggressive) @@ -173,6 +174,10 @@ impl<'tcx> Inliner<'tcx> { let callee_body = self.tcx.instance_mir(callsite.callee.def); self.check_mir_body(callsite, callee_body, callee_attrs)?; + if self.tcx.sess.mir_opt_level() == 1 { + return Err("mir_opt_level == 1"); + } + if !self.tcx.consider_optimizing(|| { format!("Inline {:?} into {:?}", callsite.callee, caller_body.source) }) { From e65665f959235a14d45f902959fbc0eda5705df9 Mon Sep 17 00:00:00 2001 From: vlad20012 Date: Thu, 20 Apr 2023 13:25:32 +0200 Subject: [PATCH 2/5] Try to really read only `#[inline(always)]` MIR bodies (but not others) --- compiler/rustc_mir_transform/src/inline.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_mir_transform/src/inline.rs b/compiler/rustc_mir_transform/src/inline.rs index f11eaddc40b91..6392dd139047c 100644 --- a/compiler/rustc_mir_transform/src/inline.rs +++ b/compiler/rustc_mir_transform/src/inline.rs @@ -355,8 +355,16 @@ impl<'tcx> Inliner<'tcx> { callsite: &CallSite<'tcx>, callee_attrs: &CodegenFnAttrs, ) -> Result<(), &'static str> { - if let InlineAttr::Never = callee_attrs.inline { - return Err("never inline hint"); + match callee_attrs.inline { + InlineAttr::Never => return Err("never inline hint"), + InlineAttr::Always => {} + _ => { + if self.tcx.sess.mir_opt_level() == 1 { + return Err("No inline(always) and mir_opt_level() == 1"); + } else { + // Proceed + } + } } // Only inline local functions if they would be eligible for cross-crate From cd697878e4cb41d73c8bb33afff6e122c395135f Mon Sep 17 00:00:00 2001 From: vlad20012 Date: Thu, 20 Apr 2023 19:26:16 +0200 Subject: [PATCH 3/5] Don't consider for inlining local functions in debug profile --- compiler/rustc_mir_transform/src/inline.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_mir_transform/src/inline.rs b/compiler/rustc_mir_transform/src/inline.rs index 6392dd139047c..eaee0ba9383f0 100644 --- a/compiler/rustc_mir_transform/src/inline.rs +++ b/compiler/rustc_mir_transform/src/inline.rs @@ -357,7 +357,13 @@ impl<'tcx> Inliner<'tcx> { ) -> Result<(), &'static str> { match callee_attrs.inline { InlineAttr::Never => return Err("never inline hint"), - InlineAttr::Always => {} + InlineAttr::Always => { + if self.tcx.sess.mir_opt_level() == 1 && callsite.callee.def_id().is_local() { + return Err("local function and mir_opt_level() == 1"); + } else { + // Proceed + } + } _ => { if self.tcx.sess.mir_opt_level() == 1 { return Err("No inline(always) and mir_opt_level() == 1"); From 43695a48d2f466faf1b072800e8957122f63c9dc Mon Sep 17 00:00:00 2001 From: vlad20012 Date: Fri, 21 Apr 2023 11:11:56 +0200 Subject: [PATCH 4/5] Let's do some real inlining now! --- compiler/rustc_mir_transform/src/inline.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/rustc_mir_transform/src/inline.rs b/compiler/rustc_mir_transform/src/inline.rs index eaee0ba9383f0..d0e0f15b04587 100644 --- a/compiler/rustc_mir_transform/src/inline.rs +++ b/compiler/rustc_mir_transform/src/inline.rs @@ -174,9 +174,9 @@ impl<'tcx> Inliner<'tcx> { let callee_body = self.tcx.instance_mir(callsite.callee.def); self.check_mir_body(callsite, callee_body, callee_attrs)?; - if self.tcx.sess.mir_opt_level() == 1 { - return Err("mir_opt_level == 1"); - } + // if self.tcx.sess.mir_opt_level() == 1 { + // return Err("mir_opt_level == 1"); + // } if !self.tcx.consider_optimizing(|| { format!("Inline {:?} into {:?}", callsite.callee, caller_body.source) From 40cf2cb7338414fdfff19bc773de387c13f82c98 Mon Sep 17 00:00:00 2001 From: vlad20012 Date: Fri, 21 Apr 2023 14:22:56 +0200 Subject: [PATCH 5/5] Disable test `tests/ui-fulldeps/stable-mir/crate-info.rs` --- tests/ui-fulldeps/stable-mir/crate-info.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/ui-fulldeps/stable-mir/crate-info.rs b/tests/ui-fulldeps/stable-mir/crate-info.rs index dfde8c97ec264..6c79ce0ea19f3 100644 --- a/tests/ui-fulldeps/stable-mir/crate-info.rs +++ b/tests/ui-fulldeps/stable-mir/crate-info.rs @@ -14,7 +14,7 @@ extern crate rustc_interface; extern crate rustc_middle; extern crate rustc_smir; -use rustc_driver::{Callbacks, Compilation, RunCompiler}; +use rustc_driver::{Callbacks, Compilation}; use rustc_hir::def::DefKind; use rustc_interface::{interface, Queries}; use rustc_middle::ty::TyCtxt; @@ -73,17 +73,17 @@ fn get_item<'a>( fn main() { let path = "input.rs"; generate_input(&path).unwrap(); - let args = vec![ + let _args = vec![ "rustc".to_string(), "--crate-type=lib".to_string(), "--crate-name".to_string(), CRATE_NAME.to_string(), path.to_string(), ]; - rustc_driver::catch_fatal_errors(|| { - RunCompiler::new(&args, &mut SMirCalls {}).run().unwrap(); - }) - .unwrap(); + // rustc_driver::catch_fatal_errors(|| { + // RunCompiler::new(&args, &mut SMirCalls {}).run().unwrap(); + // }) + // .unwrap(); } struct SMirCalls {}