Fix validation and linting of injected MIR
Reevaluate `body.should_skip()` after updating the MIR phase to ensure that injected MIR is processed correctly. Update a few custom MIR tests that were ill-formed for the injected phase.
This commit is contained in:
parent
12b92c8a87
commit
a084e063e6
@ -109,14 +109,15 @@ fn run_passes_inner<'tcx>(
|
||||
phase_change: Option<MirPhase>,
|
||||
validate_each: bool,
|
||||
) {
|
||||
let lint = tcx.sess.opts.unstable_opts.lint_mir & !body.should_skip();
|
||||
let validate = validate_each & tcx.sess.opts.unstable_opts.validate_mir & !body.should_skip();
|
||||
let overridden_passes = &tcx.sess.opts.unstable_opts.mir_enable_passes;
|
||||
trace!(?overridden_passes);
|
||||
|
||||
let prof_arg = tcx.sess.prof.enabled().then(|| format!("{:?}", body.source.def_id()));
|
||||
|
||||
if !body.should_skip() {
|
||||
let validate = validate_each & tcx.sess.opts.unstable_opts.validate_mir;
|
||||
let lint = tcx.sess.opts.unstable_opts.lint_mir;
|
||||
|
||||
for pass in passes {
|
||||
let name = pass.name();
|
||||
|
||||
@ -162,7 +163,12 @@ fn run_passes_inner<'tcx>(
|
||||
body.pass_count = 0;
|
||||
|
||||
dump_mir_for_phase_change(tcx, body);
|
||||
if validate || new_phase == MirPhase::Runtime(RuntimePhase::Optimized) {
|
||||
|
||||
let validate =
|
||||
(validate_each & tcx.sess.opts.unstable_opts.validate_mir & !body.should_skip())
|
||||
|| new_phase == MirPhase::Runtime(RuntimePhase::Optimized);
|
||||
let lint = tcx.sess.opts.unstable_opts.lint_mir & !body.should_skip();
|
||||
if validate {
|
||||
validate_body(tcx, body, format!("after phase change to {}", new_phase.name()));
|
||||
}
|
||||
if lint {
|
||||
|
@ -8,14 +8,14 @@
|
||||
|
||||
bb0: {
|
||||
- _2 = _1;
|
||||
- _0 = opaque::<NotCopy>(move _1) -> [return: bb1, unwind continue];
|
||||
+ _0 = opaque::<NotCopy>(_1) -> [return: bb1, unwind continue];
|
||||
- _0 = opaque::<NotCopy>(move _1) -> [return: bb1, unwind unreachable];
|
||||
+ _0 = opaque::<NotCopy>(_1) -> [return: bb1, unwind unreachable];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
- _3 = move _2;
|
||||
- _0 = opaque::<NotCopy>(_3) -> [return: bb2, unwind continue];
|
||||
+ _0 = opaque::<NotCopy>(_1) -> [return: bb2, unwind continue];
|
||||
- _0 = opaque::<NotCopy>(_3) -> [return: bb2, unwind unreachable];
|
||||
+ _0 = opaque::<NotCopy>(_1) -> [return: bb2, unwind unreachable];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
|
@ -10,15 +10,15 @@ use core::intrinsics::mir::*;
|
||||
struct NotCopy(bool);
|
||||
|
||||
// EMIT_MIR custom_move_arg.f.CopyProp.diff
|
||||
#[custom_mir(dialect = "analysis", phase = "post-cleanup")]
|
||||
#[custom_mir(dialect = "runtime")]
|
||||
fn f(_1: NotCopy) {
|
||||
mir!({
|
||||
let _2 = _1;
|
||||
Call(RET = opaque(Move(_1)), ReturnTo(bb1), UnwindContinue())
|
||||
Call(RET = opaque(Move(_1)), ReturnTo(bb1), UnwindUnreachable())
|
||||
}
|
||||
bb1 = {
|
||||
let _3 = Move(_2);
|
||||
Call(RET = opaque(_3), ReturnTo(bb2), UnwindContinue())
|
||||
Call(RET = opaque(_3), ReturnTo(bb2), UnwindUnreachable())
|
||||
}
|
||||
bb2 = {
|
||||
Return()
|
||||
|
@ -9,13 +9,13 @@
|
||||
bb0: {
|
||||
- _2 = _1;
|
||||
- _3 = move (_2.0: u8);
|
||||
- _0 = opaque::<Foo>(move _1) -> [return: bb1, unwind continue];
|
||||
- _0 = opaque::<Foo>(move _1) -> [return: bb1, unwind unreachable];
|
||||
+ _3 = (_1.0: u8);
|
||||
+ _0 = opaque::<Foo>(_1) -> [return: bb1, unwind continue];
|
||||
+ _0 = opaque::<Foo>(_1) -> [return: bb1, unwind unreachable];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_0 = opaque::<u8>(move _3) -> [return: bb2, unwind continue];
|
||||
_0 = opaque::<u8>(move _3) -> [return: bb2, unwind unreachable];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
|
@ -11,17 +11,17 @@ fn opaque(_: impl Sized) -> bool { true }
|
||||
|
||||
struct Foo(u8);
|
||||
|
||||
#[custom_mir(dialect = "analysis", phase = "post-cleanup")]
|
||||
#[custom_mir(dialect = "runtime")]
|
||||
fn f(a: Foo) -> bool {
|
||||
mir!(
|
||||
{
|
||||
let b = a;
|
||||
// This is a move out of a copy, so must become a copy of `a.0`.
|
||||
let c = Move(b.0);
|
||||
Call(RET = opaque(Move(a)), ReturnTo(bb1), UnwindContinue())
|
||||
Call(RET = opaque(Move(a)), ReturnTo(bb1), UnwindUnreachable())
|
||||
}
|
||||
bb1 = {
|
||||
Call(RET = opaque(Move(c)), ReturnTo(ret), UnwindContinue())
|
||||
Call(RET = opaque(Move(c)), ReturnTo(ret), UnwindUnreachable())
|
||||
}
|
||||
ret = {
|
||||
Return()
|
||||
|
Loading…
x
Reference in New Issue
Block a user