From 6261869ae4883004bb40eb1e0d71bf723c8fff13 Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Mon, 3 Feb 2020 07:52:00 -0500 Subject: [PATCH 1/2] [experiment] Try using a very simple heuristic for the inliner r? @ghost --- src/librustc_mir/transform/inline.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs index 56b6fa68e1841..aca1840d889b1 100644 --- a/src/librustc_mir/transform/inline.rs +++ b/src/librustc_mir/transform/inline.rs @@ -39,15 +39,19 @@ struct CallSite<'tcx> { impl<'tcx> MirPass<'tcx> for Inline { fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) { - if tcx.sess.opts.debugging_opts.mir_opt_level >= 2 { - Inliner { tcx, source }.run_pass(body); + let mir_opt_level = tcx.sess.opts.debugging_opts.mir_opt_level; + if mir_opt_level == 0 { + return; } + + Inliner { tcx, source, use_simple_heuristic: mir_opt_level == 1 }.run_pass(body); } } struct Inliner<'tcx> { tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, + use_simple_heuristic: bool, } impl Inliner<'tcx> { @@ -251,6 +255,10 @@ impl Inliner<'tcx> { } } + if self.use_simple_heuristic { + return callee_body.basic_blocks().len() == 1 && callee_body.basic_blocks()[BasicBlock::from_u32(0)].statements.len() < 10; + } + let mut threshold = if hinted { HINT_THRESHOLD } else { DEFAULT_THRESHOLD }; // Significantly lower the threshold for inlining cold functions From cf0876f7b2d1059803723aee74ca6e4f213a599c Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Mon, 3 Feb 2020 22:26:15 -0500 Subject: [PATCH 2/2] tweak suggested by eddyb --- src/librustc_mir/transform/inline.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs index aca1840d889b1..14bbf123a2cb0 100644 --- a/src/librustc_mir/transform/inline.rs +++ b/src/librustc_mir/transform/inline.rs @@ -256,7 +256,16 @@ impl Inliner<'tcx> { } if self.use_simple_heuristic { - return callee_body.basic_blocks().len() == 1 && callee_body.basic_blocks()[BasicBlock::from_u32(0)].statements.len() < 10; + use rustc::mir::StatementKind::*; + + return callee_body.basic_blocks().len() == 1 + && callee_body.basic_blocks()[BasicBlock::from_u32(0)] + .statements + .iter() + .filter(|stmt| !matches!(stmt.kind, StorageLive(_) | StorageDead(_))) + .take(5) + .count() + <= 4; } let mut threshold = if hinted { HINT_THRESHOLD } else { DEFAULT_THRESHOLD };