Rollup merge of #144875 - scottmcm:more-mir-tests, r=cjgillot
Add some pre-codegen MIR tests for debug mode No functional changes; just some tests. I made these for rust-lang/rust#144483, but that's going in a different direction, so I wanted to propose we just add them to help see the impact of other related changes in the future. r? mir
This commit is contained in:
commit
fe644eb01c
10 changed files with 403 additions and 0 deletions
18
tests/mir-opt/pre-codegen/derived_ord_debug.rs
Normal file
18
tests/mir-opt/pre-codegen/derived_ord_debug.rs
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
//@ compile-flags: -Copt-level=0 -Zmir-opt-level=1 -Cdebuginfo=limited
|
||||
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
#[derive(PartialOrd, Ord, PartialEq, Eq)]
|
||||
pub struct MultiField(char, i16);
|
||||
|
||||
// EMIT_MIR derived_ord_debug.{impl#0}-partial_cmp.PreCodegen.after.mir
|
||||
// EMIT_MIR derived_ord_debug.{impl#1}-cmp.PreCodegen.after.mir
|
||||
|
||||
// CHECK-LABEL: partial_cmp(_1: &MultiField, _2: &MultiField) -> Option<std::cmp::Ordering>
|
||||
// CHECK: = <char as PartialOrd>::partial_cmp(
|
||||
// CHECK: = <i16 as PartialOrd>::partial_cmp(
|
||||
|
||||
// CHECK-LABEL: cmp(_1: &MultiField, _2: &MultiField) -> std::cmp::Ordering
|
||||
// CHECK: = <char as Ord>::cmp(
|
||||
// CHECK: = <i16 as Ord>::cmp(
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
// MIR for `<impl at $DIR/derived_ord_debug.rs:6:10: 6:20>::partial_cmp` after PreCodegen
|
||||
|
||||
fn <impl at $DIR/derived_ord_debug.rs:6:10: 6:20>::partial_cmp(_1: &MultiField, _2: &MultiField) -> Option<std::cmp::Ordering> {
|
||||
debug self => _1;
|
||||
debug other => _2;
|
||||
let mut _0: std::option::Option<std::cmp::Ordering>;
|
||||
let _3: &char;
|
||||
let _4: &char;
|
||||
let mut _5: std::option::Option<std::cmp::Ordering>;
|
||||
let mut _6: isize;
|
||||
let mut _7: i8;
|
||||
let _8: &i16;
|
||||
let _9: &i16;
|
||||
scope 1 {
|
||||
debug cmp => _5;
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_3 = &((*_1).0: char);
|
||||
_4 = &((*_2).0: char);
|
||||
_5 = <char as PartialOrd>::partial_cmp(copy _3, copy _4) -> [return: bb1, unwind unreachable];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_6 = discriminant(_5);
|
||||
switchInt(move _6) -> [1: bb2, 0: bb4, otherwise: bb6];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
_7 = discriminant(((_5 as Some).0: std::cmp::Ordering));
|
||||
switchInt(move _7) -> [0: bb3, otherwise: bb4];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
_8 = &((*_1).1: i16);
|
||||
_9 = &((*_2).1: i16);
|
||||
_0 = <i16 as PartialOrd>::partial_cmp(copy _8, copy _9) -> [return: bb5, unwind unreachable];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
_0 = copy _5;
|
||||
goto -> bb5;
|
||||
}
|
||||
|
||||
bb5: {
|
||||
return;
|
||||
}
|
||||
|
||||
bb6: {
|
||||
unreachable;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
// MIR for `<impl at $DIR/derived_ord_debug.rs:6:10: 6:20>::partial_cmp` after PreCodegen
|
||||
|
||||
fn <impl at $DIR/derived_ord_debug.rs:6:10: 6:20>::partial_cmp(_1: &MultiField, _2: &MultiField) -> Option<std::cmp::Ordering> {
|
||||
debug self => _1;
|
||||
debug other => _2;
|
||||
let mut _0: std::option::Option<std::cmp::Ordering>;
|
||||
let _3: &char;
|
||||
let _4: &char;
|
||||
let mut _5: std::option::Option<std::cmp::Ordering>;
|
||||
let mut _6: isize;
|
||||
let mut _7: i8;
|
||||
let _8: &i16;
|
||||
let _9: &i16;
|
||||
scope 1 {
|
||||
debug cmp => _5;
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_3 = &((*_1).0: char);
|
||||
_4 = &((*_2).0: char);
|
||||
_5 = <char as PartialOrd>::partial_cmp(copy _3, copy _4) -> [return: bb1, unwind continue];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_6 = discriminant(_5);
|
||||
switchInt(move _6) -> [1: bb2, 0: bb4, otherwise: bb6];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
_7 = discriminant(((_5 as Some).0: std::cmp::Ordering));
|
||||
switchInt(move _7) -> [0: bb3, otherwise: bb4];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
_8 = &((*_1).1: i16);
|
||||
_9 = &((*_2).1: i16);
|
||||
_0 = <i16 as PartialOrd>::partial_cmp(copy _8, copy _9) -> [return: bb5, unwind continue];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
_0 = copy _5;
|
||||
goto -> bb5;
|
||||
}
|
||||
|
||||
bb5: {
|
||||
return;
|
||||
}
|
||||
|
||||
bb6: {
|
||||
unreachable;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
// MIR for `<impl at $DIR/derived_ord_debug.rs:6:22: 6:25>::cmp` after PreCodegen
|
||||
|
||||
fn <impl at $DIR/derived_ord_debug.rs:6:22: 6:25>::cmp(_1: &MultiField, _2: &MultiField) -> std::cmp::Ordering {
|
||||
debug self => _1;
|
||||
debug other => _2;
|
||||
let mut _0: std::cmp::Ordering;
|
||||
let _3: &char;
|
||||
let _4: &char;
|
||||
let mut _5: std::cmp::Ordering;
|
||||
let mut _6: i8;
|
||||
let _7: &i16;
|
||||
let _8: &i16;
|
||||
scope 1 {
|
||||
debug cmp => _5;
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_3 = &((*_1).0: char);
|
||||
_4 = &((*_2).0: char);
|
||||
_5 = <char as Ord>::cmp(copy _3, copy _4) -> [return: bb1, unwind unreachable];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_6 = discriminant(_5);
|
||||
switchInt(move _6) -> [0: bb2, otherwise: bb3];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
_7 = &((*_1).1: i16);
|
||||
_8 = &((*_2).1: i16);
|
||||
_0 = <i16 as Ord>::cmp(copy _7, copy _8) -> [return: bb4, unwind unreachable];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
_0 = copy _5;
|
||||
goto -> bb4;
|
||||
}
|
||||
|
||||
bb4: {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
// MIR for `<impl at $DIR/derived_ord_debug.rs:6:22: 6:25>::cmp` after PreCodegen
|
||||
|
||||
fn <impl at $DIR/derived_ord_debug.rs:6:22: 6:25>::cmp(_1: &MultiField, _2: &MultiField) -> std::cmp::Ordering {
|
||||
debug self => _1;
|
||||
debug other => _2;
|
||||
let mut _0: std::cmp::Ordering;
|
||||
let _3: &char;
|
||||
let _4: &char;
|
||||
let mut _5: std::cmp::Ordering;
|
||||
let mut _6: i8;
|
||||
let _7: &i16;
|
||||
let _8: &i16;
|
||||
scope 1 {
|
||||
debug cmp => _5;
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_3 = &((*_1).0: char);
|
||||
_4 = &((*_2).0: char);
|
||||
_5 = <char as Ord>::cmp(copy _3, copy _4) -> [return: bb1, unwind continue];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_6 = discriminant(_5);
|
||||
switchInt(move _6) -> [0: bb2, otherwise: bb3];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
_7 = &((*_1).1: i16);
|
||||
_8 = &((*_2).1: i16);
|
||||
_0 = <i16 as Ord>::cmp(copy _7, copy _8) -> [return: bb4, unwind continue];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
_0 = copy _5;
|
||||
goto -> bb4;
|
||||
}
|
||||
|
||||
bb4: {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
// MIR for `option_direct` after PreCodegen
|
||||
|
||||
fn option_direct(_1: Option<u32>) -> Option<u32> {
|
||||
debug x => _1;
|
||||
let mut _0: std::option::Option<u32>;
|
||||
let mut _2: isize;
|
||||
let _3: u32;
|
||||
let mut _4: u32;
|
||||
scope 1 {
|
||||
debug x => _3;
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_2 = discriminant(_1);
|
||||
switchInt(move _2) -> [0: bb1, 1: bb2, otherwise: bb4];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_0 = Option::<u32>::None;
|
||||
goto -> bb3;
|
||||
}
|
||||
|
||||
bb2: {
|
||||
_3 = copy ((_1 as Some).0: u32);
|
||||
_4 = Not(copy _3);
|
||||
_0 = Option::<u32>::Some(move _4);
|
||||
goto -> bb3;
|
||||
}
|
||||
|
||||
bb3: {
|
||||
return;
|
||||
}
|
||||
|
||||
bb4: {
|
||||
unreachable;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
// MIR for `option_direct` after PreCodegen
|
||||
|
||||
fn option_direct(_1: Option<u32>) -> Option<u32> {
|
||||
debug x => _1;
|
||||
let mut _0: std::option::Option<u32>;
|
||||
let mut _2: isize;
|
||||
let _3: u32;
|
||||
let mut _4: u32;
|
||||
scope 1 {
|
||||
debug x => _3;
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_2 = discriminant(_1);
|
||||
switchInt(move _2) -> [0: bb1, 1: bb2, otherwise: bb4];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_0 = Option::<u32>::None;
|
||||
goto -> bb3;
|
||||
}
|
||||
|
||||
bb2: {
|
||||
_3 = copy ((_1 as Some).0: u32);
|
||||
_4 = Not(copy _3);
|
||||
_0 = Option::<u32>::Some(move _4);
|
||||
goto -> bb3;
|
||||
}
|
||||
|
||||
bb3: {
|
||||
return;
|
||||
}
|
||||
|
||||
bb4: {
|
||||
unreachable;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
// MIR for `option_traits` after PreCodegen
|
||||
|
||||
fn option_traits(_1: Option<u32>) -> Option<u32> {
|
||||
debug x => _1;
|
||||
let mut _0: std::option::Option<u32>;
|
||||
let mut _2: std::ops::ControlFlow<std::option::Option<std::convert::Infallible>, u32>;
|
||||
let mut _3: isize;
|
||||
let _4: u32;
|
||||
let mut _5: u32;
|
||||
scope 1 {
|
||||
debug residual => const Option::<Infallible>::None;
|
||||
scope 2 {
|
||||
}
|
||||
}
|
||||
scope 3 {
|
||||
debug val => _4;
|
||||
scope 4 {
|
||||
}
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_2 = <Option<u32> as Try>::branch(copy _1) -> [return: bb1, unwind unreachable];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_3 = discriminant(_2);
|
||||
switchInt(move _3) -> [0: bb2, 1: bb3, otherwise: bb5];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
_4 = copy ((_2 as Continue).0: u32);
|
||||
_5 = Not(copy _4);
|
||||
_0 = <Option<u32> as Try>::from_output(move _5) -> [return: bb4, unwind unreachable];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
_0 = <Option<u32> as FromResidual<Option<Infallible>>>::from_residual(const Option::<Infallible>::None) -> [return: bb4, unwind unreachable];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
return;
|
||||
}
|
||||
|
||||
bb5: {
|
||||
unreachable;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
// MIR for `option_traits` after PreCodegen
|
||||
|
||||
fn option_traits(_1: Option<u32>) -> Option<u32> {
|
||||
debug x => _1;
|
||||
let mut _0: std::option::Option<u32>;
|
||||
let mut _2: std::ops::ControlFlow<std::option::Option<std::convert::Infallible>, u32>;
|
||||
let mut _3: isize;
|
||||
let _4: u32;
|
||||
let mut _5: u32;
|
||||
scope 1 {
|
||||
debug residual => const Option::<Infallible>::None;
|
||||
scope 2 {
|
||||
}
|
||||
}
|
||||
scope 3 {
|
||||
debug val => _4;
|
||||
scope 4 {
|
||||
}
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_2 = <Option<u32> as Try>::branch(copy _1) -> [return: bb1, unwind continue];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_3 = discriminant(_2);
|
||||
switchInt(move _3) -> [0: bb2, 1: bb3, otherwise: bb5];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
_4 = copy ((_2 as Continue).0: u32);
|
||||
_5 = Not(copy _4);
|
||||
_0 = <Option<u32> as Try>::from_output(move _5) -> [return: bb4, unwind continue];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
_0 = <Option<u32> as FromResidual<Option<Infallible>>>::from_residual(const Option::<Infallible>::None) -> [return: bb4, unwind continue];
|
||||
}
|
||||
|
||||
bb4: {
|
||||
return;
|
||||
}
|
||||
|
||||
bb5: {
|
||||
unreachable;
|
||||
}
|
||||
}
|
||||
29
tests/mir-opt/pre-codegen/option_bubble_debug.rs
Normal file
29
tests/mir-opt/pre-codegen/option_bubble_debug.rs
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
//@ compile-flags: -Copt-level=0 -Zmir-opt-level=1 -Cdebuginfo=limited
|
||||
//@ edition: 2024
|
||||
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![feature(try_blocks)]
|
||||
|
||||
// EMIT_MIR option_bubble_debug.option_direct.PreCodegen.after.mir
|
||||
pub fn option_direct(x: Option<u32>) -> Option<u32> {
|
||||
// CHECK-LABEL: fn option_direct(_1: Option<u32>) -> Option<u32>
|
||||
// CHECK: = discriminant(_1);
|
||||
// CHECK: [[TEMP:_.+]] = Not({{.+}});
|
||||
// CHECK: _0 = Option::<u32>::Some(move [[TEMP]]);
|
||||
|
||||
match x {
|
||||
Some(x) => Some(!x),
|
||||
None => None,
|
||||
}
|
||||
}
|
||||
|
||||
// EMIT_MIR option_bubble_debug.option_traits.PreCodegen.after.mir
|
||||
pub fn option_traits(x: Option<u32>) -> Option<u32> {
|
||||
// CHECK-LABEL: fn option_traits(_1: Option<u32>) -> Option<u32>
|
||||
// CHECK: = <Option<u32> as Try>::branch(copy _1)
|
||||
// CHECK: [[TEMP:_.+]] = Not({{.+}});
|
||||
// CHECK: _0 = <Option<u32> as Try>::from_output(move [[TEMP]])
|
||||
|
||||
try { !(x?) }
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue