From 2524a89ecd735edecd64c1dbd3201e12810da668 Mon Sep 17 00:00:00 2001 From: pierwill Date: Thu, 7 Jul 2022 12:58:43 -0500 Subject: [PATCH 1/6] iterate over localdecls --- compiler/rustc_mir_dataflow/src/storage.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/compiler/rustc_mir_dataflow/src/storage.rs b/compiler/rustc_mir_dataflow/src/storage.rs index 566c9d2d5054e..cebfa735cddb3 100644 --- a/compiler/rustc_mir_dataflow/src/storage.rs +++ b/compiler/rustc_mir_dataflow/src/storage.rs @@ -1,5 +1,5 @@ use rustc_index::bit_set::BitSet; -use rustc_middle::mir::{self, Local}; +use rustc_middle::mir::{self, HasLocalDecls, Local}; /// The set of locals in a MIR body that do not have `StorageLive`/`StorageDead` annotations. /// @@ -10,12 +10,9 @@ use rustc_middle::mir::{self, Local}; pub fn always_storage_live_locals(body: &mir::Body<'_>) -> BitSet { let mut always_live_locals = BitSet::new_filled(body.local_decls.len()); - for block in body.basic_blocks() { - for statement in &block.statements { - use mir::StatementKind::{StorageDead, StorageLive}; - if let StorageLive(l) | StorageDead(l) = statement.kind { - always_live_locals.remove(l); - } + for local in body.local_decls() { + if !local.always_storage_live { + always_live_locals.remove(local); } } From 7c5c3464de83f871857ae30f800c0974554b3f3f Mon Sep 17 00:00:00 2001 From: pierwill Date: Thu, 7 Jul 2022 13:04:39 -0500 Subject: [PATCH 2/6] add storage liveness field --- compiler/rustc_middle/src/mir/mod.rs | 3 +++ compiler/rustc_middle/src/mir/visit.rs | 1 + 2 files changed, 4 insertions(+) diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index 26314e3fe8eac..b24ce794563b0 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -824,6 +824,8 @@ pub struct LocalDecl<'tcx> { /// │ │← `drop(x)` // This accesses `x: u32`. /// ``` pub source_info: SourceInfo, + + pub always_storage_live: bool, } // `LocalDecl` is used a lot. Make sure it doesn't unintentionally get bigger. @@ -949,6 +951,7 @@ impl<'tcx> LocalDecl<'tcx> { ty, user_ty: None, source_info, + always_storage_live: false, } } diff --git a/compiler/rustc_middle/src/mir/visit.rs b/compiler/rustc_middle/src/mir/visit.rs index 0ecb83996a8af..a7fe46cdfe4f9 100644 --- a/compiler/rustc_middle/src/mir/visit.rs +++ b/compiler/rustc_middle/src/mir/visit.rs @@ -867,6 +867,7 @@ macro_rules! make_mir_visitor { internal: _, local_info: _, is_block_tail: _, + always_storage_live: _, } = local_decl; self.visit_ty($(& $mutability)? *ty, TyContext::LocalDecl { From 1ca39d89534bc603605635c6558cd9a1327665c1 Mon Sep 17 00:00:00 2001 From: pierwill Date: Thu, 7 Jul 2022 15:11:19 -0500 Subject: [PATCH 3/6] Iterate through localdecls properly Add liveness flag where missing --- Cargo.lock | 67 +++++++++++++++---- .../rustc_mir_build/src/build/matches/mod.rs | 2 + compiler/rustc_mir_dataflow/src/storage.rs | 9 +-- src/tools/cargo | 2 +- src/tools/miri | 2 +- src/tools/rust-installer | 2 +- 6 files changed, 63 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2bf07149cc86c..116e587b22bf0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -307,7 +307,7 @@ dependencies = [ "cargo-test-macro", "cargo-test-support", "cargo-util", - "clap", + "clap 3.2.5", "crates-io", "crossbeam-utils", "curl", @@ -572,6 +572,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", + "yaml-rust 0.3.5", +] + [[package]] name = "clap" version = "3.2.5" @@ -584,9 +600,9 @@ dependencies = [ "clap_lex", "indexmap", "once_cell", - "strsim", + "strsim 0.10.0", "termcolor", - "textwrap", + "textwrap 0.15.0", ] [[package]] @@ -595,7 +611,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df6f3613c0a3cddfd78b41b10203eb322cb29b600cbdf808a7d3db95691b8e25" dependencies = [ - "clap", + "clap 3.2.5", ] [[package]] @@ -653,7 +669,7 @@ name = "clippy_dev" version = "0.0.1" dependencies = [ "aho-corasick", - "clap", + "clap 3.2.5", "indoc", "itertools", "opener", @@ -1226,7 +1242,7 @@ name = "expand-yaml-anchors" version = "0.1.0" dependencies = [ "yaml-merge-keys", - "yaml-rust", + "yaml-rust 0.4.4", ] [[package]] @@ -1846,7 +1862,7 @@ name = "installer" version = "0.0.0" dependencies = [ "anyhow", - "clap", + "clap 2.34.0", "flate2", "lazy_static", "num_cpus", @@ -2294,7 +2310,7 @@ dependencies = [ "ammonia", "anyhow", "chrono", - "clap", + "clap 3.2.5", "clap_complete", "elasticlunr-rs", "env_logger 0.7.1", @@ -3369,7 +3385,7 @@ dependencies = [ name = "rustbook" version = "0.1.0" dependencies = [ - "clap", + "clap 3.2.5", "env_logger 0.7.1", "mdbook", ] @@ -3457,7 +3473,7 @@ version = "1.0.0" dependencies = [ "bstr", "byteorder", - "clap", + "clap 3.2.5", "crossbeam-utils", "libc", "libz-sys", @@ -4646,7 +4662,7 @@ dependencies = [ "anyhow", "bytecount", "cargo_metadata", - "clap", + "clap 3.2.5", "derive-new", "diff", "dirs", @@ -5037,6 +5053,12 @@ dependencies = [ "vte", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.10.0" @@ -5177,6 +5199,15 @@ dependencies = [ "term", ] +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "textwrap" version = "0.15.0" @@ -5697,6 +5728,12 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "vergen" version = "5.1.0" @@ -5855,9 +5892,15 @@ checksum = "fd236a7dc9bb598f349fe4a8754f49181fee50284daa15cd1ba652d722280004" dependencies = [ "lazy_static", "thiserror", - "yaml-rust", + "yaml-rust 0.4.4", ] +[[package]] +name = "yaml-rust" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992" + [[package]] name = "yaml-rust" version = "0.4.4" diff --git a/compiler/rustc_mir_build/src/build/matches/mod.rs b/compiler/rustc_mir_build/src/build/matches/mod.rs index 1628f1a4b850b..2ee8ba692d6e3 100644 --- a/compiler/rustc_mir_build/src/build/matches/mod.rs +++ b/compiler/rustc_mir_build/src/build/matches/mod.rs @@ -2241,6 +2241,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { pat_span, }, ))))), + always_storage_live: false, }; let for_arm_body = self.local_decls.push(local); self.var_debug_info.push(VarDebugInfo { @@ -2261,6 +2262,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { local_info: Some(Box::new(LocalInfo::User(ClearCrossCrate::Set( BindingForm::RefForGuard, )))), + always_storage_live: false, }); self.var_debug_info.push(VarDebugInfo { name, diff --git a/compiler/rustc_mir_dataflow/src/storage.rs b/compiler/rustc_mir_dataflow/src/storage.rs index cebfa735cddb3..9019bcd136edd 100644 --- a/compiler/rustc_mir_dataflow/src/storage.rs +++ b/compiler/rustc_mir_dataflow/src/storage.rs @@ -4,14 +4,11 @@ use rustc_middle::mir::{self, HasLocalDecls, Local}; /// 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`. -pub fn always_storage_live_locals(body: &mir::Body<'_>) -> BitSet { +pub fn always_live_locals(body: &mir::Body<'_>) -> BitSet { let mut always_live_locals = BitSet::new_filled(body.local_decls.len()); - for local in body.local_decls() { - if !local.always_storage_live { + for (local, local_decl) in body.local_decls().iter_enumerated() { + if !local_decl.always_storage_live { always_live_locals.remove(local); } } diff --git a/src/tools/cargo b/src/tools/cargo index b1dd22e668af5..c0bbd42ce5e83 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit b1dd22e668af5279e13a071ad4b17435bd6bfa4c +Subproject commit c0bbd42ce5e83fe2a93e817c3f9b955492d3130a diff --git a/src/tools/miri b/src/tools/miri index cde87d18239b8..f76ebd6feb9f5 160000 --- a/src/tools/miri +++ b/src/tools/miri @@ -1 +1 @@ -Subproject commit cde87d18239b8d9afa9c6bf1051bf5573dbf326e +Subproject commit f76ebd6feb9f59be993336f84ecfdc441ad33d81 diff --git a/src/tools/rust-installer b/src/tools/rust-installer index 300b5ec61ef38..5254dbfd25d52 160000 --- a/src/tools/rust-installer +++ b/src/tools/rust-installer @@ -1 +1 @@ -Subproject commit 300b5ec61ef38855a07e6bb4955a37aa1c414c00 +Subproject commit 5254dbfd25d5284728ab624dca1969d61427a0db From 3bdc317bc2c1cc41ed279ebd38f5a452ba8e85e1 Mon Sep 17 00:00:00 2001 From: pierwill Date: Thu, 7 Jul 2022 15:15:09 -0500 Subject: [PATCH 4/6] Add docs --- compiler/rustc_middle/src/mir/mod.rs | 2 ++ compiler/rustc_mir_dataflow/src/storage.rs | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index b24ce794563b0..3bd233ce95ee8 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -825,6 +825,8 @@ pub struct LocalDecl<'tcx> { /// ``` pub source_info: SourceInfo, + /// `true` if the local has a fixed storage for the duration of the body + /// (that is, it does not have `StorageLive`/`StorageDead` annotations). pub always_storage_live: bool, } diff --git a/compiler/rustc_mir_dataflow/src/storage.rs b/compiler/rustc_mir_dataflow/src/storage.rs index 9019bcd136edd..8fc447821d3b6 100644 --- a/compiler/rustc_mir_dataflow/src/storage.rs +++ b/compiler/rustc_mir_dataflow/src/storage.rs @@ -1,7 +1,8 @@ use rustc_index::bit_set::BitSet; use rustc_middle::mir::{self, HasLocalDecls, Local}; -/// The set of locals in a MIR body that do not have `StorageLive`/`StorageDead` annotations. +/// Returns 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. pub fn always_live_locals(body: &mir::Body<'_>) -> BitSet { From 335315a24ccb5b360a612e003b98c0cce6a711cd Mon Sep 17 00:00:00 2001 From: pierwill Date: Thu, 7 Jul 2022 15:49:59 -0500 Subject: [PATCH 5/6] Add flag in build as_rvalue --- compiler/rustc_mir_build/src/build/expr/as_rvalue.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs b/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs index 15f2d17c4e08b..0311b5f226ec3 100644 --- a/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs +++ b/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs @@ -601,7 +601,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let this = self; let source_info = this.source_info(upvar_span); - let temp = this.local_decls.push(LocalDecl::new(upvar_ty, upvar_span)); + let mut decl = LocalDecl::new(upvar_ty, upvar_span); + decl.always_storage_live = true; // this will be StorageLive below + let temp = this.local_decls.push(decl); this.cfg.push(block, Statement { source_info, kind: StatementKind::StorageLive(temp) }); From bca392850075c04b6a15b73a1a9611fdeb8e5a3b Mon Sep 17 00:00:00 2001 From: pierwill Date: Thu, 7 Jul 2022 15:55:00 -0500 Subject: [PATCH 6/6] Revert "Add flag in build as_rvalue" This reverts commit a313dba20f1449f227e2fe0be20b7c48fd4de13b. --- compiler/rustc_mir_build/src/build/expr/as_rvalue.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs b/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs index 0311b5f226ec3..15f2d17c4e08b 100644 --- a/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs +++ b/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs @@ -601,9 +601,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let this = self; let source_info = this.source_info(upvar_span); - let mut decl = LocalDecl::new(upvar_ty, upvar_span); - decl.always_storage_live = true; // this will be StorageLive below - let temp = this.local_decls.push(decl); + let temp = this.local_decls.push(LocalDecl::new(upvar_ty, upvar_span)); this.cfg.push(block, Statement { source_info, kind: StatementKind::StorageLive(temp) });