-
Notifications
You must be signed in to change notification settings - Fork 13k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #70447 - ecstatic-morse:storage-live-always, r=tmandry
Add utility to find locals that don't use `StorageLive` annotations and use it for `MaybeStorageLive` Addresses #70004 (comment) (cc @RalfJung). The only dataflow analysis that is incorrect in this case is `MaybeStorageLive`. `transform/generator.rs` implemented custom handling for this class of locals, but other consumers of this analysis (there's one in [clippy](https://github.com/rust-lang/rust-clippy/blob/513b46793e98ce5b412d388a91f6371d6a9b290b/clippy_lints/src/redundant_clone.rs#L402)) would be incorrect. r? @tmandry
- Loading branch information
Showing
5 changed files
with
116 additions
and
48 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
use rustc_index::bit_set::BitSet; | ||
use rustc_middle::mir::visit::Visitor; | ||
use rustc_middle::mir::{self, Local, Location}; | ||
|
||
/// The set of locals in a MIR body that do not have `StorageLive`/`StorageDead` annotations. | ||
/// | ||
/// These locals have fixed storage for the duration of the body. | ||
// | ||
// FIXME: Currently, we need to traverse the entire MIR to compute this. We should instead store it | ||
// as a field in the `LocalDecl` for each `Local`. | ||
#[derive(Debug, Clone)] | ||
pub struct AlwaysLiveLocals(BitSet<Local>); | ||
|
||
impl AlwaysLiveLocals { | ||
pub fn new(body: &mir::Body<'tcx>) -> Self { | ||
let mut ret = AlwaysLiveLocals(BitSet::new_filled(body.local_decls.len())); | ||
|
||
let mut vis = StorageAnnotationVisitor(&mut ret); | ||
vis.visit_body(body); | ||
|
||
ret | ||
} | ||
|
||
pub fn into_inner(self) -> BitSet<Local> { | ||
self.0 | ||
} | ||
} | ||
|
||
impl std::ops::Deref for AlwaysLiveLocals { | ||
type Target = BitSet<Local>; | ||
|
||
fn deref(&self) -> &Self::Target { | ||
&self.0 | ||
} | ||
} | ||
|
||
/// Removes locals that have `Storage*` annotations from `AlwaysLiveLocals`. | ||
struct StorageAnnotationVisitor<'a>(&'a mut AlwaysLiveLocals); | ||
|
||
impl Visitor<'tcx> for StorageAnnotationVisitor<'_> { | ||
fn visit_statement(&mut self, statement: &mir::Statement<'tcx>, _location: Location) { | ||
use mir::StatementKind::{StorageDead, StorageLive}; | ||
if let StorageLive(l) | StorageDead(l) = statement.kind { | ||
(self.0).0.remove(l); | ||
} | ||
} | ||
} |