@@ -153,6 +153,9 @@ fn propagate_ssa<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
153
153
state. next_opaque = None ;
154
154
155
155
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
+ }
156
159
for bb in reverse_postorder {
157
160
let data = & mut body. basic_blocks . as_mut_preserves_cfg ( ) [ bb] ;
158
161
state. visit_basic_block_data ( bb, data) ;
@@ -1221,6 +1224,51 @@ impl<'tcx> MutVisitor<'tcx> for VnState<'_, 'tcx> {
1221
1224
self . tcx
1222
1225
}
1223
1226
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
+
1224
1272
fn visit_place ( & mut self , place : & mut Place < ' tcx > , _: PlaceContext , location : Location ) {
1225
1273
self . simplify_place_projection ( place, location) ;
1226
1274
}
0 commit comments