Skip to content

Commit 70ad318

Browse files
committed
Clean up some mir transform passes
I noticed a few places where there were intermediates being created in MIR optimization passes, so I removed them.
1 parent b6396b7 commit 70ad318

File tree

3 files changed

+50
-51
lines changed

3 files changed

+50
-51
lines changed

src/librustc_mir/transform/add_retag.rs

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,11 @@ impl<'tcx> MirPass<'tcx> for AddRetag {
8686
.skip(1)
8787
.take(arg_count)
8888
.map(|(local, _)| Place::from(local))
89-
.filter(needs_retag)
90-
.collect::<Vec<_>>();
89+
.filter(needs_retag);
9190
// Emit their retags.
9291
basic_blocks[START_BLOCK].statements.splice(
9392
0..0,
94-
places.into_iter().map(|place| Statement {
93+
places.map(|place| Statement {
9594
source_info,
9695
kind: StatementKind::Retag(RetagKind::FnEntry, box (place)),
9796
}),
@@ -101,29 +100,24 @@ impl<'tcx> MirPass<'tcx> for AddRetag {
101100
// PART 2
102101
// Retag return values of functions. Also escape-to-raw the argument of `drop`.
103102
// We collect the return destinations because we cannot mutate while iterating.
104-
let mut returns: Vec<(SourceInfo, Place<'tcx>, BasicBlock)> = Vec::new();
105-
for block_data in basic_blocks.iter_mut() {
106-
match block_data.terminator().kind {
107-
TerminatorKind::Call { ref destination, .. } => {
108-
// Remember the return destination for later
109-
if let Some(ref destination) = destination {
110-
if needs_retag(&destination.0) {
111-
returns.push((
112-
block_data.terminator().source_info,
113-
destination.0,
114-
destination.1,
115-
));
116-
}
103+
let returns = basic_blocks
104+
.iter_mut()
105+
.filter_map(|block_data| {
106+
match block_data.terminator().kind {
107+
TerminatorKind::Call { destination: Some(ref destination), .. }
108+
if needs_retag(&destination.0) =>
109+
{
110+
// Remember the return destination for later
111+
Some((block_data.terminator().source_info, destination.0, destination.1))
117112
}
118-
}
119-
TerminatorKind::Drop { .. } | TerminatorKind::DropAndReplace { .. } => {
113+
120114
// `Drop` is also a call, but it doesn't return anything so we are good.
121-
}
122-
_ => {
115+
TerminatorKind::Drop { .. } | TerminatorKind::DropAndReplace { .. } => None,
123116
// Not a block ending in a Call -> ignore.
117+
_ => None,
124118
}
125-
}
126-
}
119+
})
120+
.collect::<Vec<_>>();
127121
// Now we go over the returns we collected to retag the return values.
128122
for (source_info, dest_place, dest_block) in returns {
129123
basic_blocks[dest_block].statements.insert(

src/librustc_mir/transform/deaggregator.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,24 @@ impl<'tcx> MirPass<'tcx> for Deaggregator {
1212
for bb in basic_blocks {
1313
bb.expand_statements(|stmt| {
1414
// FIXME(eddyb) don't match twice on `stmt.kind` (post-NLL).
15-
if let StatementKind::Assign(box (_, ref rhs)) = stmt.kind {
16-
if let Rvalue::Aggregate(ref kind, _) = *rhs {
17-
// FIXME(#48193) Deaggregate arrays when it's cheaper to do so.
18-
if let AggregateKind::Array(_) = **kind {
19-
return None;
20-
}
21-
} else {
15+
match stmt.kind {
16+
// FIXME(#48193) Deaggregate arrays when it's cheaper to do so.
17+
StatementKind::Assign(box (
18+
_,
19+
Rvalue::Aggregate(box AggregateKind::Array(_), _),
20+
)) => {
2221
return None;
2322
}
24-
} else {
25-
return None;
23+
StatementKind::Assign(box (_, Rvalue::Aggregate(_, _))) => {}
24+
_ => return None,
2625
}
2726

2827
let stmt = stmt.replace_nop();
2928
let source_info = stmt.source_info;
3029
let (lhs, kind, operands) = match stmt.kind {
31-
StatementKind::Assign(box (lhs, rvalue)) => match rvalue {
32-
Rvalue::Aggregate(kind, operands) => (lhs, kind, operands),
33-
_ => bug!(),
34-
},
30+
StatementKind::Assign(box (lhs, Rvalue::Aggregate(kind, operands))) => {
31+
(lhs, kind, operands)
32+
}
3533
_ => bug!(),
3634
};
3735

src/librustc_mir/transform/unreachable_prop.rs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,24 @@ fn remove_successors<F>(
6767
where
6868
F: Fn(BasicBlock) -> bool,
6969
{
70-
match *terminator_kind {
71-
TerminatorKind::Goto { target } if predicate(target) => Some(TerminatorKind::Unreachable),
70+
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+
82+
TerminatorKind::Goto { target } if predicate(target) => TerminatorKind::Unreachable,
7283
TerminatorKind::SwitchInt { ref discr, switch_ty, ref values, ref targets } => {
7384
let original_targets_len = targets.len();
7485
let (otherwise, targets) = targets.split_last().unwrap();
75-
let retained = values
76-
.iter()
77-
.zip(targets.iter())
78-
.filter(|(_, &t)| !predicate(t))
79-
.collect::<Vec<_>>();
80-
let mut values = retained.iter().map(|&(v, _)| *v).collect::<Vec<_>>();
81-
let mut targets = retained.iter().map(|&(_, d)| *d).collect::<Vec<_>>();
86+
let (mut values, mut targets): (Vec<_>, Vec<_>) =
87+
values.iter().zip(targets.iter()).filter(|(_, &t)| !predicate(t)).unzip();
8288

8389
if !predicate(*otherwise) {
8490
targets.push(*otherwise);
@@ -89,20 +95,21 @@ where
8995
let retained_targets_len = targets.len();
9096

9197
if targets.is_empty() {
92-
Some(TerminatorKind::Unreachable)
98+
TerminatorKind::Unreachable
9399
} else if targets.len() == 1 {
94-
Some(TerminatorKind::Goto { target: targets[0] })
100+
TerminatorKind::Goto { target: targets[0] }
95101
} else if original_targets_len != retained_targets_len {
96-
Some(TerminatorKind::SwitchInt {
102+
TerminatorKind::SwitchInt {
97103
discr: discr.clone(),
98104
switch_ty,
99105
values: Cow::from(values),
100106
targets,
101-
})
107+
}
102108
} else {
103-
None
109+
return None;
104110
}
105111
}
106-
_ => None,
107-
}
112+
_ => return None,
113+
};
114+
Some(terminator)
108115
}

0 commit comments

Comments
 (0)