Add flags customizing behaviour of MIR inlining
* `-Zinline-mir-threshold` to change the default threshold. * `-Zinline-mir-hint-threshold` to change the threshold used by functions with inline hint.
This commit is contained in:
parent
cf9cf7c923
commit
c8943c62f7
5 changed files with 86 additions and 4 deletions
|
@ -554,6 +554,8 @@ fn test_debugging_options_tracking_hash() {
|
|||
tracked!(function_sections, Some(false));
|
||||
tracked!(human_readable_cgu_names, true);
|
||||
tracked!(inline_in_all_cgus, Some(true));
|
||||
tracked!(inline_mir_threshold, 123);
|
||||
tracked!(inline_mir_hint_threshold, 123);
|
||||
tracked!(insert_sideeffect, true);
|
||||
tracked!(instrument_coverage, true);
|
||||
tracked!(instrument_mcount, true);
|
||||
|
|
|
@ -16,9 +16,6 @@ use crate::transform::MirPass;
|
|||
use std::iter;
|
||||
use std::ops::{Range, RangeFrom};
|
||||
|
||||
const DEFAULT_THRESHOLD: usize = 50;
|
||||
const HINT_THRESHOLD: usize = 100;
|
||||
|
||||
const INSTR_COST: usize = 5;
|
||||
const CALL_PENALTY: usize = 25;
|
||||
const LANDINGPAD_PENALTY: usize = 50;
|
||||
|
@ -248,7 +245,11 @@ impl Inliner<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
let mut threshold = if hinted { HINT_THRESHOLD } else { DEFAULT_THRESHOLD };
|
||||
let mut threshold = if hinted {
|
||||
self.tcx.sess.opts.debugging_opts.inline_mir_hint_threshold
|
||||
} else {
|
||||
self.tcx.sess.opts.debugging_opts.inline_mir_threshold
|
||||
};
|
||||
|
||||
// Significantly lower the threshold for inlining cold functions
|
||||
if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::COLD) {
|
||||
|
|
|
@ -929,6 +929,10 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
|
|||
(default: no)"),
|
||||
incremental_verify_ich: bool = (false, parse_bool, [UNTRACKED],
|
||||
"verify incr. comp. hashes of green query instances (default: no)"),
|
||||
inline_mir_threshold: usize = (50, parse_uint, [TRACKED],
|
||||
"a default MIR inlining threshold (default: 50)"),
|
||||
inline_mir_hint_threshold: usize = (100, parse_uint, [TRACKED],
|
||||
"inlining threshold for functions with inline hint (default: 100)"),
|
||||
inline_in_all_cgus: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||
"control whether `#[inline]` functions are in all CGUs"),
|
||||
input_stats: bool = (false, parse_bool, [UNTRACKED],
|
||||
|
|
19
src/test/mir-opt/inline/inline-options.rs
Normal file
19
src/test/mir-opt/inline/inline-options.rs
Normal file
|
@ -0,0 +1,19 @@
|
|||
// Checks that inlining threshold can be controlled with
|
||||
// inline-mir-threshold and inline-hint-threshold options.
|
||||
//
|
||||
// compile-flags: -Zinline-mir-threshold=90
|
||||
// compile-flags: -Zinline-mir-hint-threshold=50
|
||||
|
||||
// EMIT_MIR inline_options.main.Inline.after.mir
|
||||
fn main() {
|
||||
not_inlined();
|
||||
inlined::<u32>();
|
||||
}
|
||||
|
||||
// Cost is approximately 3 * 25 + 5 = 80.
|
||||
#[inline]
|
||||
pub fn not_inlined() { g(); g(); g(); }
|
||||
pub fn inlined<T>() { g(); g(); g(); }
|
||||
|
||||
#[inline(never)]
|
||||
fn g() {}
|
56
src/test/mir-opt/inline/inline_options.main.Inline.after.mir
Normal file
56
src/test/mir-opt/inline/inline_options.main.Inline.after.mir
Normal file
|
@ -0,0 +1,56 @@
|
|||
// MIR for `main` after Inline
|
||||
|
||||
fn main() -> () {
|
||||
let mut _0: (); // return place in scope 0 at $DIR/inline-options.rs:8:11: 8:11
|
||||
let _1: (); // in scope 0 at $DIR/inline-options.rs:9:5: 9:18
|
||||
let _2: (); // in scope 0 at $DIR/inline-options.rs:10:5: 10:21
|
||||
scope 1 (inlined inlined::<u32>) { // at $DIR/inline-options.rs:10:5: 10:21
|
||||
let _3: (); // in scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
let _4: (); // in scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
let _5: (); // in scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
}
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1); // scope 0 at $DIR/inline-options.rs:9:5: 9:18
|
||||
_1 = not_inlined() -> bb1; // scope 0 at $DIR/inline-options.rs:9:5: 9:18
|
||||
// mir::Constant
|
||||
// + span: $DIR/inline-options.rs:9:5: 9:16
|
||||
// + literal: Const { ty: fn() {not_inlined}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_1); // scope 0 at $DIR/inline-options.rs:9:18: 9:19
|
||||
StorageLive(_2); // scope 0 at $DIR/inline-options.rs:10:5: 10:21
|
||||
StorageLive(_3); // scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
_3 = g() -> bb2; // scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
// mir::Constant
|
||||
// + span: $DIR/inline-options.rs:10:5: 10:21
|
||||
// + literal: Const { ty: fn() {g}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb2: {
|
||||
StorageDead(_3); // scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
StorageLive(_4); // scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
_4 = g() -> bb3; // scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
// mir::Constant
|
||||
// + span: $DIR/inline-options.rs:10:5: 10:21
|
||||
// + literal: Const { ty: fn() {g}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb3: {
|
||||
StorageDead(_4); // scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
StorageLive(_5); // scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
_5 = g() -> bb4; // scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
// mir::Constant
|
||||
// + span: $DIR/inline-options.rs:10:5: 10:21
|
||||
// + literal: Const { ty: fn() {g}, val: Value(Scalar(<ZST>)) }
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageDead(_5); // scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
_2 = const (); // scope 1 at $DIR/inline-options.rs:10:5: 10:21
|
||||
StorageDead(_2); // scope 0 at $DIR/inline-options.rs:10:21: 10:22
|
||||
_0 = const (); // scope 0 at $DIR/inline-options.rs:8:11: 11:2
|
||||
return; // scope 0 at $DIR/inline-options.rs:11:2: 11:2
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue