mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
mir-opt: Do not transform non-int type in match_branches
This commit is contained in:
@@ -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();
|
||||
|
||||
+29
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -628,6 +628,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(()));
|
||||
@@ -665,4 +696,5 @@ fn main() {
|
||||
let _ = match_i128_u128(EnumAi128::A);
|
||||
|
||||
let _ = my_is_some(None);
|
||||
let _ = match_non_int_failed('a');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user