Rollup merge of #141494 - dianqk:match-br-non-int, r=wesleywiser

mir-opt: Do not transform non-int type in match_branches

Fixes #141378.

r? mir-opt
This commit is contained in:
Jubilee 2025-05-30 13:52:26 -07:00 committed by GitHub
commit 3846f2f08f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 65 additions and 2 deletions

View file

@ -284,12 +284,14 @@ fn can_cast(
let v = match src_layout.ty.kind() {
ty::Uint(_) => from_scalar.to_uint(src_layout.size),
ty::Int(_) => from_scalar.to_int(src_layout.size) as u128,
_ => unreachable!("invalid int"),
// We can also transform the values of other integer representations (such as char),
// although this may not be practical in real-world scenarios.
_ => return false,
};
let size = match *cast_ty.kind() {
ty::Int(t) => Integer::from_int_ty(&tcx, t).size(),
ty::Uint(t) => Integer::from_uint_ty(&tcx, t).size(),
_ => unreachable!("invalid int"),
_ => return false,
};
let v = size.truncate(v);
let cast_scalar = ScalarInt::try_from_uint(v, size).unwrap();

View file

@ -0,0 +1,29 @@
- // MIR for `match_non_int_failed` before MatchBranchSimplification
+ // MIR for `match_non_int_failed` after MatchBranchSimplification
fn match_non_int_failed(_1: char) -> u8 {
let mut _0: u8;
bb0: {
switchInt(copy _1) -> [97: bb1, 98: bb2, otherwise: bb3];
}
bb1: {
_0 = const 97_u8;
goto -> bb4;
}
bb2: {
_0 = const 98_u8;
goto -> bb4;
}
bb3: {
unreachable;
}
bb4: {
return;
}
}

View file

@ -627,6 +627,37 @@ fn match_i128_u128(i: EnumAi128) -> u128 {
}
}
// EMIT_MIR matches_reduce_branches.match_non_int_failed.MatchBranchSimplification.diff
#[custom_mir(dialect = "runtime")]
fn match_non_int_failed(i: char) -> u8 {
// CHECK-LABEL: fn match_non_int_failed(
// CHECK: switchInt
// CHECK: return
mir! {
{
match i {
'a' => bb1,
'b' => bb2,
_ => unreachable_bb,
}
}
bb1 = {
RET = 97;
Goto(ret)
}
bb2 = {
RET = 98;
Goto(ret)
}
unreachable_bb = {
Unreachable()
}
ret = {
Return()
}
}
}
fn main() {
let _ = foo(None);
let _ = foo(Some(()));
@ -664,4 +695,5 @@ fn main() {
let _ = match_i128_u128(EnumAi128::A);
let _ = my_is_some(None);
let _ = match_non_int_failed('a');
}