Skip to content

Commit

Permalink
Make FalseEdges always have two targets
Browse files Browse the repository at this point in the history
We never have more than one imaginary target, so we have no reason for
a `Vec`
  • Loading branch information
matthewjasper committed Jun 12, 2019
1 parent 55cee44 commit 33bc396
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 32 deletions.
21 changes: 9 additions & 12 deletions src/librustc/mir/mod.rs
Expand Up @@ -1196,9 +1196,9 @@ pub enum TerminatorKind<'tcx> {
FalseEdges {
/// The target normal control flow will take
real_target: BasicBlock,
/// The list of blocks control flow could conceptually take, but won't
/// A block control flow could conceptually take, but won't
/// in practice
imaginary_targets: Vec<BasicBlock>,
imaginary_target: BasicBlock,
},
/// A terminator for blocks that only take one path in reality, but where we
/// reserve the right to unwind in borrowck, even if it won't happen in practice.
Expand Down Expand Up @@ -1335,8 +1335,8 @@ impl<'tcx> TerminatorKind<'tcx> {
SwitchInt { ref targets, .. } => None.into_iter().chain(&targets[..]),
FalseEdges {
ref real_target,
ref imaginary_targets,
} => Some(real_target).into_iter().chain(&imaginary_targets[..]),
ref imaginary_target,
} => Some(real_target).into_iter().chain(slice::from_ref(imaginary_target)),
}
}

Expand Down Expand Up @@ -1422,10 +1422,10 @@ impl<'tcx> TerminatorKind<'tcx> {
} => None.into_iter().chain(&mut targets[..]),
FalseEdges {
ref mut real_target,
ref mut imaginary_targets,
ref mut imaginary_target,
} => Some(real_target)
.into_iter()
.chain(&mut imaginary_targets[..]),
.chain(slice::from_mut(imaginary_target)),
}
}

Expand Down Expand Up @@ -1722,12 +1722,9 @@ impl<'tcx> TerminatorKind<'tcx> {
Assert { cleanup: None, .. } => vec!["".into()],
Assert { .. } => vec!["success".into(), "unwind".into()],
FalseEdges {
ref imaginary_targets,
..
} => {
let mut l = vec!["real".into()];
l.resize(imaginary_targets.len() + 1, "imaginary".into());
l
vec!["real".into(), "imaginary".into()]
}
FalseUnwind {
unwind: Some(_), ..
Expand Down Expand Up @@ -3356,10 +3353,10 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> {
Unreachable => Unreachable,
FalseEdges {
real_target,
ref imaginary_targets,
imaginary_target,
} => FalseEdges {
real_target,
imaginary_targets: imaginary_targets.clone(),
imaginary_target,
},
FalseUnwind {
real_target,
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_mir/borrow_check/mod.rs
Expand Up @@ -780,7 +780,7 @@ impl<'cx, 'gcx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx
| TerminatorKind::Unreachable
| TerminatorKind::FalseEdges {
real_target: _,
imaginary_targets: _,
imaginary_target: _,
}
| TerminatorKind::FalseUnwind {
real_target: _,
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_mir/borrow_check/nll/invalidation.rs
Expand Up @@ -244,7 +244,7 @@ impl<'cx, 'tcx, 'gcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx, 'gcx> {
| TerminatorKind::Unreachable
| TerminatorKind::FalseEdges {
real_target: _,
imaginary_targets: _,
imaginary_target: _,
}
| TerminatorKind::FalseUnwind {
real_target: _,
Expand Down
6 changes: 2 additions & 4 deletions src/librustc_mir/borrow_check/nll/type_check/mod.rs
Expand Up @@ -1792,12 +1792,10 @@ impl<'a, 'gcx, 'tcx> TypeChecker<'a, 'gcx, 'tcx> {
}
TerminatorKind::FalseEdges {
real_target,
ref imaginary_targets,
imaginary_target,
} => {
self.assert_iscleanup(body, block_data, real_target, is_cleanup);
for target in imaginary_targets {
self.assert_iscleanup(body, block_data, *target, is_cleanup);
}
self.assert_iscleanup(body, block_data, imaginary_target, is_cleanup);
}
TerminatorKind::FalseUnwind {
real_target,
Expand Down
10 changes: 4 additions & 6 deletions src/librustc_mir/build/matches/mod.rs
Expand Up @@ -961,9 +961,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
source_info,
TerminatorKind::FalseEdges {
real_target: second_candidate.pre_binding_block,
imaginary_targets: vec![
first_candidate.next_candidate_pre_binding_block
],
imaginary_target: first_candidate.next_candidate_pre_binding_block,
}
)
} else {
Expand All @@ -984,7 +982,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
source_info,
TerminatorKind::FalseEdges {
real_target: unreachable,
imaginary_targets: vec![candidate.next_candidate_pre_binding_block],
imaginary_targets: candidate.next_candidate_pre_binding_block,
}
);
self.cfg.terminate(unreachable, source_info, TerminatorKind::Unreachable);
Expand All @@ -1001,7 +999,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
source_info,
TerminatorKind::FalseEdges {
real_target: block,
imaginary_targets: vec![last_candidate.next_candidate_pre_binding_block]
imaginary_target: last_candidate.next_candidate_pre_binding_block,
}
);
Some(block)
Expand Down Expand Up @@ -1330,7 +1328,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
candidate_source_info,
TerminatorKind::FalseEdges {
real_target: block,
imaginary_targets: vec![candidate.next_candidate_pre_binding_block],
imaginary_target: candidate.next_candidate_pre_binding_block,
},
);
self.ascribe_types(block, &candidate.ascriptions);
Expand Down
6 changes: 2 additions & 4 deletions src/librustc_mir/dataflow/mod.rs
Expand Up @@ -802,11 +802,9 @@ impl<'a, 'tcx: 'a, D> DataflowAnalysis<'a, 'tcx, D> where D: BitDenotation<'tcx>
self.propagate_bits_into_entry_set_for(in_out, dest_bb, dirty_list);
}
}
mir::TerminatorKind::FalseEdges { real_target, ref imaginary_targets } => {
mir::TerminatorKind::FalseEdges { real_target, imaginary_target } => {
self.propagate_bits_into_entry_set_for(in_out, real_target, dirty_list);
for target in imaginary_targets {
self.propagate_bits_into_entry_set_for(in_out, *target, dirty_list);
}
self.propagate_bits_into_entry_set_for(in_out, imaginary_target, dirty_list);
}
mir::TerminatorKind::FalseUnwind { real_target, unwind } => {
self.propagate_bits_into_entry_set_for(in_out, real_target, dirty_list);
Expand Down
6 changes: 2 additions & 4 deletions src/librustc_mir/transform/inline.rs
Expand Up @@ -791,11 +791,9 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Integrator<'a, 'tcx> {
}
TerminatorKind::Abort => { }
TerminatorKind::Unreachable => { }
TerminatorKind::FalseEdges { ref mut real_target, ref mut imaginary_targets } => {
TerminatorKind::FalseEdges { ref mut real_target, ref mut imaginary_target } => {
*real_target = self.update_target(*real_target);
for target in imaginary_targets {
*target = self.update_target(*target);
}
*imaginary_target = self.update_target(*imaginary_target);
}
TerminatorKind::FalseUnwind { real_target: _ , unwind: _ } =>
// see the ordering of passes in the optimized_mir query.
Expand Down

0 comments on commit 33bc396

Please sign in to comment.