Skip to content

Commit fd63bf7

Browse files
committed
Rm allocation in uninhabited_enum_branching
Also convert `uninhabited_enum_branching` `Cow<[u128]>::to_mut`
1 parent 70ad318 commit fd63bf7

File tree

3 files changed

+33
-53
lines changed

3 files changed

+33
-53
lines changed

src/librustc_mir/transform/simplify_try.rs

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -246,12 +246,14 @@ fn get_arm_identity_info<'a, 'tcx>(
246246
tmp_assigned_vars.insert(*r);
247247
}
248248

249-
let mut dbg_info_to_adjust = Vec::new();
250-
for (i, var_info) in debug_info.iter().enumerate() {
251-
if tmp_assigned_vars.contains(var_info.place.local) {
252-
dbg_info_to_adjust.push(i);
253-
}
254-
}
249+
let dbg_info_to_adjust: Vec<_> =
250+
debug_info
251+
.iter()
252+
.enumerate()
253+
.filter_map(|(i, var_info)| {
254+
if tmp_assigned_vars.contains(var_info.place.local) { Some(i) } else { None }
255+
})
256+
.collect();
255257

256258
Some(ArmIdentityInfo {
257259
local_temp_0: local_tmp_s0,
@@ -461,14 +463,14 @@ fn match_get_variant_field<'tcx>(
461463
stmt: &Statement<'tcx>,
462464
) -> Option<(Local, Local, VarField<'tcx>, &'tcx List<PlaceElem<'tcx>>)> {
463465
match &stmt.kind {
464-
StatementKind::Assign(box (place_into, rvalue_from)) => match rvalue_from {
465-
Rvalue::Use(Operand::Copy(pf) | Operand::Move(pf)) => {
466-
let local_into = place_into.as_local()?;
467-
let (local_from, vf) = match_variant_field_place(*pf)?;
468-
Some((local_into, local_from, vf, pf.projection))
469-
}
470-
_ => None,
471-
},
466+
StatementKind::Assign(box (
467+
place_into,
468+
Rvalue::Use(Operand::Copy(pf) | Operand::Move(pf)),
469+
)) => {
470+
let local_into = place_into.as_local()?;
471+
let (local_from, vf) = match_variant_field_place(*pf)?;
472+
Some((local_into, local_from, vf, pf.projection))
473+
}
472474
_ => None,
473475
}
474476
}
@@ -479,14 +481,11 @@ fn match_get_variant_field<'tcx>(
479481
/// ```
480482
fn match_set_variant_field<'tcx>(stmt: &Statement<'tcx>) -> Option<(Local, Local, VarField<'tcx>)> {
481483
match &stmt.kind {
482-
StatementKind::Assign(box (place_from, rvalue_into)) => match rvalue_into {
483-
Rvalue::Use(Operand::Move(place_into)) => {
484-
let local_into = place_into.as_local()?;
485-
let (local_from, vf) = match_variant_field_place(*place_from)?;
486-
Some((local_into, local_from, vf))
487-
}
488-
_ => None,
489-
},
484+
StatementKind::Assign(box (place_from, Rvalue::Use(Operand::Move(place_into)))) => {
485+
let local_into = place_into.as_local()?;
486+
let (local_from, vf) = match_variant_field_place(*place_from)?;
487+
Some((local_into, local_from, vf))
488+
}
490489
_ => None,
491490
}
492491
}

src/librustc_mir/transform/uninhabited_enum_branching.rs

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -99,26 +99,18 @@ impl<'tcx> MirPass<'tcx> for UninhabitedEnumBranching {
9999
if let TerminatorKind::SwitchInt { values, targets, .. } =
100100
&mut body.basic_blocks_mut()[bb].terminator_mut().kind
101101
{
102-
let vals = &*values;
103-
let zipped = vals.iter().zip(targets.iter());
104-
105-
let mut matched_values = Vec::with_capacity(allowed_variants.len());
106-
let mut matched_targets = Vec::with_capacity(allowed_variants.len() + 1);
107-
108-
for (val, target) in zipped {
109-
if allowed_variants.contains(val) {
110-
matched_values.push(*val);
111-
matched_targets.push(*target);
112-
} else {
113-
trace!("eliminating {:?} -> {:?}", val, target);
114-
}
115-
}
116-
117-
// handle the "otherwise" branch
118-
matched_targets.push(targets.pop().unwrap());
119-
120-
*values = matched_values.into();
121-
*targets = matched_targets;
102+
// take otherwise out early
103+
let otherwise = targets.pop().unwrap();
104+
assert_eq!(targets.len(), values.len());
105+
let mut i = 0;
106+
targets.retain(|_| {
107+
let keep = allowed_variants.contains(&values[i]);
108+
i += 1;
109+
keep
110+
});
111+
targets.push(otherwise);
112+
113+
values.to_mut().retain(|var| allowed_variants.contains(var));
122114
} else {
123115
unreachable!()
124116
}

src/librustc_mir/transform/unreachable_prop.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,6 @@ where
6868
F: Fn(BasicBlock) -> bool,
6969
{
7070
let terminator = match *terminator_kind {
71-
TerminatorKind::FalseEdge { real_target, imaginary_target }
72-
if predicate(real_target) && predicate(imaginary_target) =>
73-
{
74-
TerminatorKind::Unreachable
75-
}
76-
TerminatorKind::FalseUnwind { real_target, unwind }
77-
if predicate(real_target) && unwind.map_or(true, &predicate) =>
78-
{
79-
TerminatorKind::Unreachable
80-
}
81-
8271
TerminatorKind::Goto { target } if predicate(target) => TerminatorKind::Unreachable,
8372
TerminatorKind::SwitchInt { ref discr, switch_ty, ref values, ref targets } => {
8473
let original_targets_len = targets.len();

0 commit comments

Comments
 (0)