Add a mir-opt test for *debug* MIR from derive(PartialOrd, Ord)

Because the follow-up commits will affect it, and the goal is to show how.
This commit is contained in:
Scott McMurray 2025-07-25 11:16:14 -07:00
parent 63f6845e57
commit c441640f0e
5 changed files with 206 additions and 0 deletions

View 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(

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}