Skip to content

Commit 51da28a

Browse files
Add mechanism for skipping MIR passes
1 parent 5b46f91 commit 51da28a

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

compiler/rustc_interface/src/tests.rs

+1
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,7 @@ fn test_debugging_options_tracking_hash() {
558558
tracked!(link_only, true);
559559
tracked!(merge_functions, Some(MergeFunctions::Disabled));
560560
tracked!(mir_emit_retag, true);
561+
tracked!(mir_opt_skip_pass, vec!["ConstProp".to_owned()]);
561562
tracked!(mir_opt_level, 3);
562563
tracked!(mutable_noalias, true);
563564
tracked!(new_llvm_pass_manager, true);

compiler/rustc_mir/src/transform/pass.rs

+18-3
Original file line numberDiff line numberDiff line change
@@ -72,17 +72,25 @@ impl PassManager<'mir, 'tcx> {
7272
ret
7373
}
7474

75-
fn is_pass_enabled(&self, level: OptLevel) -> bool {
75+
fn is_pass_enabled<P>(&self, pass: &P) -> bool
76+
where
77+
P: MirPass<'tcx>,
78+
{
7679
let opts = &self.tcx.sess.opts.debugging_opts;
77-
let level_required = match level {
80+
let level_required = match P::LEVEL {
7881
OptLevel::Cleanup => return !self.skip_cleanup,
7982
OptLevel::Unsound if !opts.unsound_mir_opts => return false,
8083

8184
OptLevel::Unsound => UNSOUND_MIR_OPT_LEVEL,
8285
OptLevel::N(n) => n,
8386
};
8487

85-
opts.mir_opt_level >= level_required as usize
88+
// Optimization passes that are not always run can be disabled
89+
if level_required != 0 && is_skipped(&pass.name(), &opts.mir_opt_skip_pass) {
90+
return false;
91+
}
92+
93+
opts.mir_opt_level >= level_required.into()
8694
}
8795

8896
pub fn validate(&self, when: &str) {
@@ -145,3 +153,10 @@ macro_rules! run_passes {
145153
$( manager.run_pass(&$pass); )*
146154
}}
147155
}
156+
157+
fn is_skipped(pass_name: &str, skipped_passes: &[String]) -> bool {
158+
skipped_passes
159+
.into_iter()
160+
.filter(|skipped| !skipped.is_empty())
161+
.any(|skipped| pass_name.starts_with(skipped))
162+
}

compiler/rustc_session/src/options.rs

+2
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
959959
mir_emit_retag: bool = (false, parse_bool, [TRACKED],
960960
"emit Retagging MIR statements, interpreted e.g., by miri; implies -Zmir-opt-level=0 \
961961
(default: no)"),
962+
mir_opt_skip_pass: Vec<String> = (Vec::new(), parse_string_push, [TRACKED],
963+
"MIR optimization passes that will not run (default: [])"),
962964
mir_opt_level: usize = (1, parse_uint, [TRACKED],
963965
"MIR optimization level (0-3; default: 1)"),
964966
mutable_noalias: bool = (false, parse_bool, [TRACKED],

0 commit comments

Comments
 (0)