diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2023-05-07 12:09:06 +0000 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2023-05-09 17:59:35 +0000 |
| commit | a67bf08ed79936fdf9b06d2c8d22fbeb60e55505 (patch) | |
| tree | b064d1065d6eb661dc1e15ef9c8f624f86d30fb2 | |
| parent | 3b4e1fe10460db3c6fe26947a9b8c7ac039540f6 (diff) | |
| download | rust-a67bf08ed79936fdf9b06d2c8d22fbeb60e55505.tar.gz rust-a67bf08ed79936fdf9b06d2c8d22fbeb60e55505.zip | |
Only check storage liveness for direct projections.
| -rw-r--r-- | compiler/rustc_mir_transform/src/ref_prop.rs | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/compiler/rustc_mir_transform/src/ref_prop.rs b/compiler/rustc_mir_transform/src/ref_prop.rs index 9afbae9d8d1..dafd2ae23a6 100644 --- a/compiler/rustc_mir_transform/src/ref_prop.rs +++ b/compiler/rustc_mir_transform/src/ref_prop.rs @@ -163,18 +163,15 @@ fn compute_replacement<'tcx>( }; let mut can_perform_opt = |target: Place<'tcx>, loc: Location| { - maybe_dead.seek_after_primary_effect(loc); - let maybe_dead = maybe_dead.contains(target.local); - if target.projection.first() == Some(&PlaceElem::Deref) { // We are creating a reborrow. As `place.local` is a reference, removing the storage // statements should not make it much harder for LLVM to optimize. - if maybe_dead { - storage_to_remove.insert(target.local); - } + storage_to_remove.insert(target.local); true } else { // This is a proper dereference. We can only allow it if `target` is live. + maybe_dead.seek_after_primary_effect(loc); + let maybe_dead = maybe_dead.contains(target.local); !maybe_dead } }; |
