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:
commit
3846f2f08f
3 changed files with 65 additions and 2 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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');
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue