about summary refs log tree commit diff
path: root/compiler/rustc_mir_dataflow/src/move_paths
diff options
context:
space:
mode:
authorouz-a <oguz.agcayazi@gmail.com>2022-07-24 14:40:43 +0300
committerouz-a <oguz.agcayazi@gmail.com>2022-07-24 14:40:43 +0300
commit09134982e53830a4268a95b57fda2b9e39c1908b (patch)
tree3f33c1658c58a8b5302e0be5f424ce9cdf4e8211 /compiler/rustc_mir_dataflow/src/move_paths
parentb4c3a2af7ba0199e99de8ef64a3b112824efebb6 (diff)
downloadrust-09134982e53830a4268a95b57fda2b9e39c1908b.tar.gz
rust-09134982e53830a4268a95b57fda2b9e39c1908b.zip
optimize un_derefer
Diffstat (limited to 'compiler/rustc_mir_dataflow/src/move_paths')
-rw-r--r--compiler/rustc_mir_dataflow/src/move_paths/builder.rs17
-rw-r--r--compiler/rustc_mir_dataflow/src/move_paths/mod.rs5
2 files changed, 18 insertions, 4 deletions
diff --git a/compiler/rustc_mir_dataflow/src/move_paths/builder.rs b/compiler/rustc_mir_dataflow/src/move_paths/builder.rs
index 19aa71d7bc7..462429d1a22 100644
--- a/compiler/rustc_mir_dataflow/src/move_paths/builder.rs
+++ b/compiler/rustc_mir_dataflow/src/move_paths/builder.rs
@@ -1,4 +1,5 @@
 use crate::un_derefer::UnDerefer;
+use rustc_data_structures::stable_map::FxHashMap;
 use rustc_index::vec::IndexVec;
 use rustc_middle::mir::tcx::RvalueInitializationState;
 use rustc_middle::mir::*;
@@ -209,7 +210,10 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> {
 impl<'a, 'tcx> MoveDataBuilder<'a, 'tcx> {
     fn finalize(
         self,
-    ) -> Result<MoveData<'tcx>, (MoveData<'tcx>, Vec<(Place<'tcx>, MoveError<'tcx>)>)> {
+    ) -> Result<
+        (FxHashMap<rustc_middle::mir::Local, rustc_middle::mir::Place<'tcx>>, MoveData<'tcx>),
+        (MoveData<'tcx>, Vec<(Place<'tcx>, MoveError<'tcx>)>),
+    > {
         debug!("{}", {
             debug!("moves for {:?}:", self.body.span);
             for (j, mo) in self.data.moves.iter_enumerated() {
@@ -222,7 +226,11 @@ impl<'a, 'tcx> MoveDataBuilder<'a, 'tcx> {
             "done dumping moves"
         });
 
-        if !self.errors.is_empty() { Err((self.data, self.errors)) } else { Ok(self.data) }
+        if !self.errors.is_empty() {
+            Err((self.data, self.errors))
+        } else {
+            Ok((self.un_derefer.derefer_sidetable.clone(), self.data))
+        }
     }
 }
 
@@ -230,7 +238,10 @@ pub(super) fn gather_moves<'tcx>(
     body: &Body<'tcx>,
     tcx: TyCtxt<'tcx>,
     param_env: ty::ParamEnv<'tcx>,
-) -> Result<MoveData<'tcx>, (MoveData<'tcx>, Vec<(Place<'tcx>, MoveError<'tcx>)>)> {
+) -> Result<
+    (FxHashMap<rustc_middle::mir::Local, rustc_middle::mir::Place<'tcx>>, MoveData<'tcx>),
+    (MoveData<'tcx>, Vec<(Place<'tcx>, MoveError<'tcx>)>),
+> {
     let mut builder = MoveDataBuilder::new(body, tcx, param_env);
 
     builder.gather_args();
diff --git a/compiler/rustc_mir_dataflow/src/move_paths/mod.rs b/compiler/rustc_mir_dataflow/src/move_paths/mod.rs
index 1af789b4885..b6050a1ccaa 100644
--- a/compiler/rustc_mir_dataflow/src/move_paths/mod.rs
+++ b/compiler/rustc_mir_dataflow/src/move_paths/mod.rs
@@ -386,7 +386,10 @@ impl<'tcx> MoveData<'tcx> {
         body: &Body<'tcx>,
         tcx: TyCtxt<'tcx>,
         param_env: ParamEnv<'tcx>,
-    ) -> Result<Self, (Self, Vec<(Place<'tcx>, MoveError<'tcx>)>)> {
+    ) -> Result<
+        (FxHashMap<rustc_middle::mir::Local, rustc_middle::mir::Place<'tcx>>, MoveData<'tcx>),
+        (MoveData<'tcx>, Vec<(Place<'tcx>, MoveError<'tcx>)>),
+    > {
         builder::gather_moves(body, tcx, param_env)
     }