@@ -153,6 +153,9 @@ fn propagate_ssa<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
153153    state. next_opaque  = None ; 
154154
155155    let  reverse_postorder = body. basic_blocks . reverse_postorder ( ) . to_vec ( ) ; 
156+     for  dbg in  body. var_debug_info . iter_mut ( )  { 
157+         state. visit_var_debug_info ( dbg) ; 
158+     } 
156159    for  bb in  reverse_postorder { 
157160        let  data = & mut  body. basic_blocks . as_mut_preserves_cfg ( ) [ bb] ; 
158161        state. visit_basic_block_data ( bb,  data) ; 
@@ -1221,6 +1224,51 @@ impl<'tcx> MutVisitor<'tcx> for VnState<'_, 'tcx> {
12211224        self . tcx 
12221225    } 
12231226
1227+     fn  visit_var_debug_info ( & mut  self ,  var_debug_info :  & mut  VarDebugInfo < ' tcx > )  { 
1228+         let  mut  replace_dereffed = |place :  & mut  Place < ' tcx > | -> Option < !>  { 
1229+             let  last_deref = place. projection . iter ( ) . rposition ( |e| e == PlaceElem :: Deref ) ?; 
1230+ 
1231+             // Another place that holds the same value. 
1232+             let  mut  place_ref = place. as_ref ( ) ; 
1233+             let  mut  value = self . locals [ place. local ] ?; 
1234+ 
1235+             for  ( index,  & proj)  in  place. projection [ ..last_deref] . iter ( ) . enumerate ( )  { 
1236+                 if  let  Some ( candidates)  = self . rev_locals . get ( value) 
1237+                     && let  Some ( & local)  = candidates. first ( ) 
1238+                 { 
1239+                     place_ref = PlaceRef  {  local,  projection :  & place. projection [ index..]  } ; 
1240+                 } 
1241+ 
1242+                 let  place_upto =
1243+                     PlaceRef  {  local :  place. local ,  projection :  & place. projection [ ..index]  } ; 
1244+                 if  let  Some ( projected)  = self . project ( place_upto,  value,  proj)  { 
1245+                     value = projected; 
1246+                 }  else  { 
1247+                     if  place_ref. projection . len ( )  < place. projection . len ( )  { 
1248+                         * place = place_ref. project_deeper ( & [ ] ,  self . tcx ) ; 
1249+                     } 
1250+                     return  None ; 
1251+                 } 
1252+             } 
1253+ 
1254+             if  let  Some ( candidates)  = self . rev_locals . get ( value) 
1255+                 && let  Some ( & local)  = candidates. first ( ) 
1256+             { 
1257+                 let  place_ref = PlaceRef  {  local,  projection :  & place. projection [ last_deref..]  } ; 
1258+                 * place = place_ref. project_deeper ( & [ ] ,  self . tcx ) ; 
1259+             } 
1260+ 
1261+             return  None ; 
1262+         } ; 
1263+ 
1264+         match  & mut  var_debug_info. value  { 
1265+             VarDebugInfoContents :: Const ( _)  => { } 
1266+             VarDebugInfoContents :: Place ( place)  => { 
1267+                 replace_dereffed ( place) ; 
1268+             } 
1269+         } 
1270+     } 
1271+ 
12241272    fn  visit_place ( & mut  self ,  place :  & mut  Place < ' tcx > ,  _:  PlaceContext ,  location :  Location )  { 
12251273        self . simplify_place_projection ( place,  location) ; 
12261274    } 
0 commit comments