From: Matthew Jasper Date: Mon, 6 May 2019 14:18:57 +0000 (+0100) Subject: Make `FalseEdges` always have two targets X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=33bc396ff721d9beb9a918099e71852b734a0790;p=rust.git Make `FalseEdges` always have two targets We never have more than one imaginary target, so we have no reason for a `Vec` --- diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index e73023d9a8c..f18afe7b632 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -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, + 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. @@ -1335,8 +1335,8 @@ pub fn successors(&self) -> Successors<'_> { 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)), } } @@ -1422,10 +1422,10 @@ pub fn successors_mut(&mut self) -> SuccessorsMut<'_> { } => 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)), } } @@ -1722,12 +1722,9 @@ pub fn fmt_successor_labels(&self) -> Vec> { 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(_), .. @@ -3356,10 +3353,10 @@ fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) Unreachable => Unreachable, FalseEdges { real_target, - ref imaginary_targets, + imaginary_target, } => FalseEdges { real_target, - imaginary_targets: imaginary_targets.clone(), + imaginary_target, }, FalseUnwind { real_target, diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 60ad8921c0b..335db27d235 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -780,7 +780,7 @@ fn visit_terminator_entry( | TerminatorKind::Unreachable | TerminatorKind::FalseEdges { real_target: _, - imaginary_targets: _, + imaginary_target: _, } | TerminatorKind::FalseUnwind { real_target: _, diff --git a/src/librustc_mir/borrow_check/nll/invalidation.rs b/src/librustc_mir/borrow_check/nll/invalidation.rs index 12433ca365d..7933fb80a36 100644 --- a/src/librustc_mir/borrow_check/nll/invalidation.rs +++ b/src/librustc_mir/borrow_check/nll/invalidation.rs @@ -244,7 +244,7 @@ fn visit_terminator_kind( | TerminatorKind::Unreachable | TerminatorKind::FalseEdges { real_target: _, - imaginary_targets: _, + imaginary_target: _, } | TerminatorKind::FalseUnwind { real_target: _, diff --git a/src/librustc_mir/borrow_check/nll/type_check/mod.rs b/src/librustc_mir/borrow_check/nll/type_check/mod.rs index bbfffc68b96..104a8cb4894 100644 --- a/src/librustc_mir/borrow_check/nll/type_check/mod.rs +++ b/src/librustc_mir/borrow_check/nll/type_check/mod.rs @@ -1792,12 +1792,10 @@ fn check_iscleanup(&mut self, body: &Body<'tcx>, block_data: &BasicBlockData<'tc } 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, diff --git a/src/librustc_mir/build/matches/mod.rs b/src/librustc_mir/build/matches/mod.rs index 0aabebcf9dc..353842730c7 100644 --- a/src/librustc_mir/build/matches/mod.rs +++ b/src/librustc_mir/build/matches/mod.rs @@ -961,9 +961,7 @@ fn select_matched_candidates( 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 { @@ -984,7 +982,7 @@ fn select_matched_candidates( 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); @@ -1001,7 +999,7 @@ fn select_matched_candidates( 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) @@ -1330,7 +1328,7 @@ fn bind_and_guard_matched_candidate<'pat>( 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); diff --git a/src/librustc_mir/dataflow/mod.rs b/src/librustc_mir/dataflow/mod.rs index 10e46507d5a..9350881f1e1 100644 --- a/src/librustc_mir/dataflow/mod.rs +++ b/src/librustc_mir/dataflow/mod.rs @@ -802,11 +802,9 @@ fn propagate_bits_into_graph_successors_of( 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); diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs index 55c035f2858..e20d5eb2e3d 100644 --- a/src/librustc_mir/transform/inline.rs +++ b/src/librustc_mir/transform/inline.rs @@ -791,11 +791,9 @@ fn visit_terminator_kind(&mut self, } 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.