From f1c5f34f76cea4a98b6af44f58e109b2e0c8922a Mon Sep 17 00:00:00 2001 From: ouz-a Date: Thu, 28 Apr 2022 01:03:07 +0300 Subject: [PATCH 1/3] exp-stuff-dirty --- compiler/rustc_middle/src/mir/mod.rs | 6 +++++ compiler/rustc_middle/src/mir/patch.rs | 9 +++++++ compiler/rustc_mir_transform/src/add_retag.rs | 15 +++++++++++- .../src/deref_separator.rs | 6 ++--- compiler/rustc_mir_transform/src/lib.rs | 2 +- .../derefer_complex_case.main.Derefer.diff | 8 +++---- .../derefer_terminator_test.main.Derefer.diff | 8 +++---- .../mir-opt/derefer_test.main.Derefer.diff | 16 +++++-------- .../derefer_test_multiple.main.Derefer.diff | 24 +++++++------------ ...wise_branch.opt1.EarlyOtherwiseBranch.diff | 6 ++--- ...wise_branch.opt2.EarlyOtherwiseBranch.diff | 6 ++--- ...wise_branch.opt3.EarlyOtherwiseBranch.diff | 6 ++--- ...ement_tuple.opt1.EarlyOtherwiseBranch.diff | 6 ++--- ...nch_noopt.noopt1.EarlyOtherwiseBranch.diff | 4 ---- ...ess.no_deref_ptr.EarlyOtherwiseBranch.diff | 4 ---- ...ness.no_downcast.EarlyOtherwiseBranch.diff | 4 ---- ...t_opt_bool.SimplifyComparisonIntegral.diff | 4 ---- ...opt_floats.SimplifyComparisonIntegral.diff | 4 ---- ...comparison.SimplifyComparisonIntegral.diff | 4 ---- ...t.opt_char.SimplifyComparisonIntegral.diff | 4 ---- ...int.opt_i8.SimplifyComparisonIntegral.diff | 4 ---- ...ltiple_ifs.SimplifyComparisonIntegral.diff | 4 ---- ...t_negative.SimplifyComparisonIntegral.diff | 4 ---- ...nt.opt_u32.SimplifyComparisonIntegral.diff | 4 ---- ...ray_len.array_bound.NormalizeArrayLen.diff | 4 ---- ...len.array_bound_mut.NormalizeArrayLen.diff | 4 ---- ...array_len.array_len.NormalizeArrayLen.diff | 4 ---- ....array_len_by_value.NormalizeArrayLen.diff | 4 ---- ...er_slice_len.bound.LowerSliceLenCalls.diff | 4 ---- .../nrvo_simple.nrvo.RenameReturnPlace.diff | 4 ---- ..._fallthrough.UninhabitedEnumBranching.diff | 8 ++----- ..._fallthrough.UninhabitedEnumBranching.diff | 4 ---- ...reachable.main.UnreachablePropagation.diff | 4 ---- ...diverging.main.UnreachablePropagation.diff | 4 ---- 34 files changed, 65 insertions(+), 141 deletions(-) diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index 883fc72cd56c1..e042e57acf1f5 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -1079,6 +1079,8 @@ pub enum LocalInfo<'tcx> { /// A temporary created during the creation of an aggregate /// (e.g. a temporary for `foo` in `MyStruct { my_field: foo }`) AggregateTemp, + /// A temporary created during the pass `Derefer` to avoid it's retagging + Temp, } impl<'tcx> LocalDecl<'tcx> { @@ -1178,6 +1180,10 @@ impl<'tcx> LocalDecl<'tcx> { } } + pub fn temp(mut self) { + self.local_info = Some(Box::new(LocalInfo::Temp)); + } + /// Converts `self` into same `LocalDecl` except tagged as internal. #[inline] pub fn internal(mut self) -> Self { diff --git a/compiler/rustc_middle/src/mir/patch.rs b/compiler/rustc_middle/src/mir/patch.rs index ad74e356cf953..708ea53eb1ac2 100644 --- a/compiler/rustc_middle/src/mir/patch.rs +++ b/compiler/rustc_middle/src/mir/patch.rs @@ -78,6 +78,15 @@ impl<'tcx> MirPatch<'tcx> { Location { block: bb, statement_index: offset } } + pub fn new_local_temp(&mut self, ty: Ty<'tcx>, span: Span) -> Local { + let index = self.next_local; + self.next_local += 1; + let mut new_decl = LocalDecl::new(ty, span); + new_decl.local_info = Some(Box::new(LocalInfo::Temp)); + self.new_locals.push(new_decl); + Local::new(index as usize) + } + pub fn new_temp(&mut self, ty: Ty<'tcx>, span: Span) -> Local { let index = self.next_local; self.next_local += 1; diff --git a/compiler/rustc_mir_transform/src/add_retag.rs b/compiler/rustc_mir_transform/src/add_retag.rs index 28a5a22dd9d5d..ff4cd47732672 100644 --- a/compiler/rustc_mir_transform/src/add_retag.rs +++ b/compiler/rustc_mir_transform/src/add_retag.rs @@ -57,6 +57,17 @@ fn may_be_reference(ty: Ty<'_>) -> bool { } } +/// Determines whether or not this LocalDecl is temp, if not it needs retagging. +fn is_not_temp<'tcx>(local_decl: &LocalDecl<'tcx>) -> bool { + if local_decl.local_info.is_some() { + match local_decl.local_info.as_ref().unwrap().as_ref() { + LocalInfo::Temp => return false, + _ => (), + }; + } + return true; +} + impl<'tcx> MirPass<'tcx> for AddRetag { fn is_enabled(&self, sess: &rustc_session::Session) -> bool { sess.opts.debugging_opts.mir_emit_retag @@ -71,7 +82,9 @@ impl<'tcx> MirPass<'tcx> for AddRetag { let needs_retag = |place: &Place<'tcx>| { // FIXME: Instead of giving up for unstable places, we should introduce // a temporary and retag on that. - is_stable(place.as_ref()) && may_be_reference(place.ty(&*local_decls, tcx).ty) + is_stable(place.as_ref()) + && may_be_reference(place.ty(&*local_decls, tcx).ty) + && is_not_temp(&local_decls[place.local]) }; let place_base_raw = |place: &Place<'tcx>| { // If this is a `Deref`, get the type of what we are deref'ing. diff --git a/compiler/rustc_mir_transform/src/deref_separator.rs b/compiler/rustc_mir_transform/src/deref_separator.rs index 7d81bb74cd608..afaab6e9a35d0 100644 --- a/compiler/rustc_mir_transform/src/deref_separator.rs +++ b/compiler/rustc_mir_transform/src/deref_separator.rs @@ -34,7 +34,7 @@ impl<'tcx> MutVisitor<'tcx> for DerefChecker<'tcx> { if p_elem == ProjectionElem::Deref && !p_ref.projection.is_empty() { let ty = p_ref.ty(&self.local_decls, self.tcx).ty; let temp = - self.patcher.new_temp(ty, self.local_decls[p_ref.local].source_info.span); + self.patcher.new_local_temp(ty, self.local_decls[p_ref.local].source_info.span); self.patcher.add_statement(loc, StatementKind::StorageLive(temp)); @@ -42,12 +42,12 @@ impl<'tcx> MutVisitor<'tcx> for DerefChecker<'tcx> { // temp value, excluding projections we already covered. let deref_place = Place::from(place_local) .project_deeper(&p_ref.projection[last_len..], self.tcx); + self.patcher.add_assign( loc, Place::from(temp), Rvalue::Use(Operand::Move(deref_place)), ); - place_local = temp; last_len = p_ref.projection.len(); @@ -58,7 +58,7 @@ impl<'tcx> MutVisitor<'tcx> for DerefChecker<'tcx> { *place = temp_place; } - // We are destroying last temp since it's no longer used. + // We are destroying the previous temp since it's no longer used. if let Some(prev_temp) = prev_temp { self.patcher.add_statement(loc, StatementKind::StorageDead(prev_temp)); } diff --git a/compiler/rustc_mir_transform/src/lib.rs b/compiler/rustc_mir_transform/src/lib.rs index d395ccd381933..40cc6dafe6177 100644 --- a/compiler/rustc_mir_transform/src/lib.rs +++ b/compiler/rustc_mir_transform/src/lib.rs @@ -426,13 +426,13 @@ fn run_post_borrowck_cleanup_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tc &add_moves_for_packed_drops::AddMovesForPackedDrops, // `AddRetag` needs to run after `ElaborateDrops`. Otherwise it should run fairly late, // but before optimizations begin. + &deref_separator::Derefer, &add_retag::AddRetag, &lower_intrinsics::LowerIntrinsics, &simplify::SimplifyCfg::new("elaborate-drops"), // `Deaggregator` is conceptually part of MIR building, some backends rely on it happening // and it can help optimizations. &deaggregator::Deaggregator, - &deref_separator::Derefer, &Lint(const_prop_lint::ConstProp), ]; diff --git a/src/test/mir-opt/derefer_complex_case.main.Derefer.diff b/src/test/mir-opt/derefer_complex_case.main.Derefer.diff index fc20165009143..f5eabf8696796 100644 --- a/src/test/mir-opt/derefer_complex_case.main.Derefer.diff +++ b/src/test/mir-opt/derefer_complex_case.main.Derefer.diff @@ -102,10 +102,10 @@ StorageDead(_6); // scope 1 at $DIR/derefer_complex_case.rs:4:39: 4:40 _5 = const (); // scope 1 at $DIR/derefer_complex_case.rs:4:5: 4:40 goto -> bb2; // scope 1 at $DIR/derefer_complex_case.rs:4:5: 4:40 -+ } -+ -+ bb8 (cleanup): { -+ resume; // scope 0 at $DIR/derefer_complex_case.rs:3:1: 5:2 + } + + bb8 (cleanup): { + resume; // scope 0 at $DIR/derefer_complex_case.rs:3:1: 5:2 } } diff --git a/src/test/mir-opt/derefer_terminator_test.main.Derefer.diff b/src/test/mir-opt/derefer_terminator_test.main.Derefer.diff index 73b9ec4abc55a..8b91a65bf3d7d 100644 --- a/src/test/mir-opt/derefer_terminator_test.main.Derefer.diff +++ b/src/test/mir-opt/derefer_terminator_test.main.Derefer.diff @@ -94,10 +94,10 @@ StorageDead(_2); // scope 1 at $DIR/derefer_terminator_test.rs:10:1: 10:2 StorageDead(_1); // scope 0 at $DIR/derefer_terminator_test.rs:10:1: 10:2 return; // scope 0 at $DIR/derefer_terminator_test.rs:10:2: 10:2 -+ } -+ -+ bb6 (cleanup): { -+ resume; // scope 0 at $DIR/derefer_terminator_test.rs:2:1: 10:2 + } + + bb6 (cleanup): { + resume; // scope 0 at $DIR/derefer_terminator_test.rs:2:1: 10:2 } } diff --git a/src/test/mir-opt/derefer_test.main.Derefer.diff b/src/test/mir-opt/derefer_test.main.Derefer.diff index b2d4abce2947d..84476aeed7a6c 100644 --- a/src/test/mir-opt/derefer_test.main.Derefer.diff +++ b/src/test/mir-opt/derefer_test.main.Derefer.diff @@ -25,15 +25,11 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/derefer_test.rs:3:9: 3:14 - Deinit(_1); // scope 0 at $DIR/derefer_test.rs:3:17: 3:24 - (_1.0: i32) = const 42_i32; // scope 0 at $DIR/derefer_test.rs:3:17: 3:24 - (_1.1: i32) = const 43_i32; // scope 0 at $DIR/derefer_test.rs:3:17: 3:24 + _1 = (const 42_i32, const 43_i32); // scope 0 at $DIR/derefer_test.rs:3:17: 3:24 StorageLive(_2); // scope 1 at $DIR/derefer_test.rs:4:9: 4:14 StorageLive(_3); // scope 1 at $DIR/derefer_test.rs:4:22: 4:28 _3 = &mut _1; // scope 1 at $DIR/derefer_test.rs:4:22: 4:28 - Deinit(_2); // scope 1 at $DIR/derefer_test.rs:4:17: 4:29 - (_2.0: i32) = const 99_i32; // scope 1 at $DIR/derefer_test.rs:4:17: 4:29 - (_2.1: &mut (i32, i32)) = move _3; // scope 1 at $DIR/derefer_test.rs:4:17: 4:29 + _2 = (const 99_i32, move _3); // scope 1 at $DIR/derefer_test.rs:4:17: 4:29 StorageDead(_3); // scope 1 at $DIR/derefer_test.rs:4:28: 4:29 StorageLive(_4); // scope 2 at $DIR/derefer_test.rs:5:9: 5:10 - _4 = &mut ((*(_2.1: &mut (i32, i32))).0: i32); // scope 2 at $DIR/derefer_test.rs:5:13: 5:26 @@ -53,10 +49,10 @@ StorageDead(_2); // scope 1 at $DIR/derefer_test.rs:7:1: 7:2 StorageDead(_1); // scope 0 at $DIR/derefer_test.rs:7:1: 7:2 return; // scope 0 at $DIR/derefer_test.rs:7:2: 7:2 -+ } -+ -+ bb1 (cleanup): { -+ resume; // scope 0 at $DIR/derefer_test.rs:2:1: 7:2 + } + + bb1 (cleanup): { + resume; // scope 0 at $DIR/derefer_test.rs:2:1: 7:2 } } diff --git a/src/test/mir-opt/derefer_test_multiple.main.Derefer.diff b/src/test/mir-opt/derefer_test_multiple.main.Derefer.diff index c48f3ac12c4e1..b8e5a0c328f4d 100644 --- a/src/test/mir-opt/derefer_test_multiple.main.Derefer.diff +++ b/src/test/mir-opt/derefer_test_multiple.main.Derefer.diff @@ -39,29 +39,21 @@ bb0: { StorageLive(_1); // scope 0 at $DIR/derefer_test_multiple.rs:3:9: 3:14 - Deinit(_1); // scope 0 at $DIR/derefer_test_multiple.rs:3:17: 3:25 - (_1.0: i32) = const 42_i32; // scope 0 at $DIR/derefer_test_multiple.rs:3:17: 3:25 - (_1.1: i32) = const 43_i32; // scope 0 at $DIR/derefer_test_multiple.rs:3:17: 3:25 + _1 = (const 42_i32, const 43_i32); // scope 0 at $DIR/derefer_test_multiple.rs:3:17: 3:25 StorageLive(_2); // scope 1 at $DIR/derefer_test_multiple.rs:4:9: 4:14 StorageLive(_3); // scope 1 at $DIR/derefer_test_multiple.rs:4:22: 4:28 _3 = &mut _1; // scope 1 at $DIR/derefer_test_multiple.rs:4:22: 4:28 - Deinit(_2); // scope 1 at $DIR/derefer_test_multiple.rs:4:17: 4:29 - (_2.0: i32) = const 99_i32; // scope 1 at $DIR/derefer_test_multiple.rs:4:17: 4:29 - (_2.1: &mut (i32, i32)) = move _3; // scope 1 at $DIR/derefer_test_multiple.rs:4:17: 4:29 + _2 = (const 99_i32, move _3); // scope 1 at $DIR/derefer_test_multiple.rs:4:17: 4:29 StorageDead(_3); // scope 1 at $DIR/derefer_test_multiple.rs:4:28: 4:29 StorageLive(_4); // scope 2 at $DIR/derefer_test_multiple.rs:5:9: 5:14 StorageLive(_5); // scope 2 at $DIR/derefer_test_multiple.rs:5:22: 5:28 _5 = &mut _2; // scope 2 at $DIR/derefer_test_multiple.rs:5:22: 5:28 - Deinit(_4); // scope 2 at $DIR/derefer_test_multiple.rs:5:17: 5:29 - (_4.0: i32) = const 11_i32; // scope 2 at $DIR/derefer_test_multiple.rs:5:17: 5:29 - (_4.1: &mut (i32, &mut (i32, i32))) = move _5; // scope 2 at $DIR/derefer_test_multiple.rs:5:17: 5:29 + _4 = (const 11_i32, move _5); // scope 2 at $DIR/derefer_test_multiple.rs:5:17: 5:29 StorageDead(_5); // scope 2 at $DIR/derefer_test_multiple.rs:5:28: 5:29 StorageLive(_6); // scope 3 at $DIR/derefer_test_multiple.rs:6:9: 6:14 StorageLive(_7); // scope 3 at $DIR/derefer_test_multiple.rs:6:22: 6:28 _7 = &mut _4; // scope 3 at $DIR/derefer_test_multiple.rs:6:22: 6:28 - Deinit(_6); // scope 3 at $DIR/derefer_test_multiple.rs:6:17: 6:29 - (_6.0: i32) = const 13_i32; // scope 3 at $DIR/derefer_test_multiple.rs:6:17: 6:29 - (_6.1: &mut (i32, &mut (i32, &mut (i32, i32)))) = move _7; // scope 3 at $DIR/derefer_test_multiple.rs:6:17: 6:29 + _6 = (const 13_i32, move _7); // scope 3 at $DIR/derefer_test_multiple.rs:6:17: 6:29 StorageDead(_7); // scope 3 at $DIR/derefer_test_multiple.rs:6:28: 6:29 StorageLive(_8); // scope 4 at $DIR/derefer_test_multiple.rs:7:9: 7:10 - _8 = &mut ((*((*((*(_6.1: &mut (i32, &mut (i32, &mut (i32, i32))))).1: &mut (i32, &mut (i32, i32)))).1: &mut (i32, i32))).1: i32); // scope 4 at $DIR/derefer_test_multiple.rs:7:13: 7:30 @@ -95,10 +87,10 @@ StorageDead(_2); // scope 1 at $DIR/derefer_test_multiple.rs:9:1: 9:2 StorageDead(_1); // scope 0 at $DIR/derefer_test_multiple.rs:9:1: 9:2 return; // scope 0 at $DIR/derefer_test_multiple.rs:9:2: 9:2 -+ } -+ -+ bb1 (cleanup): { -+ resume; // scope 0 at $DIR/derefer_test_multiple.rs:2:1: 9:2 + } + + bb1 (cleanup): { + resume; // scope 0 at $DIR/derefer_test_multiple.rs:2:1: 9:2 } } diff --git a/src/test/mir-opt/early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff b/src/test/mir-opt/early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff index 038a1afc58bb6..e40274dc39340 100644 --- a/src/test/mir-opt/early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff +++ b/src/test/mir-opt/early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff @@ -68,10 +68,8 @@ + bb3: { StorageDead(_3); // scope 0 at $DIR/early_otherwise_branch.rs:8:1: 8:2 return; // scope 0 at $DIR/early_otherwise_branch.rs:8:2: 8:2 - } - -- bb5 (cleanup): { -- resume; // scope 0 at $DIR/early_otherwise_branch.rs:3:1: 8:2 ++ } ++ + bb4: { + StorageDead(_11); // scope 0 at $DIR/early_otherwise_branch.rs:4:5: 4:17 + switchInt(_7) -> [1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/early_otherwise_branch.rs:4:5: 4:17 diff --git a/src/test/mir-opt/early_otherwise_branch.opt2.EarlyOtherwiseBranch.diff b/src/test/mir-opt/early_otherwise_branch.opt2.EarlyOtherwiseBranch.diff index 75549c1b3ddf2..1cdd97ab283bc 100644 --- a/src/test/mir-opt/early_otherwise_branch.opt2.EarlyOtherwiseBranch.diff +++ b/src/test/mir-opt/early_otherwise_branch.opt2.EarlyOtherwiseBranch.diff @@ -82,10 +82,8 @@ + bb4: { StorageDead(_3); // scope 0 at $DIR/early_otherwise_branch.rs:17:1: 17:2 return; // scope 0 at $DIR/early_otherwise_branch.rs:17:2: 17:2 - } - -- bb7 (cleanup): { -- resume; // scope 0 at $DIR/early_otherwise_branch.rs:11:1: 17:2 ++ } ++ + bb5: { + StorageDead(_12); // scope 0 at $DIR/early_otherwise_branch.rs:12:5: 12:17 + switchInt(_8) -> [0_isize: bb3, 1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/early_otherwise_branch.rs:12:5: 12:17 diff --git a/src/test/mir-opt/early_otherwise_branch.opt3.EarlyOtherwiseBranch.diff b/src/test/mir-opt/early_otherwise_branch.opt3.EarlyOtherwiseBranch.diff index 30726d8621e1f..96c7e46853f14 100644 --- a/src/test/mir-opt/early_otherwise_branch.opt3.EarlyOtherwiseBranch.diff +++ b/src/test/mir-opt/early_otherwise_branch.opt3.EarlyOtherwiseBranch.diff @@ -68,10 +68,8 @@ + bb3: { StorageDead(_3); // scope 0 at $DIR/early_otherwise_branch.rs:26:1: 26:2 return; // scope 0 at $DIR/early_otherwise_branch.rs:26:2: 26:2 - } - -- bb5 (cleanup): { -- resume; // scope 0 at $DIR/early_otherwise_branch.rs:21:1: 26:2 ++ } ++ + bb4: { + StorageDead(_11); // scope 0 at $DIR/early_otherwise_branch.rs:22:5: 22:17 + switchInt(_7) -> [1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/early_otherwise_branch.rs:22:5: 22:17 diff --git a/src/test/mir-opt/early_otherwise_branch_3_element_tuple.opt1.EarlyOtherwiseBranch.diff b/src/test/mir-opt/early_otherwise_branch_3_element_tuple.opt1.EarlyOtherwiseBranch.diff index ddf26ad8ab323..379d0e9ea48b3 100644 --- a/src/test/mir-opt/early_otherwise_branch_3_element_tuple.opt1.EarlyOtherwiseBranch.diff +++ b/src/test/mir-opt/early_otherwise_branch_3_element_tuple.opt1.EarlyOtherwiseBranch.diff @@ -90,10 +90,8 @@ + bb4: { StorageDead(_4); // scope 0 at $DIR/early_otherwise_branch_3_element_tuple.rs:9:1: 9:2 return; // scope 0 at $DIR/early_otherwise_branch_3_element_tuple.rs:9:2: 9:2 - } - -- bb6 (cleanup): { -- resume; // scope 0 at $DIR/early_otherwise_branch_3_element_tuple.rs:4:1: 9:2 ++ } ++ + bb5: { + StorageDead(_15); // scope 0 at $DIR/early_otherwise_branch_3_element_tuple.rs:5:5: 5:20 + switchInt(_10) -> [1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/early_otherwise_branch_3_element_tuple.rs:5:5: 5:20 diff --git a/src/test/mir-opt/early_otherwise_branch_noopt.noopt1.EarlyOtherwiseBranch.diff b/src/test/mir-opt/early_otherwise_branch_noopt.noopt1.EarlyOtherwiseBranch.diff index 4d2db490836d8..848f2feb32125 100644 --- a/src/test/mir-opt/early_otherwise_branch_noopt.noopt1.EarlyOtherwiseBranch.diff +++ b/src/test/mir-opt/early_otherwise_branch_noopt.noopt1.EarlyOtherwiseBranch.diff @@ -91,9 +91,5 @@ StorageDead(_3); // scope 0 at $DIR/early_otherwise_branch_noopt.rs:14:1: 14:2 return; // scope 0 at $DIR/early_otherwise_branch_noopt.rs:14:2: 14:2 } - - bb9 (cleanup): { - resume; // scope 0 at $DIR/early_otherwise_branch_noopt.rs:7:1: 14:2 - } } diff --git a/src/test/mir-opt/early_otherwise_branch_soundness.no_deref_ptr.EarlyOtherwiseBranch.diff b/src/test/mir-opt/early_otherwise_branch_soundness.no_deref_ptr.EarlyOtherwiseBranch.diff index 92a719d997d6b..7d42c772f160a 100644 --- a/src/test/mir-opt/early_otherwise_branch_soundness.no_deref_ptr.EarlyOtherwiseBranch.diff +++ b/src/test/mir-opt/early_otherwise_branch_soundness.no_deref_ptr.EarlyOtherwiseBranch.diff @@ -43,9 +43,5 @@ bb5: { return; // scope 0 at $DIR/early_otherwise_branch_soundness.rs:27:2: 27:2 } - - bb6 (cleanup): { - resume; // scope 0 at $DIR/early_otherwise_branch_soundness.rs:18:1: 27:2 - } } diff --git a/src/test/mir-opt/early_otherwise_branch_soundness.no_downcast.EarlyOtherwiseBranch.diff b/src/test/mir-opt/early_otherwise_branch_soundness.no_downcast.EarlyOtherwiseBranch.diff index 3ec5f0f8b3f01..1efaba044ecf1 100644 --- a/src/test/mir-opt/early_otherwise_branch_soundness.no_downcast.EarlyOtherwiseBranch.diff +++ b/src/test/mir-opt/early_otherwise_branch_soundness.no_downcast.EarlyOtherwiseBranch.diff @@ -34,9 +34,5 @@ bb4: { return; // scope 0 at $DIR/early_otherwise_branch_soundness.rs:14:2: 14:2 } - - bb5 (cleanup): { - resume; // scope 0 at $DIR/early_otherwise_branch_soundness.rs:12:1: 14:2 - } } diff --git a/src/test/mir-opt/if_condition_int.dont_opt_bool.SimplifyComparisonIntegral.diff b/src/test/mir-opt/if_condition_int.dont_opt_bool.SimplifyComparisonIntegral.diff index 319a47367b3ab..dddb7acae2b2c 100644 --- a/src/test/mir-opt/if_condition_int.dont_opt_bool.SimplifyComparisonIntegral.diff +++ b/src/test/mir-opt/if_condition_int.dont_opt_bool.SimplifyComparisonIntegral.diff @@ -26,9 +26,5 @@ StorageDead(_2); // scope 0 at $DIR/if-condition-int.rs:17:25: 17:26 return; // scope 0 at $DIR/if-condition-int.rs:18:2: 18:2 } - - bb4 (cleanup): { - resume; // scope 0 at $DIR/if-condition-int.rs:16:1: 18:2 - } } diff --git a/src/test/mir-opt/if_condition_int.dont_opt_floats.SimplifyComparisonIntegral.diff b/src/test/mir-opt/if_condition_int.dont_opt_floats.SimplifyComparisonIntegral.diff index 98a6c83cbffae..2ff8386b205bd 100644 --- a/src/test/mir-opt/if_condition_int.dont_opt_floats.SimplifyComparisonIntegral.diff +++ b/src/test/mir-opt/if_condition_int.dont_opt_floats.SimplifyComparisonIntegral.diff @@ -30,9 +30,5 @@ StorageDead(_2); // scope 0 at $DIR/if-condition-int.rs:53:34: 53:35 return; // scope 0 at $DIR/if-condition-int.rs:54:2: 54:2 } - - bb4 (cleanup): { - resume; // scope 0 at $DIR/if-condition-int.rs:52:1: 54:2 - } } diff --git a/src/test/mir-opt/if_condition_int.dont_remove_comparison.SimplifyComparisonIntegral.diff b/src/test/mir-opt/if_condition_int.dont_remove_comparison.SimplifyComparisonIntegral.diff index 4019021ede8d5..fd4dcb2265e61 100644 --- a/src/test/mir-opt/if_condition_int.dont_remove_comparison.SimplifyComparisonIntegral.diff +++ b/src/test/mir-opt/if_condition_int.dont_remove_comparison.SimplifyComparisonIntegral.diff @@ -54,9 +54,5 @@ StorageDead(_2); // scope 0 at $DIR/if-condition-int.rs:49:1: 49:2 return; // scope 0 at $DIR/if-condition-int.rs:49:2: 49:2 } - - bb4 (cleanup): { - resume; // scope 0 at $DIR/if-condition-int.rs:43:1: 49:2 - } } diff --git a/src/test/mir-opt/if_condition_int.opt_char.SimplifyComparisonIntegral.diff b/src/test/mir-opt/if_condition_int.opt_char.SimplifyComparisonIntegral.diff index d4f100e289f06..40de48385f02e 100644 --- a/src/test/mir-opt/if_condition_int.opt_char.SimplifyComparisonIntegral.diff +++ b/src/test/mir-opt/if_condition_int.opt_char.SimplifyComparisonIntegral.diff @@ -35,9 +35,5 @@ StorageDead(_2); // scope 0 at $DIR/if-condition-int.rs:21:32: 21:33 return; // scope 0 at $DIR/if-condition-int.rs:22:2: 22:2 } - - bb4 (cleanup): { - resume; // scope 0 at $DIR/if-condition-int.rs:20:1: 22:2 - } } diff --git a/src/test/mir-opt/if_condition_int.opt_i8.SimplifyComparisonIntegral.diff b/src/test/mir-opt/if_condition_int.opt_i8.SimplifyComparisonIntegral.diff index 06d2c666aeca6..28c36aed84c38 100644 --- a/src/test/mir-opt/if_condition_int.opt_i8.SimplifyComparisonIntegral.diff +++ b/src/test/mir-opt/if_condition_int.opt_i8.SimplifyComparisonIntegral.diff @@ -35,9 +35,5 @@ StorageDead(_2); // scope 0 at $DIR/if-condition-int.rs:25:31: 25:32 return; // scope 0 at $DIR/if-condition-int.rs:26:2: 26:2 } - - bb4 (cleanup): { - resume; // scope 0 at $DIR/if-condition-int.rs:24:1: 26:2 - } } diff --git a/src/test/mir-opt/if_condition_int.opt_multiple_ifs.SimplifyComparisonIntegral.diff b/src/test/mir-opt/if_condition_int.opt_multiple_ifs.SimplifyComparisonIntegral.diff index a7e4edf40a8d6..55932fee9600c 100644 --- a/src/test/mir-opt/if_condition_int.opt_multiple_ifs.SimplifyComparisonIntegral.diff +++ b/src/test/mir-opt/if_condition_int.opt_multiple_ifs.SimplifyComparisonIntegral.diff @@ -61,9 +61,5 @@ StorageDead(_2); // scope 0 at $DIR/if-condition-int.rs:39:5: 39:6 return; // scope 0 at $DIR/if-condition-int.rs:40:2: 40:2 } - - bb7 (cleanup): { - resume; // scope 0 at $DIR/if-condition-int.rs:32:1: 40:2 - } } diff --git a/src/test/mir-opt/if_condition_int.opt_negative.SimplifyComparisonIntegral.diff b/src/test/mir-opt/if_condition_int.opt_negative.SimplifyComparisonIntegral.diff index 47f69b85e898c..c4574b32a5999 100644 --- a/src/test/mir-opt/if_condition_int.opt_negative.SimplifyComparisonIntegral.diff +++ b/src/test/mir-opt/if_condition_int.opt_negative.SimplifyComparisonIntegral.diff @@ -35,9 +35,5 @@ StorageDead(_2); // scope 0 at $DIR/if-condition-int.rs:29:32: 29:33 return; // scope 0 at $DIR/if-condition-int.rs:30:2: 30:2 } - - bb4 (cleanup): { - resume; // scope 0 at $DIR/if-condition-int.rs:28:1: 30:2 - } } diff --git a/src/test/mir-opt/if_condition_int.opt_u32.SimplifyComparisonIntegral.diff b/src/test/mir-opt/if_condition_int.opt_u32.SimplifyComparisonIntegral.diff index 3920627d52487..88d9d5622b8ec 100644 --- a/src/test/mir-opt/if_condition_int.opt_u32.SimplifyComparisonIntegral.diff +++ b/src/test/mir-opt/if_condition_int.opt_u32.SimplifyComparisonIntegral.diff @@ -35,9 +35,5 @@ StorageDead(_2); // scope 0 at $DIR/if-condition-int.rs:12:31: 12:32 return; // scope 0 at $DIR/if-condition-int.rs:13:2: 13:2 } - - bb4 (cleanup): { - resume; // scope 0 at $DIR/if-condition-int.rs:11:1: 13:2 - } } diff --git a/src/test/mir-opt/lower_array_len.array_bound.NormalizeArrayLen.diff b/src/test/mir-opt/lower_array_len.array_bound.NormalizeArrayLen.diff index 2e03467018693..d6c1c92cd9177 100644 --- a/src/test/mir-opt/lower_array_len.array_bound.NormalizeArrayLen.diff +++ b/src/test/mir-opt/lower_array_len.array_bound.NormalizeArrayLen.diff @@ -64,9 +64,5 @@ StorageDead(_3); // scope 0 at $DIR/lower_array_len.rs:11:5: 11:6 return; // scope 0 at $DIR/lower_array_len.rs:12:2: 12:2 } - - bb6 (cleanup): { - resume; // scope 0 at $DIR/lower_array_len.rs:6:1: 12:2 - } } diff --git a/src/test/mir-opt/lower_array_len.array_bound_mut.NormalizeArrayLen.diff b/src/test/mir-opt/lower_array_len.array_bound_mut.NormalizeArrayLen.diff index 6aa77a9ed6013..11fc20aa693c7 100644 --- a/src/test/mir-opt/lower_array_len.array_bound_mut.NormalizeArrayLen.diff +++ b/src/test/mir-opt/lower_array_len.array_bound_mut.NormalizeArrayLen.diff @@ -77,9 +77,5 @@ StorageDead(_3); // scope 0 at $DIR/lower_array_len.rs:24:5: 24:6 return; // scope 0 at $DIR/lower_array_len.rs:25:2: 25:2 } - - bb7 (cleanup): { - resume; // scope 0 at $DIR/lower_array_len.rs:17:1: 25:2 - } } diff --git a/src/test/mir-opt/lower_array_len.array_len.NormalizeArrayLen.diff b/src/test/mir-opt/lower_array_len.array_len.NormalizeArrayLen.diff index b41582477c692..892fdda818ebd 100644 --- a/src/test/mir-opt/lower_array_len.array_len.NormalizeArrayLen.diff +++ b/src/test/mir-opt/lower_array_len.array_len.NormalizeArrayLen.diff @@ -26,9 +26,5 @@ StorageDead(_2); // scope 0 at $DIR/lower_array_len.rs:31:13: 31:14 return; // scope 0 at $DIR/lower_array_len.rs:32:2: 32:2 } - - bb2 (cleanup): { - resume; // scope 0 at $DIR/lower_array_len.rs:30:1: 32:2 - } } diff --git a/src/test/mir-opt/lower_array_len.array_len_by_value.NormalizeArrayLen.diff b/src/test/mir-opt/lower_array_len.array_len_by_value.NormalizeArrayLen.diff index 92ec7a3633e94..201fffbf0d45a 100644 --- a/src/test/mir-opt/lower_array_len.array_len_by_value.NormalizeArrayLen.diff +++ b/src/test/mir-opt/lower_array_len.array_len_by_value.NormalizeArrayLen.diff @@ -26,9 +26,5 @@ StorageDead(_2); // scope 0 at $DIR/lower_array_len.rs:38:13: 38:14 return; // scope 0 at $DIR/lower_array_len.rs:39:2: 39:2 } - - bb2 (cleanup): { - resume; // scope 0 at $DIR/lower_array_len.rs:37:1: 39:2 - } } diff --git a/src/test/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.diff b/src/test/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.diff index 2210ad54e8d3d..13241d882f210 100644 --- a/src/test/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.diff +++ b/src/test/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.diff @@ -59,9 +59,5 @@ StorageDead(_3); // scope 0 at $DIR/lower_slice_len.rs:9:5: 9:6 return; // scope 0 at $DIR/lower_slice_len.rs:10:2: 10:2 } - - bb6 (cleanup): { - resume; // scope 0 at $DIR/lower_slice_len.rs:4:1: 10:2 - } } diff --git a/src/test/mir-opt/nrvo_simple.nrvo.RenameReturnPlace.diff b/src/test/mir-opt/nrvo_simple.nrvo.RenameReturnPlace.diff index e07af6d598311..f438eaa002780 100644 --- a/src/test/mir-opt/nrvo_simple.nrvo.RenameReturnPlace.diff +++ b/src/test/mir-opt/nrvo_simple.nrvo.RenameReturnPlace.diff @@ -39,9 +39,5 @@ - StorageDead(_2); // scope 0 at $DIR/nrvo-simple.rs:8:1: 8:2 return; // scope 0 at $DIR/nrvo-simple.rs:8:2: 8:2 } - - bb2 (cleanup): { - resume; // scope 0 at $DIR/nrvo-simple.rs:4:1: 8:2 - } } diff --git a/src/test/mir-opt/uninhabited_fallthrough_elimination.eliminate_fallthrough.UninhabitedEnumBranching.diff b/src/test/mir-opt/uninhabited_fallthrough_elimination.eliminate_fallthrough.UninhabitedEnumBranching.diff index 868eeb6367e33..7e843b65e88fc 100644 --- a/src/test/mir-opt/uninhabited_fallthrough_elimination.eliminate_fallthrough.UninhabitedEnumBranching.diff +++ b/src/test/mir-opt/uninhabited_fallthrough_elimination.eliminate_fallthrough.UninhabitedEnumBranching.diff @@ -9,7 +9,7 @@ bb0: { _2 = discriminant(_1); // scope 0 at $DIR/uninhabited_fallthrough_elimination.rs:22:11: 22:12 - switchInt(move _2) -> [1_isize: bb3, 2_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/uninhabited_fallthrough_elimination.rs:22:5: 22:12 -+ switchInt(move _2) -> [1_isize: bb3, 2_isize: bb2, otherwise: bb6]; // scope 0 at $DIR/uninhabited_fallthrough_elimination.rs:22:5: 22:12 ++ switchInt(move _2) -> [1_isize: bb3, 2_isize: bb2, otherwise: bb5]; // scope 0 at $DIR/uninhabited_fallthrough_elimination.rs:22:5: 22:12 } bb1: { @@ -29,13 +29,9 @@ bb4: { return; // scope 0 at $DIR/uninhabited_fallthrough_elimination.rs:27:2: 27:2 - } - - bb5 (cleanup): { - resume; // scope 0 at $DIR/uninhabited_fallthrough_elimination.rs:21:1: 27:2 + } + -+ bb6: { ++ bb5: { + unreachable; // scope 0 at $DIR/uninhabited_fallthrough_elimination.rs:25:14: 25:15 } } diff --git a/src/test/mir-opt/uninhabited_fallthrough_elimination.keep_fallthrough.UninhabitedEnumBranching.diff b/src/test/mir-opt/uninhabited_fallthrough_elimination.keep_fallthrough.UninhabitedEnumBranching.diff index 33c1458dc0c17..5da011d427a2c 100644 --- a/src/test/mir-opt/uninhabited_fallthrough_elimination.keep_fallthrough.UninhabitedEnumBranching.diff +++ b/src/test/mir-opt/uninhabited_fallthrough_elimination.keep_fallthrough.UninhabitedEnumBranching.diff @@ -30,9 +30,5 @@ bb4: { return; // scope 0 at $DIR/uninhabited_fallthrough_elimination.rs:18:2: 18:2 } - - bb5 (cleanup): { - resume; // scope 0 at $DIR/uninhabited_fallthrough_elimination.rs:12:1: 18:2 - } } diff --git a/src/test/mir-opt/unreachable.main.UnreachablePropagation.diff b/src/test/mir-opt/unreachable.main.UnreachablePropagation.diff index 380844f8861f6..08312bde20f51 100644 --- a/src/test/mir-opt/unreachable.main.UnreachablePropagation.diff +++ b/src/test/mir-opt/unreachable.main.UnreachablePropagation.diff @@ -64,10 +64,6 @@ _0 = const (); // scope 0 at $DIR/unreachable.rs:19:6: 19:6 StorageDead(_1); // scope 0 at $DIR/unreachable.rs:20:1: 20:2 return; // scope 0 at $DIR/unreachable.rs:20:2: 20:2 -- } -- -- bb7 (cleanup): { -- resume; // scope 0 at $DIR/unreachable.rs:8:1: 20:2 } } diff --git a/src/test/mir-opt/unreachable_diverging.main.UnreachablePropagation.diff b/src/test/mir-opt/unreachable_diverging.main.UnreachablePropagation.diff index e26990b1def89..e5867ccfc5cb6 100644 --- a/src/test/mir-opt/unreachable_diverging.main.UnreachablePropagation.diff +++ b/src/test/mir-opt/unreachable_diverging.main.UnreachablePropagation.diff @@ -69,10 +69,6 @@ StorageDead(_1); // scope 0 at $DIR/unreachable_diverging.rs:20:1: 20:2 StorageDead(_2); // scope 0 at $DIR/unreachable_diverging.rs:20:1: 20:2 return; // scope 0 at $DIR/unreachable_diverging.rs:20:2: 20:2 -- } -- -- bb7 (cleanup): { -- resume; // scope 0 at $DIR/unreachable_diverging.rs:12:1: 20:2 } } From 4d4b0f140fe4ec77cbee3cf86520630d954981e8 Mon Sep 17 00:00:00 2001 From: ouz-a Date: Fri, 29 Apr 2022 18:29:38 +0300 Subject: [PATCH 2/3] remove and bless --- compiler/rustc_middle/src/mir/mod.rs | 4 ---- compiler/rustc_mir_transform/src/add_retag.rs | 4 ++-- src/test/run-make/const_fn_mir/dump.mir | 4 ---- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index e042e57acf1f5..42a205fad75cf 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -1180,10 +1180,6 @@ impl<'tcx> LocalDecl<'tcx> { } } - pub fn temp(mut self) { - self.local_info = Some(Box::new(LocalInfo::Temp)); - } - /// Converts `self` into same `LocalDecl` except tagged as internal. #[inline] pub fn internal(mut self) -> Self { diff --git a/compiler/rustc_mir_transform/src/add_retag.rs b/compiler/rustc_mir_transform/src/add_retag.rs index ff4cd47732672..825340892d99e 100644 --- a/compiler/rustc_mir_transform/src/add_retag.rs +++ b/compiler/rustc_mir_transform/src/add_retag.rs @@ -59,8 +59,8 @@ fn may_be_reference(ty: Ty<'_>) -> bool { /// Determines whether or not this LocalDecl is temp, if not it needs retagging. fn is_not_temp<'tcx>(local_decl: &LocalDecl<'tcx>) -> bool { - if local_decl.local_info.is_some() { - match local_decl.local_info.as_ref().unwrap().as_ref() { + if let Some(local_info) = &local_decl.local_info { + match local_info.as_ref() { LocalInfo::Temp => return false, _ => (), }; diff --git a/src/test/run-make/const_fn_mir/dump.mir b/src/test/run-make/const_fn_mir/dump.mir index 4e8936905c440..f02bccc4b2da5 100644 --- a/src/test/run-make/const_fn_mir/dump.mir +++ b/src/test/run-make/const_fn_mir/dump.mir @@ -23,10 +23,6 @@ fn foo() -> i32 { _0 = move (_1.0: i32); // scope 0 at main.rs:5:5: 5:10 return; // scope 0 at main.rs:6:2: 6:2 } - - bb2 (cleanup): { - resume; // scope 0 at main.rs:4:1: 6:2 - } } fn main() -> () { From d9ddb6446dd2bc1591698754e5bd096a78b55595 Mon Sep 17 00:00:00 2001 From: ouz-a Date: Sun, 1 May 2022 15:38:22 +0300 Subject: [PATCH 3/3] re-name stuff --- compiler/rustc_middle/src/mir/mod.rs | 2 +- compiler/rustc_middle/src/mir/patch.rs | 14 ++++++++------ compiler/rustc_mir_transform/src/add_retag.rs | 2 +- .../rustc_mir_transform/src/deref_separator.rs | 7 +++++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index 42a205fad75cf..990efa7d09df7 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -1080,7 +1080,7 @@ pub enum LocalInfo<'tcx> { /// (e.g. a temporary for `foo` in `MyStruct { my_field: foo }`) AggregateTemp, /// A temporary created during the pass `Derefer` to avoid it's retagging - Temp, + DerefTemp, } impl<'tcx> LocalDecl<'tcx> { diff --git a/compiler/rustc_middle/src/mir/patch.rs b/compiler/rustc_middle/src/mir/patch.rs index 708ea53eb1ac2..d03f9235efd58 100644 --- a/compiler/rustc_middle/src/mir/patch.rs +++ b/compiler/rustc_middle/src/mir/patch.rs @@ -78,20 +78,22 @@ impl<'tcx> MirPatch<'tcx> { Location { block: bb, statement_index: offset } } - pub fn new_local_temp(&mut self, ty: Ty<'tcx>, span: Span) -> Local { + pub fn new_local_with_info( + &mut self, + ty: Ty<'tcx>, + span: Span, + local_info: Option>>, + ) -> Local { let index = self.next_local; self.next_local += 1; let mut new_decl = LocalDecl::new(ty, span); - new_decl.local_info = Some(Box::new(LocalInfo::Temp)); + new_decl.local_info = local_info; self.new_locals.push(new_decl); Local::new(index as usize) } pub fn new_temp(&mut self, ty: Ty<'tcx>, span: Span) -> Local { - let index = self.next_local; - self.next_local += 1; - self.new_locals.push(LocalDecl::new(ty, span)); - Local::new(index as usize) + self.new_local_with_info(ty, span, None) } pub fn new_internal(&mut self, ty: Ty<'tcx>, span: Span) -> Local { diff --git a/compiler/rustc_mir_transform/src/add_retag.rs b/compiler/rustc_mir_transform/src/add_retag.rs index 825340892d99e..a245da658b975 100644 --- a/compiler/rustc_mir_transform/src/add_retag.rs +++ b/compiler/rustc_mir_transform/src/add_retag.rs @@ -61,7 +61,7 @@ fn may_be_reference(ty: Ty<'_>) -> bool { fn is_not_temp<'tcx>(local_decl: &LocalDecl<'tcx>) -> bool { if let Some(local_info) = &local_decl.local_info { match local_info.as_ref() { - LocalInfo::Temp => return false, + LocalInfo::DerefTemp => return false, _ => (), }; } diff --git a/compiler/rustc_mir_transform/src/deref_separator.rs b/compiler/rustc_mir_transform/src/deref_separator.rs index afaab6e9a35d0..57a95a67df70c 100644 --- a/compiler/rustc_mir_transform/src/deref_separator.rs +++ b/compiler/rustc_mir_transform/src/deref_separator.rs @@ -33,8 +33,11 @@ impl<'tcx> MutVisitor<'tcx> for DerefChecker<'tcx> { for (idx, (p_ref, p_elem)) in place.iter_projections().enumerate() { if p_elem == ProjectionElem::Deref && !p_ref.projection.is_empty() { let ty = p_ref.ty(&self.local_decls, self.tcx).ty; - let temp = - self.patcher.new_local_temp(ty, self.local_decls[p_ref.local].source_info.span); + let temp = self.patcher.new_local_with_info( + ty, + self.local_decls[p_ref.local].source_info.span, + Some(Box::new(LocalInfo::DerefTemp)), + ); self.patcher.add_statement(loc, StatementKind::StorageLive(temp));