From 8ea2dd0066b21951651400939c32426a4f1a0cd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20S=C3=A1nchez=20Mu=C3=B1oz?= Date: Mon, 5 Dec 2022 00:51:33 +0100 Subject: [PATCH] Enable MIR inlinig for `#[inline(always)]` when mir-opt-level=1 --- compiler/rustc_mir_transform/src/inline.rs | 28 ++++++++++++------- .../inlining-from-extern-crate.rs | 2 ++ .../partitioning/local-inlining.rs | 2 ++ .../partitioning/local-transitive-inlining.rs | 2 ++ .../incremental/hashes/function_interfaces.rs | 2 ++ 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_mir_transform/src/inline.rs b/compiler/rustc_mir_transform/src/inline.rs index bf670c5c26a77..cc6c6a23906b4 100644 --- a/compiler/rustc_mir_transform/src/inline.rs +++ b/compiler/rustc_mir_transform/src/inline.rs @@ -45,15 +45,7 @@ impl<'tcx> MirPass<'tcx> for Inline { return enabled; } - match sess.mir_opt_level() { - 0 | 1 => false, - 2 => { - (sess.opts.optimize == OptLevel::Default - || sess.opts.optimize == OptLevel::Aggressive) - && sess.opts.incremental == None - } - _ => true, - } + sess.mir_opt_level() > 0 } fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { @@ -341,7 +333,23 @@ impl<'tcx> Inliner<'tcx> { ) -> Result<(), &'static str> { match callee_attrs.inline { InlineAttr::Never => return Err("never inline hint"), - InlineAttr::Always | InlineAttr::Hint => {} + InlineAttr::Always => {} + InlineAttr::Hint => match self.tcx.sess.mir_opt_level() { + 0 | 1 => return Err("at mir-opt-level=1, only #[inline(always)] is inlined"), + 2 if self.tcx.sess.opts.optimize != OptLevel::Default + && self.tcx.sess.opts.optimize != OptLevel::Aggressive => + { + return Err( + "at mir-opt-level=2, only #[inline(always)] is inlined when opt-level<2", + ); + } + 2 if self.tcx.sess.opts.incremental != None => { + return Err( + "at mir-opt-level=2, only #[inline(always)] is inlined when incremental compilation is enabled", + ); + } + _ => {} + }, InlineAttr::None => { if self.tcx.sess.mir_opt_level() <= 2 { return Err("at mir-opt-level=2, only #[inline] is inlined"); diff --git a/src/test/codegen-units/partitioning/inlining-from-extern-crate.rs b/src/test/codegen-units/partitioning/inlining-from-extern-crate.rs index 1cc21632e4818..0eaa60979952e 100644 --- a/src/test/codegen-units/partitioning/inlining-from-extern-crate.rs +++ b/src/test/codegen-units/partitioning/inlining-from-extern-crate.rs @@ -4,6 +4,8 @@ // incremental // compile-flags:-Zprint-mono-items=lazy // compile-flags:-Zinline-in-all-cgus +// To keep mir from doing any inlining +// compile-flags:-Zmir-opt-level=0 #![crate_type="lib"] diff --git a/src/test/codegen-units/partitioning/local-inlining.rs b/src/test/codegen-units/partitioning/local-inlining.rs index 841a428e9dd2f..b2ef9be25e1f2 100644 --- a/src/test/codegen-units/partitioning/local-inlining.rs +++ b/src/test/codegen-units/partitioning/local-inlining.rs @@ -4,6 +4,8 @@ // incremental // compile-flags:-Zprint-mono-items=lazy // compile-flags:-Zinline-in-all-cgus +// To keep mir from doing any inlining +// compile-flags:-Zmir-opt-level=0 #![allow(dead_code)] #![crate_type="lib"] diff --git a/src/test/codegen-units/partitioning/local-transitive-inlining.rs b/src/test/codegen-units/partitioning/local-transitive-inlining.rs index 03c37954d1513..9ef48028af6b8 100644 --- a/src/test/codegen-units/partitioning/local-transitive-inlining.rs +++ b/src/test/codegen-units/partitioning/local-transitive-inlining.rs @@ -4,6 +4,8 @@ // incremental // compile-flags:-Zprint-mono-items=lazy // compile-flags:-Zinline-in-all-cgus +// To keep mir from doing any inlining +// compile-flags:-Zmir-opt-level=0 #![allow(dead_code)] #![crate_type="rlib"] diff --git a/src/test/incremental/hashes/function_interfaces.rs b/src/test/incremental/hashes/function_interfaces.rs index 3ff949fbb3f80..1e08fdb93b3e9 100644 --- a/src/test/incremental/hashes/function_interfaces.rs +++ b/src/test/incremental/hashes/function_interfaces.rs @@ -8,6 +8,8 @@ // build-pass (FIXME(62277): could be check-pass?) // revisions: cfail1 cfail2 cfail3 cfail4 cfail5 cfail6 // compile-flags: -Z query-dep-graph -O +// To keep mir from doing any inlining +// compile-flags: -Z mir-opt-level=0 // [cfail1]compile-flags: -Zincremental-ignore-spans // [cfail2]compile-flags: -Zincremental-ignore-spans // [cfail3]compile-flags: -Zincremental-ignore-spans