Use Body
everywhere
This commit is contained in:
parent
64db428967
commit
8287842eb4
53 changed files with 224 additions and 317 deletions
|
@ -152,7 +152,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
|
|||
// a loop.
|
||||
fn maybe_sideeffect<Bx: BuilderMethods<'a, 'tcx>>(
|
||||
&self,
|
||||
mir: mir::ReadOnlyBodyAndCache<'tcx, 'tcx>,
|
||||
mir: &'tcx mir::Body<'tcx>,
|
||||
bx: &mut Bx,
|
||||
targets: &[mir::BasicBlock],
|
||||
) {
|
||||
|
|
|
@ -21,7 +21,7 @@ use self::operand::{OperandRef, OperandValue};
|
|||
pub struct FunctionCx<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> {
|
||||
instance: Instance<'tcx>,
|
||||
|
||||
mir: mir::ReadOnlyBodyAndCache<'tcx, 'tcx>,
|
||||
mir: &'tcx mir::Body<'tcx>,
|
||||
|
||||
debug_context: Option<FunctionDebugContext<Bx::DIScope>>,
|
||||
|
||||
|
@ -169,7 +169,6 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
.collect();
|
||||
|
||||
let (landing_pads, funclets) = create_funclets(&mir, &mut bx, &cleanup_kinds, &block_bxs);
|
||||
let mir_body: &mir::Body<'_> = *mir;
|
||||
let mut fx = FunctionCx {
|
||||
instance,
|
||||
mir,
|
||||
|
@ -197,7 +196,7 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
let args = arg_local_refs(&mut bx, &mut fx, &memory_locals);
|
||||
|
||||
let mut allocate_local = |local| {
|
||||
let decl = &mir_body.local_decls[local];
|
||||
let decl = &mir.local_decls[local];
|
||||
let layout = bx.layout_of(fx.monomorphize(&decl.ty));
|
||||
assert!(!layout.ty.has_erasable_regions());
|
||||
|
||||
|
@ -223,7 +222,7 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
let retptr = allocate_local(mir::RETURN_PLACE);
|
||||
iter::once(retptr)
|
||||
.chain(args.into_iter())
|
||||
.chain(mir_body.vars_and_temps_iter().map(allocate_local))
|
||||
.chain(mir.vars_and_temps_iter().map(allocate_local))
|
||||
.collect()
|
||||
};
|
||||
|
||||
|
@ -235,8 +234,8 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
bx.br(fx.blocks[mir::START_BLOCK]);
|
||||
}
|
||||
|
||||
let rpo = traversal::reverse_postorder(&mir_body);
|
||||
let mut visited = BitSet::new_empty(mir_body.basic_blocks().len());
|
||||
let rpo = traversal::reverse_postorder(&mir);
|
||||
let mut visited = BitSet::new_empty(mir.basic_blocks().len());
|
||||
|
||||
// Codegen the body of each block using reverse postorder
|
||||
for (bb, _) in rpo {
|
||||
|
@ -246,7 +245,7 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
|
||||
// Remove blocks that haven't been visited, or have no
|
||||
// predecessors.
|
||||
for bb in mir_body.basic_blocks().indices() {
|
||||
for bb in mir.basic_blocks().indices() {
|
||||
// Unreachable block
|
||||
if !visited.contains(bb.index()) {
|
||||
debug!("codegen_mir: block {:?} was not visited", bb);
|
||||
|
|
|
@ -26,7 +26,7 @@ use rustc_middle::middle::cstore::{CrateSource, ExternCrate};
|
|||
use rustc_middle::middle::cstore::{ForeignModule, LinkagePreference, NativeLibrary};
|
||||
use rustc_middle::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel};
|
||||
use rustc_middle::mir::interpret::{AllocDecodingSession, AllocDecodingState};
|
||||
use rustc_middle::mir::{self, interpret, BodyAndCache, Promoted};
|
||||
use rustc_middle::mir::{self, interpret, Body, Promoted};
|
||||
use rustc_middle::ty::codec::TyDecoder;
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
use rustc_middle::util::common::record_time;
|
||||
|
@ -1099,9 +1099,8 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
!self.is_proc_macro(id) && self.root.tables.mir.get(self, id).is_some()
|
||||
}
|
||||
|
||||
fn get_optimized_mir(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> BodyAndCache<'tcx> {
|
||||
let mut cache = self
|
||||
.root
|
||||
fn get_optimized_mir(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> Body<'tcx> {
|
||||
self.root
|
||||
.tables
|
||||
.mir
|
||||
.get(self, id)
|
||||
|
@ -1109,18 +1108,11 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
.unwrap_or_else(|| {
|
||||
bug!("get_optimized_mir: missing MIR for `{:?}`", self.local_def_id(id))
|
||||
})
|
||||
.decode((self, tcx));
|
||||
cache.ensure_predecessors();
|
||||
cache
|
||||
.decode((self, tcx))
|
||||
}
|
||||
|
||||
fn get_promoted_mir(
|
||||
&self,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
id: DefIndex,
|
||||
) -> IndexVec<Promoted, BodyAndCache<'tcx>> {
|
||||
let mut cache = self
|
||||
.root
|
||||
fn get_promoted_mir(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> IndexVec<Promoted, Body<'tcx>> {
|
||||
self.root
|
||||
.tables
|
||||
.promoted_mir
|
||||
.get(self, id)
|
||||
|
@ -1128,11 +1120,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
.unwrap_or_else(|| {
|
||||
bug!("get_promoted_mir: missing MIR for `{:?}`", self.local_def_id(id))
|
||||
})
|
||||
.decode((self, tcx));
|
||||
for body in cache.iter_mut() {
|
||||
body.ensure_predecessors();
|
||||
}
|
||||
cache
|
||||
.decode((self, tcx))
|
||||
}
|
||||
|
||||
fn mir_const_qualif(&self, id: DefIndex) -> mir::ConstQualifs {
|
||||
|
|
|
@ -275,8 +275,8 @@ define_tables! {
|
|||
// Also, as an optimization, a missing entry indicates an empty `&[]`.
|
||||
inferred_outlives: Table<DefIndex, Lazy!(&'tcx [(ty::Predicate<'tcx>, Span)])>,
|
||||
super_predicates: Table<DefIndex, Lazy!(ty::GenericPredicates<'tcx>)>,
|
||||
mir: Table<DefIndex, Lazy!(mir::BodyAndCache<'tcx>)>,
|
||||
promoted_mir: Table<DefIndex, Lazy!(IndexVec<mir::Promoted, mir::BodyAndCache<'tcx>>)>,
|
||||
mir: Table<DefIndex, Lazy!(mir::Body<'tcx>)>,
|
||||
promoted_mir: Table<DefIndex, Lazy!(IndexVec<mir::Promoted, mir::Body<'tcx>>)>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, RustcEncodable, RustcDecodable)]
|
||||
|
|
|
@ -15,17 +15,17 @@ macro_rules! arena_types {
|
|||
[] generics: rustc_middle::ty::Generics,
|
||||
[] trait_def: rustc_middle::ty::TraitDef,
|
||||
[] adt_def: rustc_middle::ty::AdtDef,
|
||||
[] steal_mir: rustc_middle::ty::steal::Steal<rustc_middle::mir::BodyAndCache<$tcx>>,
|
||||
[] mir: rustc_middle::mir::BodyAndCache<$tcx>,
|
||||
[] steal_mir: rustc_middle::ty::steal::Steal<rustc_middle::mir::Body<$tcx>>,
|
||||
[] mir: rustc_middle::mir::Body<$tcx>,
|
||||
[] steal_promoted: rustc_middle::ty::steal::Steal<
|
||||
rustc_index::vec::IndexVec<
|
||||
rustc_middle::mir::Promoted,
|
||||
rustc_middle::mir::BodyAndCache<$tcx>
|
||||
rustc_middle::mir::Body<$tcx>
|
||||
>
|
||||
>,
|
||||
[] promoted: rustc_index::vec::IndexVec<
|
||||
rustc_middle::mir::Promoted,
|
||||
rustc_middle::mir::BodyAndCache<$tcx>
|
||||
rustc_middle::mir::Body<$tcx>
|
||||
>,
|
||||
[decode] tables: rustc_middle::ty::TypeckTables<$tcx>,
|
||||
[decode] borrowck_result: rustc_middle::mir::BorrowCheckResult<$tcx>,
|
||||
|
|
|
@ -65,15 +65,6 @@ use rustc_span::Span;
|
|||
// variant argument) that does not require visiting, as in
|
||||
// `is_cleanup` above.
|
||||
|
||||
macro_rules! body_type {
|
||||
(mut $tcx:lifetime) => {
|
||||
&mut BodyAndCache<$tcx>
|
||||
};
|
||||
($tcx:lifetime) => {
|
||||
&Body<$tcx>
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! make_mir_visitor {
|
||||
($visitor_trait_name:ident, $($mutability:ident)?) => {
|
||||
pub trait $visitor_trait_name<'tcx> {
|
||||
|
@ -82,7 +73,7 @@ macro_rules! make_mir_visitor {
|
|||
|
||||
fn visit_body(
|
||||
&mut self,
|
||||
body: body_type!($($mutability)? 'tcx)
|
||||
body: &$($mutability)? Body<'tcx>,
|
||||
) {
|
||||
self.super_body(body);
|
||||
}
|
||||
|
@ -254,7 +245,7 @@ macro_rules! make_mir_visitor {
|
|||
|
||||
fn super_body(
|
||||
&mut self,
|
||||
$($mutability)? body: body_type!($($mutability)? 'tcx)
|
||||
body: &$($mutability)? Body<'tcx>,
|
||||
) {
|
||||
let span = body.span;
|
||||
if let Some(yield_ty) = &$($mutability)? body.yield_ty {
|
||||
|
@ -275,7 +266,6 @@ macro_rules! make_mir_visitor {
|
|||
self.visit_basic_block_data(bb, data);
|
||||
}
|
||||
|
||||
let body: & $($mutability)? Body<'_> = & $($mutability)? body;
|
||||
for scope in &$($mutability)? body.source_scopes {
|
||||
self.visit_source_scope_data(scope);
|
||||
}
|
||||
|
@ -819,10 +809,14 @@ macro_rules! make_mir_visitor {
|
|||
|
||||
fn visit_location(
|
||||
&mut self,
|
||||
body: body_type!($($mutability)? 'tcx),
|
||||
body: &$($mutability)? Body<'tcx>,
|
||||
location: Location
|
||||
) {
|
||||
let basic_block = & $($mutability)? body[location.block];
|
||||
macro_rules! basic_blocks {
|
||||
(mut) => (body.basic_blocks_mut());
|
||||
() => (body.basic_blocks());
|
||||
};
|
||||
let basic_block = & $($mutability)? basic_blocks!($($mutability)?)[location.block];
|
||||
if basic_block.statements.len() == location.statement_index {
|
||||
if let Some(ref $($mutability)? terminator) = basic_block.terminator {
|
||||
self.visit_terminator(terminator, location)
|
||||
|
|
|
@ -170,7 +170,7 @@ rustc_queries! {
|
|||
|
||||
/// Fetch the MIR for a given `DefId` right after it's built - this includes
|
||||
/// unreachable code.
|
||||
query mir_built(_: DefId) -> &'tcx Steal<mir::BodyAndCache<'tcx>> {
|
||||
query mir_built(_: DefId) -> &'tcx Steal<mir::Body<'tcx>> {
|
||||
desc { "building MIR for" }
|
||||
}
|
||||
|
||||
|
@ -178,48 +178,38 @@ rustc_queries! {
|
|||
/// ready for const evaluation.
|
||||
///
|
||||
/// See the README for the `mir` module for details.
|
||||
query mir_const(_: DefId) -> &'tcx Steal<mir::BodyAndCache<'tcx>> {
|
||||
query mir_const(_: DefId) -> &'tcx Steal<mir::Body<'tcx>> {
|
||||
no_hash
|
||||
}
|
||||
|
||||
query mir_validated(_: DefId) ->
|
||||
(
|
||||
&'tcx Steal<mir::BodyAndCache<'tcx>>,
|
||||
&'tcx Steal<IndexVec<mir::Promoted, mir::BodyAndCache<'tcx>>>
|
||||
&'tcx Steal<mir::Body<'tcx>>,
|
||||
&'tcx Steal<IndexVec<mir::Promoted, mir::Body<'tcx>>>
|
||||
) {
|
||||
no_hash
|
||||
}
|
||||
|
||||
/// MIR after our optimization passes have run. This is MIR that is ready
|
||||
/// for codegen. This is also the only query that can fetch non-local MIR, at present.
|
||||
query optimized_mir(key: DefId) -> &'tcx mir::BodyAndCache<'tcx> {
|
||||
query optimized_mir(key: DefId) -> &'tcx mir::Body<'tcx> {
|
||||
cache_on_disk_if { key.is_local() }
|
||||
load_cached(tcx, id) {
|
||||
let mir: Option<crate::mir::BodyAndCache<'tcx>>
|
||||
let mir: Option<crate::mir::Body<'tcx>>
|
||||
= tcx.queries.on_disk_cache.try_load_query_result(tcx, id);
|
||||
mir.map(|x| {
|
||||
let cache = tcx.arena.alloc(x);
|
||||
cache.ensure_predecessors();
|
||||
&*cache
|
||||
})
|
||||
mir.map(|x| &*tcx.arena.alloc(x))
|
||||
}
|
||||
}
|
||||
|
||||
query promoted_mir(key: DefId) -> &'tcx IndexVec<mir::Promoted, mir::BodyAndCache<'tcx>> {
|
||||
query promoted_mir(key: DefId) -> &'tcx IndexVec<mir::Promoted, mir::Body<'tcx>> {
|
||||
cache_on_disk_if { key.is_local() }
|
||||
load_cached(tcx, id) {
|
||||
let promoted: Option<
|
||||
rustc_index::vec::IndexVec<
|
||||
crate::mir::Promoted,
|
||||
crate::mir::BodyAndCache<'tcx>
|
||||
crate::mir::Body<'tcx>
|
||||
>> = tcx.queries.on_disk_cache.try_load_query_result(tcx, id);
|
||||
promoted.map(|p| {
|
||||
let cache = tcx.arena.alloc(p);
|
||||
for body in cache.iter_mut() {
|
||||
body.ensure_predecessors();
|
||||
}
|
||||
&*cache
|
||||
})
|
||||
promoted.map(|p| &*tcx.arena.alloc(p))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -618,7 +608,7 @@ rustc_queries! {
|
|||
/// in the case of closures, this will be redirected to the enclosing function.
|
||||
query region_scope_tree(_: DefId) -> &'tcx region::ScopeTree {}
|
||||
|
||||
query mir_shims(key: ty::InstanceDef<'tcx>) -> &'tcx mir::BodyAndCache<'tcx> {
|
||||
query mir_shims(key: ty::InstanceDef<'tcx>) -> &'tcx mir::Body<'tcx> {
|
||||
desc { |tcx| "generating MIR shim for `{}`", tcx.def_path_str(key.def_id()) }
|
||||
}
|
||||
|
||||
|
|
|
@ -14,9 +14,7 @@ use crate::middle::cstore::EncodedMetadata;
|
|||
use crate::middle::resolve_lifetime::{self, ObjectLifetimeDefault};
|
||||
use crate::middle::stability;
|
||||
use crate::mir::interpret::{Allocation, ConstValue, Scalar};
|
||||
use crate::mir::{
|
||||
interpret, BodyAndCache, Field, Local, Place, PlaceElem, ProjectionKind, Promoted,
|
||||
};
|
||||
use crate::mir::{interpret, Body, Field, Local, Place, PlaceElem, ProjectionKind, Promoted};
|
||||
use crate::traits;
|
||||
use crate::traits::{Clause, Clauses, Goal, GoalKind, Goals};
|
||||
use crate::ty::query;
|
||||
|
@ -993,21 +991,21 @@ pub struct GlobalCtxt<'tcx> {
|
|||
}
|
||||
|
||||
impl<'tcx> TyCtxt<'tcx> {
|
||||
pub fn alloc_steal_mir(self, mir: BodyAndCache<'tcx>) -> &'tcx Steal<BodyAndCache<'tcx>> {
|
||||
pub fn alloc_steal_mir(self, mir: Body<'tcx>) -> &'tcx Steal<Body<'tcx>> {
|
||||
self.arena.alloc(Steal::new(mir))
|
||||
}
|
||||
|
||||
pub fn alloc_steal_promoted(
|
||||
self,
|
||||
promoted: IndexVec<Promoted, BodyAndCache<'tcx>>,
|
||||
) -> &'tcx Steal<IndexVec<Promoted, BodyAndCache<'tcx>>> {
|
||||
promoted: IndexVec<Promoted, Body<'tcx>>,
|
||||
) -> &'tcx Steal<IndexVec<Promoted, Body<'tcx>>> {
|
||||
self.arena.alloc(Steal::new(promoted))
|
||||
}
|
||||
|
||||
pub fn intern_promoted(
|
||||
self,
|
||||
promoted: IndexVec<Promoted, BodyAndCache<'tcx>>,
|
||||
) -> &'tcx IndexVec<Promoted, BodyAndCache<'tcx>> {
|
||||
promoted: IndexVec<Promoted, Body<'tcx>>,
|
||||
) -> &'tcx IndexVec<Promoted, Body<'tcx>> {
|
||||
self.arena.alloc(promoted)
|
||||
}
|
||||
|
||||
|
|
|
@ -11,8 +11,8 @@ use crate::infer::canonical::Canonical;
|
|||
use crate::middle::cstore::CrateStoreDyn;
|
||||
use crate::middle::resolve_lifetime::ObjectLifetimeDefault;
|
||||
use crate::mir::interpret::ErrorHandled;
|
||||
use crate::mir::Body;
|
||||
use crate::mir::GeneratorLayout;
|
||||
use crate::mir::ReadOnlyBodyAndCache;
|
||||
use crate::traits::{self, Reveal};
|
||||
use crate::ty;
|
||||
use crate::ty::subst::{InternalSubsts, Subst, SubstsRef};
|
||||
|
@ -2808,9 +2808,9 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
}
|
||||
|
||||
/// Returns the possibly-auto-generated MIR of a `(DefId, Subst)` pair.
|
||||
pub fn instance_mir(self, instance: ty::InstanceDef<'tcx>) -> ReadOnlyBodyAndCache<'tcx, 'tcx> {
|
||||
pub fn instance_mir(self, instance: ty::InstanceDef<'tcx>) -> &'tcx Body<'tcx> {
|
||||
match instance {
|
||||
ty::InstanceDef::Item(did) => self.optimized_mir(did).unwrap_read_only(),
|
||||
ty::InstanceDef::Item(did) => self.optimized_mir(did),
|
||||
ty::InstanceDef::VtableShim(..)
|
||||
| ty::InstanceDef::ReifyShim(..)
|
||||
| ty::InstanceDef::Intrinsic(..)
|
||||
|
@ -2818,7 +2818,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
| ty::InstanceDef::Virtual(..)
|
||||
| ty::InstanceDef::ClosureOnceShim { .. }
|
||||
| ty::InstanceDef::DropGlue(..)
|
||||
| ty::InstanceDef::CloneShim(..) => self.mir_shims(instance).unwrap_read_only(),
|
||||
| ty::InstanceDef::CloneShim(..) => self.mir_shims(instance),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ use rustc_index::bit_set::BitSet;
|
|||
use rustc_index::vec::IndexVec;
|
||||
use rustc_middle::mir::traversal;
|
||||
use rustc_middle::mir::visit::{MutatingUseContext, NonUseContext, PlaceContext, Visitor};
|
||||
use rustc_middle::mir::{self, Body, Local, Location, ReadOnlyBodyAndCache};
|
||||
use rustc_middle::mir::{self, Body, Local, Location};
|
||||
use rustc_middle::ty::{RegionVid, TyCtxt};
|
||||
use std::fmt;
|
||||
use std::ops::Index;
|
||||
|
@ -90,7 +90,7 @@ crate enum LocalsStateAtExit {
|
|||
impl LocalsStateAtExit {
|
||||
fn build(
|
||||
locals_are_invalidated_at_exit: bool,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
move_data: &MoveData<'tcx>,
|
||||
) -> Self {
|
||||
struct HasStorageDead(BitSet<Local>);
|
||||
|
@ -122,7 +122,7 @@ impl LocalsStateAtExit {
|
|||
impl<'tcx> BorrowSet<'tcx> {
|
||||
pub fn build(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
locals_are_invalidated_at_exit: bool,
|
||||
move_data: &MoveData<'tcx>,
|
||||
) -> Self {
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
use either::Either;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_errors::{Applicability, DiagnosticBuilder};
|
||||
use rustc_hir as hir;
|
||||
|
@ -1262,8 +1263,23 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
}
|
||||
|
||||
fn get_moved_indexes(&mut self, location: Location, mpi: MovePathIndex) -> Vec<MoveSite> {
|
||||
fn predecessor_locations(
|
||||
body: &'a mir::Body<'tcx>,
|
||||
location: Location,
|
||||
) -> impl Iterator<Item = Location> + 'a {
|
||||
if location.statement_index == 0 {
|
||||
let predecessors = body.predecessors_for(location.block).to_vec();
|
||||
Either::Left(predecessors.into_iter().map(move |bb| body.terminator_loc(bb)))
|
||||
} else {
|
||||
Either::Right(std::iter::once(Location {
|
||||
statement_index: location.statement_index - 1,
|
||||
..location
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
let mut stack = Vec::new();
|
||||
stack.extend(self.body.predecessor_locations(location).map(|predecessor| {
|
||||
stack.extend(predecessor_locations(self.body, location).map(|predecessor| {
|
||||
let is_back_edge = location.dominates(predecessor, &self.dominators);
|
||||
(predecessor, is_back_edge)
|
||||
}));
|
||||
|
@ -1345,7 +1361,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
continue 'dfs;
|
||||
}
|
||||
|
||||
stack.extend(self.body.predecessor_locations(location).map(|predecessor| {
|
||||
stack.extend(predecessor_locations(self.body, location).map(|predecessor| {
|
||||
let back_edge = location.dominates(predecessor, &self.dominators);
|
||||
(predecessor, is_back_edge || back_edge)
|
||||
}));
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use rustc_data_structures::graph::dominators::Dominators;
|
||||
use rustc_middle::mir::visit::Visitor;
|
||||
use rustc_middle::mir::TerminatorKind;
|
||||
use rustc_middle::mir::{BasicBlock, Body, Location, Place, ReadOnlyBodyAndCache, Rvalue};
|
||||
use rustc_middle::mir::{BasicBlock, Body, Location, Place, Rvalue};
|
||||
use rustc_middle::mir::{BorrowKind, Mutability, Operand};
|
||||
use rustc_middle::mir::{Statement, StatementKind};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
|
@ -18,7 +18,7 @@ pub(super) fn generate_invalidates<'tcx>(
|
|||
tcx: TyCtxt<'tcx>,
|
||||
all_facts: &mut Option<AllFacts>,
|
||||
location_table: &LocationTable,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
borrow_set: &BorrowSet<'tcx>,
|
||||
) {
|
||||
if all_facts.is_none() {
|
||||
|
@ -37,7 +37,7 @@ pub(super) fn generate_invalidates<'tcx>(
|
|||
body: &body,
|
||||
dominators,
|
||||
};
|
||||
ig.visit_body(&body);
|
||||
ig.visit_body(body);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,8 +10,8 @@ use rustc_index::bit_set::BitSet;
|
|||
use rustc_index::vec::IndexVec;
|
||||
use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
|
||||
use rustc_middle::mir::{
|
||||
read_only, traversal, Body, BodyAndCache, ClearCrossCrate, Local, Location, Mutability,
|
||||
Operand, Place, PlaceElem, PlaceRef, ReadOnlyBodyAndCache,
|
||||
traversal, Body, ClearCrossCrate, Local, Location, Mutability, Operand, Place, PlaceElem,
|
||||
PlaceRef,
|
||||
};
|
||||
use rustc_middle::mir::{AggregateKind, BasicBlock, BorrowCheckResult, BorrowKind};
|
||||
use rustc_middle::mir::{Field, ProjectionElem, Promoted, Rvalue, Statement, StatementKind};
|
||||
|
@ -106,7 +106,7 @@ fn mir_borrowck(tcx: TyCtxt<'_>, def_id: DefId) -> &BorrowCheckResult<'_> {
|
|||
fn do_mir_borrowck<'a, 'tcx>(
|
||||
infcx: &InferCtxt<'a, 'tcx>,
|
||||
input_body: &Body<'tcx>,
|
||||
input_promoted: &IndexVec<Promoted, BodyAndCache<'tcx>>,
|
||||
input_promoted: &IndexVec<Promoted, Body<'tcx>>,
|
||||
def_id: DefId,
|
||||
) -> BorrowCheckResult<'tcx> {
|
||||
debug!("do_mir_borrowck(def_id = {:?})", def_id);
|
||||
|
@ -168,13 +168,11 @@ fn do_mir_borrowck<'a, 'tcx>(
|
|||
// requires first making our own copy of the MIR. This copy will
|
||||
// be modified (in place) to contain non-lexical lifetimes. It
|
||||
// will have a lifetime tied to the inference context.
|
||||
let body_clone: Body<'tcx> = input_body.clone();
|
||||
let mut body = input_body.clone();
|
||||
let mut promoted = input_promoted.clone();
|
||||
let mut body = BodyAndCache::new(body_clone);
|
||||
let free_regions =
|
||||
nll::replace_regions_in_mir(infcx, def_id, param_env, &mut body, &mut promoted);
|
||||
let body = read_only!(body); // no further changes
|
||||
let promoted: IndexVec<_, _> = promoted.iter_mut().map(|body| read_only!(body)).collect();
|
||||
let body = &body; // no further changes
|
||||
|
||||
let location_table = &LocationTable::new(&body);
|
||||
|
||||
|
@ -415,7 +413,7 @@ fn do_mir_borrowck<'a, 'tcx>(
|
|||
|
||||
crate struct MirBorrowckCtxt<'cx, 'tcx> {
|
||||
crate infcx: &'cx InferCtxt<'cx, 'tcx>,
|
||||
body: ReadOnlyBodyAndCache<'cx, 'tcx>,
|
||||
body: &'cx Body<'tcx>,
|
||||
mir_def_id: DefId,
|
||||
move_data: &'cx MoveData<'tcx>,
|
||||
|
||||
|
@ -952,7 +950,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
let mut error_reported = false;
|
||||
let tcx = self.infcx.tcx;
|
||||
let body = self.body;
|
||||
let body: &Body<'_> = &body;
|
||||
let borrow_set = self.borrow_set.clone();
|
||||
|
||||
// Use polonius output if it has been enabled.
|
||||
|
|
|
@ -6,8 +6,8 @@ use rustc_hir::def_id::DefId;
|
|||
use rustc_index::vec::IndexVec;
|
||||
use rustc_infer::infer::InferCtxt;
|
||||
use rustc_middle::mir::{
|
||||
BasicBlock, Body, BodyAndCache, ClosureOutlivesSubject, ClosureRegionRequirements, LocalKind,
|
||||
Location, Promoted, ReadOnlyBodyAndCache,
|
||||
BasicBlock, Body, ClosureOutlivesSubject, ClosureRegionRequirements, LocalKind, Location,
|
||||
Promoted,
|
||||
};
|
||||
use rustc_middle::ty::{self, RegionKind, RegionVid};
|
||||
use rustc_span::symbol::sym;
|
||||
|
@ -60,8 +60,8 @@ pub(in crate::borrow_check) fn replace_regions_in_mir<'cx, 'tcx>(
|
|||
infcx: &InferCtxt<'cx, 'tcx>,
|
||||
def_id: DefId,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
promoted: &mut IndexVec<Promoted, BodyAndCache<'tcx>>,
|
||||
body: &mut Body<'tcx>,
|
||||
promoted: &mut IndexVec<Promoted, Body<'tcx>>,
|
||||
) -> UniversalRegions<'tcx> {
|
||||
debug!("replace_regions_in_mir(def_id={:?})", def_id);
|
||||
|
||||
|
@ -159,8 +159,8 @@ pub(in crate::borrow_check) fn compute_regions<'cx, 'tcx>(
|
|||
infcx: &InferCtxt<'cx, 'tcx>,
|
||||
def_id: DefId,
|
||||
universal_regions: UniversalRegions<'tcx>,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
promoted: &IndexVec<Promoted, ReadOnlyBodyAndCache<'_, 'tcx>>,
|
||||
body: &Body<'tcx>,
|
||||
promoted: &IndexVec<Promoted, Body<'tcx>>,
|
||||
location_table: &LocationTable,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
flow_inits: &mut ResultsCursor<'cx, 'tcx, MaybeInitializedPlaces<'cx, 'tcx>>,
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
use super::MirBorrowckCtxt;
|
||||
|
||||
use rustc_hir as hir;
|
||||
use rustc_middle::mir::{Place, PlaceRef, ProjectionElem, ReadOnlyBodyAndCache};
|
||||
use rustc_middle::mir::{Body, Place, PlaceRef, ProjectionElem};
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
|
||||
pub trait IsPrefixOf<'tcx> {
|
||||
|
@ -26,7 +26,7 @@ impl<'tcx> IsPrefixOf<'tcx> for PlaceRef<'tcx> {
|
|||
}
|
||||
|
||||
pub(super) struct Prefixes<'cx, 'tcx> {
|
||||
body: ReadOnlyBodyAndCache<'cx, 'tcx>,
|
||||
body: &'cx Body<'tcx>,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
kind: PrefixSet,
|
||||
next: Option<PlaceRef<'tcx>>,
|
||||
|
|
|
@ -2,7 +2,7 @@ use rustc_data_structures::fx::FxHashMap;
|
|||
use rustc_index::bit_set::{HybridBitSet, SparseBitMatrix};
|
||||
use rustc_index::vec::Idx;
|
||||
use rustc_index::vec::IndexVec;
|
||||
use rustc_middle::mir::{BasicBlock, Body, Location, ReadOnlyBodyAndCache};
|
||||
use rustc_middle::mir::{BasicBlock, Body, Location};
|
||||
use rustc_middle::ty::{self, RegionVid};
|
||||
use std::fmt::Debug;
|
||||
use std::rc::Rc;
|
||||
|
@ -80,7 +80,7 @@ impl RegionValueElements {
|
|||
/// Pushes all predecessors of `index` onto `stack`.
|
||||
crate fn push_predecessors(
|
||||
&self,
|
||||
body: ReadOnlyBodyAndCache<'_, '_>,
|
||||
body: &Body<'_>,
|
||||
index: PointIndex,
|
||||
stack: &mut Vec<PointIndex>,
|
||||
) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use rustc_index::vec::IndexVec;
|
||||
use rustc_infer::infer::{InferCtxt, NLLRegionVariableOrigin};
|
||||
use rustc_middle::mir::visit::{MutVisitor, TyContext};
|
||||
use rustc_middle::mir::{BodyAndCache, Location, PlaceElem, Promoted};
|
||||
use rustc_middle::mir::{Body, Location, PlaceElem, Promoted};
|
||||
use rustc_middle::ty::subst::SubstsRef;
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable};
|
||||
|
||||
|
@ -9,8 +9,8 @@ use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable};
|
|||
/// inference variables, returning the number of variables created.
|
||||
pub fn renumber_mir<'tcx>(
|
||||
infcx: &InferCtxt<'_, 'tcx>,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
promoted: &mut IndexVec<Promoted, BodyAndCache<'tcx>>,
|
||||
body: &mut Body<'tcx>,
|
||||
promoted: &mut IndexVec<Promoted, Body<'tcx>>,
|
||||
) {
|
||||
debug!("renumber_mir()");
|
||||
debug!("renumber_mir: body.arg_count={:?}", body.arg_count);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use rustc_data_structures::vec_linked_list as vll;
|
||||
use rustc_index::vec::IndexVec;
|
||||
use rustc_middle::mir::visit::{PlaceContext, Visitor};
|
||||
use rustc_middle::mir::{Local, Location, ReadOnlyBodyAndCache};
|
||||
use rustc_middle::mir::{Body, Local, Location};
|
||||
|
||||
use crate::util::liveness::{categorize, DefUse};
|
||||
|
||||
|
@ -62,7 +62,7 @@ impl LocalUseMap {
|
|||
crate fn build(
|
||||
live_locals: &Vec<Local>,
|
||||
elements: &RegionValueElements,
|
||||
body: ReadOnlyBodyAndCache<'_, '_>,
|
||||
body: &Body<'_>,
|
||||
) -> Self {
|
||||
let nones = IndexVec::from_elem_n(None, body.local_decls.len());
|
||||
let mut local_use_map = LocalUseMap {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_middle::mir::{Body, Local, ReadOnlyBodyAndCache};
|
||||
use rustc_middle::mir::{Body, Local};
|
||||
use rustc_middle::ty::{RegionVid, TyCtxt};
|
||||
use std::rc::Rc;
|
||||
|
||||
|
@ -32,7 +32,7 @@ mod trace;
|
|||
/// performed before
|
||||
pub(super) fn generate<'mir, 'tcx>(
|
||||
typeck: &mut TypeChecker<'_, 'tcx>,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
elements: &Rc<RegionValueElements>,
|
||||
flow_inits: &mut ResultsCursor<'mir, 'tcx, MaybeInitializedPlaces<'mir, 'tcx>>,
|
||||
move_data: &MoveData<'tcx>,
|
||||
|
|
|
@ -3,7 +3,7 @@ use crate::dataflow::indexes::MovePathIndex;
|
|||
use crate::dataflow::move_paths::{LookupResult, MoveData};
|
||||
use crate::util::liveness::{categorize, DefUse};
|
||||
use rustc_middle::mir::visit::{MutatingUseContext, PlaceContext, Visitor};
|
||||
use rustc_middle::mir::{Local, Location, Place, ReadOnlyBodyAndCache};
|
||||
use rustc_middle::mir::{Body, Local, Location, Place};
|
||||
use rustc_middle::ty::subst::GenericArg;
|
||||
|
||||
use super::TypeChecker;
|
||||
|
@ -85,7 +85,7 @@ impl Visitor<'tcx> for UseFactsExtractor<'_> {
|
|||
|
||||
pub(super) fn populate_access_facts(
|
||||
typeck: &mut TypeChecker<'_, 'tcx>,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
location_table: &LocationTable,
|
||||
move_data: &MoveData<'_>,
|
||||
dropped_at: &mut Vec<(Local, Location)>,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_index::bit_set::HybridBitSet;
|
||||
use rustc_infer::infer::canonical::QueryRegionConstraints;
|
||||
use rustc_middle::mir::{BasicBlock, ConstraintCategory, Local, Location, ReadOnlyBodyAndCache};
|
||||
use rustc_middle::mir::{BasicBlock, Body, ConstraintCategory, Local, Location};
|
||||
use rustc_middle::ty::{Ty, TypeFoldable};
|
||||
use rustc_trait_selection::traits::query::dropck_outlives::DropckOutlivesResult;
|
||||
use rustc_trait_selection::traits::query::type_op::outlives::DropckOutlives;
|
||||
|
@ -37,7 +37,7 @@ use crate::borrow_check::{
|
|||
/// this respects `#[may_dangle]` annotations).
|
||||
pub(super) fn trace(
|
||||
typeck: &mut TypeChecker<'_, 'tcx>,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
elements: &Rc<RegionValueElements>,
|
||||
flow_inits: &mut ResultsCursor<'mir, 'tcx, MaybeInitializedPlaces<'mir, 'tcx>>,
|
||||
move_data: &MoveData<'tcx>,
|
||||
|
@ -76,7 +76,7 @@ struct LivenessContext<'me, 'typeck, 'flow, 'tcx> {
|
|||
elements: &'me RegionValueElements,
|
||||
|
||||
/// MIR we are analyzing.
|
||||
body: ReadOnlyBodyAndCache<'me, 'tcx>,
|
||||
body: &'me Body<'tcx>,
|
||||
|
||||
/// Mapping to/from the various indices used for initialization tracking.
|
||||
move_data: &'me MoveData<'tcx>,
|
||||
|
|
|
@ -122,8 +122,8 @@ mod relate_tys;
|
|||
pub(crate) fn type_check<'mir, 'tcx>(
|
||||
infcx: &InferCtxt<'_, 'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
promoted: &IndexVec<Promoted, ReadOnlyBodyAndCache<'_, 'tcx>>,
|
||||
body: &Body<'tcx>,
|
||||
promoted: &IndexVec<Promoted, Body<'tcx>>,
|
||||
mir_def_id: DefId,
|
||||
universal_regions: &Rc<UniversalRegions<'tcx>>,
|
||||
location_table: &LocationTable,
|
||||
|
@ -190,8 +190,8 @@ fn type_check_internal<'a, 'tcx, R>(
|
|||
infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
mir_def_id: DefId,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
body: ReadOnlyBodyAndCache<'a, 'tcx>,
|
||||
promoted: &'a IndexVec<Promoted, ReadOnlyBodyAndCache<'_, 'tcx>>,
|
||||
body: &'a Body<'tcx>,
|
||||
promoted: &'a IndexVec<Promoted, Body<'tcx>>,
|
||||
region_bound_pairs: &'a RegionBoundPairs<'tcx>,
|
||||
implicit_region_bound: ty::Region<'tcx>,
|
||||
borrowck_context: &'a mut BorrowCheckContext<'a, 'tcx>,
|
||||
|
@ -266,7 +266,7 @@ enum FieldAccessError {
|
|||
struct TypeVerifier<'a, 'b, 'tcx> {
|
||||
cx: &'a mut TypeChecker<'b, 'tcx>,
|
||||
body: &'b Body<'tcx>,
|
||||
promoted: &'b IndexVec<Promoted, ReadOnlyBodyAndCache<'b, 'tcx>>,
|
||||
promoted: &'b IndexVec<Promoted, Body<'tcx>>,
|
||||
last_span: Span,
|
||||
mir_def_id: DefId,
|
||||
errors_reported: bool,
|
||||
|
@ -320,7 +320,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
|
|||
if let ty::ConstKind::Unevaluated(def_id, substs, promoted) = constant.literal.val {
|
||||
if let Some(promoted) = promoted {
|
||||
let check_err = |verifier: &mut TypeVerifier<'a, 'b, 'tcx>,
|
||||
promoted: &ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
promoted: &Body<'tcx>,
|
||||
ty,
|
||||
san_ty| {
|
||||
if let Err(terr) = verifier.cx.eq_types(
|
||||
|
@ -451,7 +451,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
|||
fn new(
|
||||
cx: &'a mut TypeChecker<'b, 'tcx>,
|
||||
body: &'b Body<'tcx>,
|
||||
promoted: &'b IndexVec<Promoted, ReadOnlyBodyAndCache<'b, 'tcx>>,
|
||||
promoted: &'b IndexVec<Promoted, Body<'tcx>>,
|
||||
) -> Self {
|
||||
TypeVerifier {
|
||||
body,
|
||||
|
@ -525,11 +525,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
|||
place_ty
|
||||
}
|
||||
|
||||
fn sanitize_promoted(
|
||||
&mut self,
|
||||
promoted_body: ReadOnlyBodyAndCache<'b, 'tcx>,
|
||||
location: Location,
|
||||
) {
|
||||
fn sanitize_promoted(&mut self, promoted_body: &'b Body<'tcx>, location: Location) {
|
||||
// Determine the constraints from the promoted MIR by running the type
|
||||
// checker on the promoted MIR, then transfer the constraints back to
|
||||
// the main MIR, changing the locations to the provided location.
|
||||
|
@ -1396,12 +1392,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
self.infcx.tcx
|
||||
}
|
||||
|
||||
fn check_stmt(
|
||||
&mut self,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
stmt: &Statement<'tcx>,
|
||||
location: Location,
|
||||
) {
|
||||
fn check_stmt(&mut self, body: &Body<'tcx>, stmt: &Statement<'tcx>, location: Location) {
|
||||
debug!("check_stmt: {:?}", stmt);
|
||||
let tcx = self.tcx();
|
||||
match stmt.kind {
|
||||
|
@ -1973,12 +1964,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
fn check_rvalue(
|
||||
&mut self,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
rvalue: &Rvalue<'tcx>,
|
||||
location: Location,
|
||||
) {
|
||||
fn check_rvalue(&mut self, body: &Body<'tcx>, rvalue: &Rvalue<'tcx>, location: Location) {
|
||||
let tcx = self.tcx();
|
||||
|
||||
match rvalue {
|
||||
|
@ -2712,7 +2698,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
})
|
||||
}
|
||||
|
||||
fn typeck_mir(&mut self, body: ReadOnlyBodyAndCache<'_, 'tcx>) {
|
||||
fn typeck_mir(&mut self, body: &Body<'tcx>) {
|
||||
self.last_span = body.span;
|
||||
debug!("run_on_mir: {:?}", body.span);
|
||||
|
||||
|
|
|
@ -84,13 +84,13 @@ type BorrowedLocalsResults<'a, 'tcx> = ResultsRefCursor<'a, 'a, 'tcx, MaybeBorro
|
|||
/// Dataflow analysis that determines whether each local requires storage at a
|
||||
/// given location; i.e. whether its storage can go away without being observed.
|
||||
pub struct MaybeRequiresStorage<'mir, 'tcx> {
|
||||
body: ReadOnlyBodyAndCache<'mir, 'tcx>,
|
||||
body: &'mir Body<'tcx>,
|
||||
borrowed_locals: RefCell<BorrowedLocalsResults<'mir, 'tcx>>,
|
||||
}
|
||||
|
||||
impl<'mir, 'tcx> MaybeRequiresStorage<'mir, 'tcx> {
|
||||
pub fn new(
|
||||
body: ReadOnlyBodyAndCache<'mir, 'tcx>,
|
||||
body: &'mir Body<'tcx>,
|
||||
borrowed_locals: &'mir Results<'tcx, MaybeBorrowedLocals>,
|
||||
) -> Self {
|
||||
MaybeRequiresStorage {
|
||||
|
|
|
@ -405,7 +405,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
&self,
|
||||
instance: ty::InstanceDef<'tcx>,
|
||||
promoted: Option<mir::Promoted>,
|
||||
) -> InterpResult<'tcx, mir::ReadOnlyBodyAndCache<'tcx, 'tcx>> {
|
||||
) -> InterpResult<'tcx, &'tcx mir::Body<'tcx>> {
|
||||
// do not continue if typeck errors occurred (can only occur in local crate)
|
||||
let did = instance.def_id();
|
||||
if did.is_local() && self.tcx.has_typeck_tables(did) {
|
||||
|
@ -415,12 +415,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
}
|
||||
trace!("load mir(instance={:?}, promoted={:?})", instance, promoted);
|
||||
if let Some(promoted) = promoted {
|
||||
return Ok(self.tcx.promoted_mir(did)[promoted].unwrap_read_only());
|
||||
return Ok(&self.tcx.promoted_mir(did)[promoted]);
|
||||
}
|
||||
match instance {
|
||||
ty::InstanceDef::Item(def_id) => {
|
||||
if self.tcx.is_mir_available(did) {
|
||||
Ok(self.tcx.optimized_mir(did).unwrap_read_only())
|
||||
Ok(self.tcx.optimized_mir(did))
|
||||
} else {
|
||||
throw_unsup!(NoMirFor(def_id))
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ pub fn provide(providers: &mut Providers<'_>) {
|
|||
providers.mir_shims = make_shim;
|
||||
}
|
||||
|
||||
fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> &'tcx BodyAndCache<'tcx> {
|
||||
fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> &'tcx Body<'tcx> {
|
||||
debug!("make_shim({:?})", instance);
|
||||
|
||||
let mut result = match instance {
|
||||
|
@ -128,7 +128,6 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> &'tcx
|
|||
|
||||
debug!("make_shim({:?}) = {:?}", instance, result);
|
||||
|
||||
result.ensure_predecessors();
|
||||
tcx.arena.alloc(result)
|
||||
}
|
||||
|
||||
|
@ -168,11 +167,7 @@ fn local_decls_for_sig<'tcx>(
|
|||
.collect()
|
||||
}
|
||||
|
||||
fn build_drop_shim<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
def_id: DefId,
|
||||
ty: Option<Ty<'tcx>>,
|
||||
) -> BodyAndCache<'tcx> {
|
||||
fn build_drop_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option<Ty<'tcx>>) -> Body<'tcx> {
|
||||
debug!("build_drop_shim(def_id={:?}, ty={:?})", def_id, ty);
|
||||
|
||||
// Check if this is a generator, if so, return the drop glue for it
|
||||
|
@ -204,9 +199,7 @@ fn build_drop_shim<'tcx>(
|
|||
block(&mut blocks, TerminatorKind::Goto { target: return_block });
|
||||
block(&mut blocks, TerminatorKind::Return);
|
||||
|
||||
let body = new_body(blocks, local_decls_for_sig(&sig, span), sig.inputs().len(), span);
|
||||
|
||||
let mut body = BodyAndCache::new(body);
|
||||
let mut body = new_body(blocks, local_decls_for_sig(&sig, span), sig.inputs().len(), span);
|
||||
|
||||
if let Some(..) = ty {
|
||||
// The first argument (index 0), but add 1 for the return value.
|
||||
|
@ -320,11 +313,7 @@ impl<'a, 'tcx> DropElaborator<'a, 'tcx> for DropShimElaborator<'a, 'tcx> {
|
|||
}
|
||||
|
||||
/// Builds a `Clone::clone` shim for `self_ty`. Here, `def_id` is `Clone::clone`.
|
||||
fn build_clone_shim<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
def_id: DefId,
|
||||
self_ty: Ty<'tcx>,
|
||||
) -> BodyAndCache<'tcx> {
|
||||
fn build_clone_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, self_ty: Ty<'tcx>) -> Body<'tcx> {
|
||||
debug!("build_clone_shim(def_id={:?})", def_id);
|
||||
|
||||
let param_env = tcx.param_env(def_id);
|
||||
|
@ -348,7 +337,7 @@ fn build_clone_shim<'tcx>(
|
|||
_ => bug!("clone shim for `{:?}` which is not `Copy` and is not an aggregate", self_ty),
|
||||
};
|
||||
|
||||
BodyAndCache::new(builder.into_mir())
|
||||
builder.into_mir()
|
||||
}
|
||||
|
||||
struct CloneShimBuilder<'tcx> {
|
||||
|
@ -671,7 +660,7 @@ fn build_call_shim<'tcx>(
|
|||
rcvr_adjustment: Option<Adjustment>,
|
||||
call_kind: CallKind,
|
||||
untuple_args: Option<&[Ty<'tcx>]>,
|
||||
) -> BodyAndCache<'tcx> {
|
||||
) -> Body<'tcx> {
|
||||
debug!(
|
||||
"build_call_shim(instance={:?}, rcvr_adjustment={:?}, \
|
||||
call_kind={:?}, untuple_args={:?})",
|
||||
|
@ -835,10 +824,11 @@ fn build_call_shim<'tcx>(
|
|||
if let Abi::RustCall = sig.abi {
|
||||
body.spread_arg = Some(Local::new(sig.inputs().len()));
|
||||
}
|
||||
BodyAndCache::new(body)
|
||||
|
||||
body
|
||||
}
|
||||
|
||||
pub fn build_adt_ctor(tcx: TyCtxt<'_>, ctor_id: DefId) -> &BodyAndCache<'_> {
|
||||
pub fn build_adt_ctor(tcx: TyCtxt<'_>, ctor_id: DefId) -> &Body<'_> {
|
||||
debug_assert!(tcx.is_constructor(ctor_id));
|
||||
|
||||
let span =
|
||||
|
@ -905,7 +895,5 @@ pub fn build_adt_ctor(tcx: TyCtxt<'_>, ctor_id: DefId) -> &BodyAndCache<'_> {
|
|||
|_, _| Ok(()),
|
||||
);
|
||||
|
||||
let mut body = BodyAndCache::new(body);
|
||||
body.ensure_predecessors();
|
||||
tcx.arena.alloc(body)
|
||||
}
|
||||
|
|
|
@ -31,13 +31,13 @@ pub use self::AddCallGuards::*;
|
|||
*/
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for AddCallGuards {
|
||||
fn run_pass(&self, _tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, _tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
self.add_call_guards(body);
|
||||
}
|
||||
}
|
||||
|
||||
impl AddCallGuards {
|
||||
pub fn add_call_guards(&self, body: &mut BodyAndCache<'_>) {
|
||||
pub fn add_call_guards(&self, body: &mut Body<'_>) {
|
||||
let pred_count: IndexVec<_, _> = body.predecessors().iter().map(|ps| ps.len()).collect();
|
||||
|
||||
// We need a place to store the new blocks generated
|
||||
|
|
|
@ -40,17 +40,13 @@ use crate::util::patch::MirPatch;
|
|||
pub struct AddMovesForPackedDrops;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for AddMovesForPackedDrops {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
debug!("add_moves_for_packed_drops({:?} @ {:?})", src, body.span);
|
||||
add_moves_for_packed_drops(tcx, body, src.def_id());
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_moves_for_packed_drops<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
def_id: DefId,
|
||||
) {
|
||||
pub fn add_moves_for_packed_drops<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>, def_id: DefId) {
|
||||
let patch = add_moves_for_packed_drops_patch(tcx, body, def_id);
|
||||
patch.apply(body);
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@ fn may_be_reference(ty: Ty<'tcx>) -> bool {
|
|||
}
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for AddRetag {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
if !tcx.sess.opts.debugging_opts.mir_emit_retag {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ pub mod validation;
|
|||
/// Information about the item currently being const-checked, as well as a reference to the global
|
||||
/// context.
|
||||
pub struct Item<'mir, 'tcx> {
|
||||
pub body: mir::ReadOnlyBodyAndCache<'mir, 'tcx>,
|
||||
pub body: &'mir mir::Body<'tcx>,
|
||||
pub tcx: TyCtxt<'tcx>,
|
||||
pub def_id: DefId,
|
||||
pub param_env: ty::ParamEnv<'tcx>,
|
||||
|
@ -29,11 +29,7 @@ pub struct Item<'mir, 'tcx> {
|
|||
}
|
||||
|
||||
impl Item<'mir, 'tcx> {
|
||||
pub fn new(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
def_id: DefId,
|
||||
body: mir::ReadOnlyBodyAndCache<'mir, 'tcx>,
|
||||
) -> Self {
|
||||
pub fn new(tcx: TyCtxt<'tcx>, def_id: DefId, body: &'mir mir::Body<'tcx>) -> Self {
|
||||
let param_env = tcx.param_env(def_id);
|
||||
let const_kind = ConstKind::for_item(tcx, def_id);
|
||||
|
||||
|
|
|
@ -502,9 +502,6 @@ fn unsafety_check_result(tcx: TyCtxt<'_>, def_id: DefId) -> UnsafetyCheckResult
|
|||
hir::BodyOwnerKind::Const | hir::BodyOwnerKind::Static(_) => (true, false),
|
||||
};
|
||||
let mut checker = UnsafetyChecker::new(const_context, min_const_fn, body, tcx, param_env);
|
||||
// mir_built ensures that body has a computed cache, so we don't (and can't) attempt to
|
||||
// recompute it here.
|
||||
let body = body.unwrap_read_only();
|
||||
checker.visit_body(&body);
|
||||
|
||||
check_unused_unsafe(tcx, def_id, &checker.used_unsafe, &mut checker.inherited_blocks);
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
use crate::transform::{MirPass, MirSource};
|
||||
use rustc_middle::mir::visit::MutVisitor;
|
||||
use rustc_middle::mir::{BodyAndCache, BorrowKind, Location, Rvalue};
|
||||
use rustc_middle::mir::{Body, BorrowKind, Location, Rvalue};
|
||||
use rustc_middle::mir::{Statement, StatementKind};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
|
||||
|
@ -29,7 +29,7 @@ pub struct DeleteNonCodegenStatements<'tcx> {
|
|||
}
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for CleanupNonCodegenStatements {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
let mut delete = DeleteNonCodegenStatements { tcx };
|
||||
delete.visit_body(body);
|
||||
body.user_type_annotations.raw.clear();
|
||||
|
|
|
@ -14,10 +14,9 @@ use rustc_middle::mir::visit::{
|
|||
MutVisitor, MutatingUseContext, NonMutatingUseContext, PlaceContext, Visitor,
|
||||
};
|
||||
use rustc_middle::mir::{
|
||||
read_only, AggregateKind, AssertKind, BasicBlock, BinOp, Body, BodyAndCache, ClearCrossCrate,
|
||||
Constant, Local, LocalDecl, LocalKind, Location, Operand, Place, ReadOnlyBodyAndCache, Rvalue,
|
||||
SourceInfo, SourceScope, SourceScopeData, Statement, StatementKind, Terminator, TerminatorKind,
|
||||
UnOp, RETURN_PLACE,
|
||||
AggregateKind, AssertKind, BasicBlock, BinOp, Body, ClearCrossCrate, Constant, Local,
|
||||
LocalDecl, LocalKind, Location, Operand, Place, Rvalue, SourceInfo, SourceScope,
|
||||
SourceScopeData, Statement, StatementKind, Terminator, TerminatorKind, UnOp, RETURN_PLACE,
|
||||
};
|
||||
use rustc_middle::ty::layout::{HasTyCtxt, LayoutError, TyAndLayout};
|
||||
use rustc_middle::ty::subst::{InternalSubsts, Subst};
|
||||
|
@ -59,7 +58,7 @@ macro_rules! throw_machine_stop_str {
|
|||
pub struct ConstProp;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for ConstProp {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
// will be evaluated by miri and produce its errors there
|
||||
if source.promoted.is_some() {
|
||||
return;
|
||||
|
@ -150,8 +149,7 @@ impl<'tcx> MirPass<'tcx> for ConstProp {
|
|||
// constants, instead of just checking for const-folding succeeding.
|
||||
// That would require an uniform one-def no-mutation analysis
|
||||
// and RPO (or recursing when needing the value of a local).
|
||||
let mut optimization_finder =
|
||||
ConstPropagator::new(read_only!(body), dummy_body, tcx, source);
|
||||
let mut optimization_finder = ConstPropagator::new(body, dummy_body, tcx, source);
|
||||
optimization_finder.visit_body(body);
|
||||
|
||||
trace!("ConstProp done for {:?}", source.def_id());
|
||||
|
@ -362,7 +360,7 @@ impl<'mir, 'tcx> HasTyCtxt<'tcx> for ConstPropagator<'mir, 'tcx> {
|
|||
|
||||
impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
|
||||
fn new(
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
dummy_body: &'mir Body<'tcx>,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
source: MirSource<'tcx>,
|
||||
|
@ -782,7 +780,7 @@ struct CanConstProp {
|
|||
|
||||
impl CanConstProp {
|
||||
/// returns true if `local` can be propagated
|
||||
fn check(body: ReadOnlyBodyAndCache<'_, '_>) -> IndexVec<Local, ConstPropMode> {
|
||||
fn check(body: &Body<'_>) -> IndexVec<Local, ConstPropMode> {
|
||||
let mut cpv = CanConstProp {
|
||||
can_const_prop: IndexVec::from_elem(ConstPropMode::FullConstProp, &body.local_decls),
|
||||
found_assignment: IndexVec::from_elem(false, &body.local_decls),
|
||||
|
|
|
@ -23,15 +23,14 @@ use crate::transform::{MirPass, MirSource};
|
|||
use crate::util::def_use::DefUseAnalysis;
|
||||
use rustc_middle::mir::visit::MutVisitor;
|
||||
use rustc_middle::mir::{
|
||||
read_only, Body, BodyAndCache, Constant, Local, LocalKind, Location, Operand, Place, Rvalue,
|
||||
StatementKind,
|
||||
Body, Constant, Local, LocalKind, Location, Operand, Place, Rvalue, StatementKind,
|
||||
};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
|
||||
pub struct CopyPropagation;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for CopyPropagation {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
// We only run when the MIR optimization level is > 1.
|
||||
// This avoids a slow pass, and messing up debug info.
|
||||
if tcx.sess.opts.debugging_opts.mir_opt_level <= 1 {
|
||||
|
@ -40,10 +39,10 @@ impl<'tcx> MirPass<'tcx> for CopyPropagation {
|
|||
|
||||
let mut def_use_analysis = DefUseAnalysis::new(body);
|
||||
loop {
|
||||
def_use_analysis.analyze(read_only!(body));
|
||||
def_use_analysis.analyze(body);
|
||||
|
||||
if eliminate_self_assignments(body, &def_use_analysis) {
|
||||
def_use_analysis.analyze(read_only!(body));
|
||||
def_use_analysis.analyze(body);
|
||||
}
|
||||
|
||||
let mut changed = false;
|
||||
|
@ -252,7 +251,7 @@ impl<'tcx> Action<'tcx> {
|
|||
|
||||
fn perform(
|
||||
self,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
def_use_analysis: &DefUseAnalysis,
|
||||
dest_local: Local,
|
||||
location: Location,
|
||||
|
|
|
@ -6,7 +6,7 @@ use rustc_middle::ty::TyCtxt;
|
|||
pub struct Deaggregator;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for Deaggregator {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut();
|
||||
let local_decls = &*local_decls;
|
||||
for bb in basic_blocks {
|
||||
|
|
|
@ -7,7 +7,7 @@ use std::io;
|
|||
|
||||
use crate::transform::{MirPass, MirSource};
|
||||
use crate::util as mir_util;
|
||||
use rustc_middle::mir::{Body, BodyAndCache};
|
||||
use rustc_middle::mir::Body;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_session::config::{OutputFilenames, OutputType};
|
||||
|
||||
|
@ -18,13 +18,7 @@ impl<'tcx> MirPass<'tcx> for Marker {
|
|||
Cow::Borrowed(self.0)
|
||||
}
|
||||
|
||||
fn run_pass(
|
||||
&self,
|
||||
_tcx: TyCtxt<'tcx>,
|
||||
_source: MirSource<'tcx>,
|
||||
_body: &mut BodyAndCache<'tcx>,
|
||||
) {
|
||||
}
|
||||
fn run_pass(&self, _tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, _body: &mut Body<'tcx>) {}
|
||||
}
|
||||
|
||||
pub struct Disambiguator {
|
||||
|
|
|
@ -21,7 +21,7 @@ use std::fmt;
|
|||
pub struct ElaborateDrops;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for ElaborateDrops {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
debug!("elaborate_drops({:?} @ {:?})", src, body.span);
|
||||
|
||||
let def_id = src.def_id();
|
||||
|
|
|
@ -354,7 +354,7 @@ impl MutVisitor<'tcx> for TransformVisitor<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
fn make_generator_state_argument_indirect<'tcx>(tcx: TyCtxt<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn make_generator_state_argument_indirect<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
let gen_ty = body.local_decls.raw[1].ty;
|
||||
|
||||
let ref_gen_ty =
|
||||
|
@ -367,7 +367,7 @@ fn make_generator_state_argument_indirect<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Bo
|
|||
DerefArgVisitor { tcx }.visit_body(body);
|
||||
}
|
||||
|
||||
fn make_generator_state_argument_pinned<'tcx>(tcx: TyCtxt<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn make_generator_state_argument_pinned<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
let ref_gen_ty = body.local_decls.raw[1].ty;
|
||||
|
||||
let pin_did = tcx.lang_items().pin_type().unwrap();
|
||||
|
@ -391,7 +391,7 @@ fn make_generator_state_argument_pinned<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body
|
|||
fn replace_local<'tcx>(
|
||||
local: Local,
|
||||
ty: Ty<'tcx>,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) -> Local {
|
||||
let source_info = source_info(body);
|
||||
|
@ -436,7 +436,7 @@ struct LivenessInfo {
|
|||
|
||||
fn locals_live_across_suspend_points(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
source: MirSource<'tcx>,
|
||||
always_live_locals: &storage::AlwaysLiveLocals,
|
||||
movable: bool,
|
||||
|
@ -686,7 +686,7 @@ fn compute_layout<'tcx>(
|
|||
interior: Ty<'tcx>,
|
||||
always_live_locals: &storage::AlwaysLiveLocals,
|
||||
movable: bool,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
) -> (
|
||||
FxHashMap<Local, (Ty<'tcx>, VariantIdx, usize)>,
|
||||
GeneratorLayout<'tcx>,
|
||||
|
@ -698,13 +698,7 @@ fn compute_layout<'tcx>(
|
|||
live_locals_at_suspension_points,
|
||||
storage_conflicts,
|
||||
storage_liveness,
|
||||
} = locals_live_across_suspend_points(
|
||||
tcx,
|
||||
read_only!(body),
|
||||
source,
|
||||
always_live_locals,
|
||||
movable,
|
||||
);
|
||||
} = locals_live_across_suspend_points(tcx, body, source, always_live_locals, movable);
|
||||
|
||||
// Erase regions from the types passed in from typeck so we can compare them with
|
||||
// MIR types
|
||||
|
@ -779,7 +773,7 @@ fn compute_layout<'tcx>(
|
|||
///
|
||||
/// After this function, the former entry point of the function will be bb1.
|
||||
fn insert_switch<'tcx>(
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
cases: Vec<(usize, BasicBlock)>,
|
||||
transform: &TransformVisitor<'tcx>,
|
||||
default: TerminatorKind<'tcx>,
|
||||
|
@ -810,11 +804,7 @@ fn insert_switch<'tcx>(
|
|||
}
|
||||
}
|
||||
|
||||
fn elaborate_generator_drops<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
def_id: DefId,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
) {
|
||||
fn elaborate_generator_drops<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, body: &mut Body<'tcx>) {
|
||||
use crate::shim::DropShimElaborator;
|
||||
use crate::util::elaborate_drops::{elaborate_drop, Unwind};
|
||||
use crate::util::patch::MirPatch;
|
||||
|
@ -865,9 +855,9 @@ fn create_generator_drop_shim<'tcx>(
|
|||
transform: &TransformVisitor<'tcx>,
|
||||
source: MirSource<'tcx>,
|
||||
gen_ty: Ty<'tcx>,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
drop_clean: BasicBlock,
|
||||
) -> BodyAndCache<'tcx> {
|
||||
) -> Body<'tcx> {
|
||||
let mut body = body.clone();
|
||||
body.arg_count = 1; // make sure the resume argument is not included here
|
||||
|
||||
|
@ -934,10 +924,7 @@ fn create_generator_drop_shim<'tcx>(
|
|||
body
|
||||
}
|
||||
|
||||
fn insert_term_block<'tcx>(
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
kind: TerminatorKind<'tcx>,
|
||||
) -> BasicBlock {
|
||||
fn insert_term_block<'tcx>(body: &mut Body<'tcx>, kind: TerminatorKind<'tcx>) -> BasicBlock {
|
||||
let term_block = BasicBlock::new(body.basic_blocks().len());
|
||||
let source_info = source_info(body);
|
||||
body.basic_blocks_mut().push(BasicBlockData {
|
||||
|
@ -950,7 +937,7 @@ fn insert_term_block<'tcx>(
|
|||
|
||||
fn insert_panic_block<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
message: AssertMessage<'tcx>,
|
||||
) -> BasicBlock {
|
||||
let assert_block = BasicBlock::new(body.basic_blocks().len());
|
||||
|
@ -1036,7 +1023,7 @@ fn create_generator_resume_function<'tcx>(
|
|||
tcx: TyCtxt<'tcx>,
|
||||
transform: TransformVisitor<'tcx>,
|
||||
source: MirSource<'tcx>,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
can_return: bool,
|
||||
) {
|
||||
let can_unwind = can_unwind(tcx, body);
|
||||
|
@ -1115,7 +1102,7 @@ fn source_info(body: &Body<'_>) -> SourceInfo {
|
|||
SourceInfo { span: body.span, scope: OUTERMOST_SOURCE_SCOPE }
|
||||
}
|
||||
|
||||
fn insert_clean_drop(body: &mut BodyAndCache<'_>) -> BasicBlock {
|
||||
fn insert_clean_drop(body: &mut Body<'_>) -> BasicBlock {
|
||||
let return_block = insert_term_block(body, TerminatorKind::Return);
|
||||
|
||||
// Create a block to destroy an unresumed generators. This can only destroy upvars.
|
||||
|
@ -1152,7 +1139,7 @@ impl Operation {
|
|||
}
|
||||
|
||||
fn create_cases<'tcx>(
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
transform: &TransformVisitor<'tcx>,
|
||||
operation: Operation,
|
||||
) -> Vec<(usize, BasicBlock)> {
|
||||
|
@ -1215,7 +1202,7 @@ fn create_cases<'tcx>(
|
|||
}
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for StateTransform {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
let yield_ty = if let Some(yield_ty) = body.yield_ty {
|
||||
yield_ty
|
||||
} else {
|
||||
|
|
|
@ -38,7 +38,7 @@ struct CallSite<'tcx> {
|
|||
}
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for Inline {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
if tcx.sess.opts.debugging_opts.mir_opt_level >= 2 {
|
||||
Inliner { tcx, source }.run_pass(body);
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ struct Inliner<'tcx> {
|
|||
}
|
||||
|
||||
impl Inliner<'tcx> {
|
||||
fn run_pass(&self, caller_body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, caller_body: &mut Body<'tcx>) {
|
||||
// Keep a queue of callsites to try inlining on. We take
|
||||
// advantage of the fact that queries detect cycles here to
|
||||
// allow us to try and fetch the fully optimized MIR of a
|
||||
|
@ -405,8 +405,8 @@ impl Inliner<'tcx> {
|
|||
fn inline_call(
|
||||
&self,
|
||||
callsite: CallSite<'tcx>,
|
||||
caller_body: &mut BodyAndCache<'tcx>,
|
||||
mut callee_body: BodyAndCache<'tcx>,
|
||||
caller_body: &mut Body<'tcx>,
|
||||
mut callee_body: Body<'tcx>,
|
||||
) -> bool {
|
||||
let terminator = caller_body[callsite.bb].terminator.take().unwrap();
|
||||
match terminator.kind {
|
||||
|
@ -534,7 +534,7 @@ impl Inliner<'tcx> {
|
|||
&self,
|
||||
args: Vec<Operand<'tcx>>,
|
||||
callsite: &CallSite<'tcx>,
|
||||
caller_body: &mut BodyAndCache<'tcx>,
|
||||
caller_body: &mut Body<'tcx>,
|
||||
) -> Vec<Local> {
|
||||
let tcx = self.tcx;
|
||||
|
||||
|
@ -601,7 +601,7 @@ impl Inliner<'tcx> {
|
|||
&self,
|
||||
arg: Operand<'tcx>,
|
||||
callsite: &CallSite<'tcx>,
|
||||
caller_body: &mut BodyAndCache<'tcx>,
|
||||
caller_body: &mut Body<'tcx>,
|
||||
) -> Local {
|
||||
// FIXME: Analysis of the usage of the arguments to avoid
|
||||
// unnecessary temporaries.
|
||||
|
|
|
@ -5,8 +5,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
|||
use rustc_index::vec::Idx;
|
||||
use rustc_middle::mir::visit::{MutVisitor, Visitor};
|
||||
use rustc_middle::mir::{
|
||||
read_only, Body, BodyAndCache, Constant, Local, Location, Operand, Place, PlaceRef,
|
||||
ProjectionElem, Rvalue,
|
||||
Body, Constant, Local, Location, Operand, Place, PlaceRef, ProjectionElem, Rvalue,
|
||||
};
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
use std::mem;
|
||||
|
@ -14,7 +13,7 @@ use std::mem;
|
|||
pub struct InstCombine;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for InstCombine {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
// We only run when optimizing MIR (at any level).
|
||||
if tcx.sess.opts.debugging_opts.mir_opt_level == 0 {
|
||||
return;
|
||||
|
@ -24,9 +23,8 @@ impl<'tcx> MirPass<'tcx> for InstCombine {
|
|||
// read-only so that we can do global analyses on the MIR in the process (e.g.
|
||||
// `Place::ty()`).
|
||||
let optimizations = {
|
||||
let read_only_cache = read_only!(body);
|
||||
let mut optimization_finder = OptimizationFinder::new(body, tcx);
|
||||
optimization_finder.visit_body(&read_only_cache);
|
||||
optimization_finder.visit_body(body);
|
||||
optimization_finder.optimizations
|
||||
};
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ use rustc_hir as hir;
|
|||
use rustc_hir::def_id::{CrateNum, DefId, DefIdSet, LocalDefId, LOCAL_CRATE};
|
||||
use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
|
||||
use rustc_index::vec::IndexVec;
|
||||
use rustc_middle::mir::{BodyAndCache, ConstQualifs, MirPhase, Promoted};
|
||||
use rustc_middle::mir::{Body, ConstQualifs, MirPhase, Promoted};
|
||||
use rustc_middle::ty::query::Providers;
|
||||
use rustc_middle::ty::steal::Steal;
|
||||
use rustc_middle::ty::{InstanceDef, TyCtxt, TypeFoldable};
|
||||
|
@ -131,12 +131,12 @@ pub trait MirPass<'tcx> {
|
|||
default_name::<Self>()
|
||||
}
|
||||
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>);
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut Body<'tcx>);
|
||||
}
|
||||
|
||||
pub fn run_passes(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
instance: InstanceDef<'tcx>,
|
||||
promoted: Option<Promoted>,
|
||||
mir_phase: MirPhase,
|
||||
|
@ -194,13 +194,8 @@ fn mir_const_qualif(tcx: TyCtxt<'_>, def_id: DefId) -> ConstQualifs {
|
|||
return Default::default();
|
||||
}
|
||||
|
||||
let item = check_consts::Item {
|
||||
body: body.unwrap_read_only(),
|
||||
tcx,
|
||||
def_id,
|
||||
const_kind,
|
||||
param_env: tcx.param_env(def_id),
|
||||
};
|
||||
let item =
|
||||
check_consts::Item { body, tcx, def_id, const_kind, param_env: tcx.param_env(def_id) };
|
||||
|
||||
let mut validator = check_consts::validation::Validator::new(&item);
|
||||
validator.check_body();
|
||||
|
@ -210,7 +205,7 @@ fn mir_const_qualif(tcx: TyCtxt<'_>, def_id: DefId) -> ConstQualifs {
|
|||
validator.qualifs_in_return_place()
|
||||
}
|
||||
|
||||
fn mir_const(tcx: TyCtxt<'_>, def_id: DefId) -> &Steal<BodyAndCache<'_>> {
|
||||
fn mir_const(tcx: TyCtxt<'_>, def_id: DefId) -> &Steal<Body<'_>> {
|
||||
// Unsafety check uses the raw mir, so make sure it is run
|
||||
let _ = tcx.unsafety_check_result(def_id);
|
||||
|
||||
|
@ -230,14 +225,13 @@ fn mir_const(tcx: TyCtxt<'_>, def_id: DefId) -> &Steal<BodyAndCache<'_>> {
|
|||
&rustc_peek::SanityCheck,
|
||||
],
|
||||
);
|
||||
body.ensure_predecessors();
|
||||
tcx.alloc_steal_mir(body)
|
||||
}
|
||||
|
||||
fn mir_validated(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
def_id: DefId,
|
||||
) -> (&'tcx Steal<BodyAndCache<'tcx>>, &'tcx Steal<IndexVec<Promoted, BodyAndCache<'tcx>>>) {
|
||||
) -> (&'tcx Steal<Body<'tcx>>, &'tcx Steal<IndexVec<Promoted, Body<'tcx>>>) {
|
||||
// Ensure that we compute the `mir_const_qualif` for constants at
|
||||
// this point, before we steal the mir-const result.
|
||||
let _ = tcx.mir_const_qualif(def_id);
|
||||
|
@ -263,7 +257,7 @@ fn mir_validated(
|
|||
|
||||
fn run_optimization_passes<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
def_id: DefId,
|
||||
promoted: Option<Promoted>,
|
||||
) {
|
||||
|
@ -319,7 +313,7 @@ fn run_optimization_passes<'tcx>(
|
|||
);
|
||||
}
|
||||
|
||||
fn optimized_mir(tcx: TyCtxt<'_>, def_id: DefId) -> &BodyAndCache<'_> {
|
||||
fn optimized_mir(tcx: TyCtxt<'_>, def_id: DefId) -> &Body<'_> {
|
||||
if tcx.is_constructor(def_id) {
|
||||
// There's no reason to run all of the MIR passes on constructors when
|
||||
// we can just output the MIR we want directly. This also saves const
|
||||
|
@ -335,14 +329,13 @@ fn optimized_mir(tcx: TyCtxt<'_>, def_id: DefId) -> &BodyAndCache<'_> {
|
|||
let (body, _) = tcx.mir_validated(def_id);
|
||||
let mut body = body.steal();
|
||||
run_optimization_passes(tcx, &mut body, def_id, None);
|
||||
body.ensure_predecessors();
|
||||
|
||||
debug_assert!(!body.has_free_regions(), "Free regions in optimized MIR");
|
||||
|
||||
tcx.arena.alloc(body)
|
||||
}
|
||||
|
||||
fn promoted_mir(tcx: TyCtxt<'_>, def_id: DefId) -> &IndexVec<Promoted, BodyAndCache<'_>> {
|
||||
fn promoted_mir(tcx: TyCtxt<'_>, def_id: DefId) -> &IndexVec<Promoted, Body<'_>> {
|
||||
if tcx.is_constructor(def_id) {
|
||||
return tcx.intern_promoted(IndexVec::new());
|
||||
}
|
||||
|
@ -353,7 +346,6 @@ fn promoted_mir(tcx: TyCtxt<'_>, def_id: DefId) -> &IndexVec<Promoted, BodyAndCa
|
|||
|
||||
for (p, mut body) in promoted.iter_enumerated_mut() {
|
||||
run_optimization_passes(tcx, &mut body, def_id, Some(p));
|
||||
body.ensure_predecessors();
|
||||
}
|
||||
|
||||
debug_assert!(!promoted.has_free_regions(), "Free regions in promoted MIR");
|
||||
|
|
|
@ -17,12 +17,12 @@ impl<'tcx> NoLandingPads<'tcx> {
|
|||
}
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for NoLandingPads<'tcx> {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
no_landing_pads(tcx, body)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn no_landing_pads<'tcx>(tcx: TyCtxt<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
pub fn no_landing_pads<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
if tcx.sess.no_landing_pads() {
|
||||
NoLandingPads::new(tcx).visit_body(body);
|
||||
}
|
||||
|
|
|
@ -42,11 +42,11 @@ use crate::transform::{MirPass, MirSource};
|
|||
/// newly created `Constant`.
|
||||
#[derive(Default)]
|
||||
pub struct PromoteTemps<'tcx> {
|
||||
pub promoted_fragments: Cell<IndexVec<Promoted, BodyAndCache<'tcx>>>,
|
||||
pub promoted_fragments: Cell<IndexVec<Promoted, Body<'tcx>>>,
|
||||
}
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for PromoteTemps<'tcx> {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
// There's not really any point in promoting errorful MIR.
|
||||
//
|
||||
// This does not include MIR that failed const-checking, which we still try to promote.
|
||||
|
@ -64,8 +64,7 @@ impl<'tcx> MirPass<'tcx> for PromoteTemps<'tcx> {
|
|||
let mut rpo = traversal::reverse_postorder(body);
|
||||
let (temps, all_candidates) = collect_temps_and_candidates(tcx, body, &mut rpo);
|
||||
|
||||
let promotable_candidates =
|
||||
validate_candidates(tcx, read_only!(body), def_id, &temps, &all_candidates);
|
||||
let promotable_candidates = validate_candidates(tcx, body, def_id, &temps, &all_candidates);
|
||||
|
||||
let promoted = promote_candidates(def_id, body, tcx, temps, promotable_candidates);
|
||||
self.promoted_fragments.set(promoted);
|
||||
|
@ -719,7 +718,7 @@ impl<'tcx> Validator<'_, 'tcx> {
|
|||
// FIXME(eddyb) remove the differences for promotability in `static`, `const`, `const fn`.
|
||||
pub fn validate_candidates(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
def_id: DefId,
|
||||
temps: &IndexVec<Local, TempState>,
|
||||
candidates: &[Candidate],
|
||||
|
@ -752,8 +751,8 @@ pub fn validate_candidates(
|
|||
|
||||
struct Promoter<'a, 'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
source: &'a mut BodyAndCache<'tcx>,
|
||||
promoted: BodyAndCache<'tcx>,
|
||||
source: &'a mut Body<'tcx>,
|
||||
promoted: Body<'tcx>,
|
||||
temps: &'a mut IndexVec<Local, TempState>,
|
||||
extra_statements: &'a mut Vec<(Location, Statement<'tcx>)>,
|
||||
|
||||
|
@ -901,7 +900,7 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> {
|
|||
def_id: DefId,
|
||||
candidate: Candidate,
|
||||
next_promoted_id: usize,
|
||||
) -> Option<BodyAndCache<'tcx>> {
|
||||
) -> Option<Body<'tcx>> {
|
||||
let mut rvalue = {
|
||||
let promoted = &mut self.promoted;
|
||||
let promoted_id = Promoted::new(next_promoted_id);
|
||||
|
@ -1044,11 +1043,11 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Promoter<'a, 'tcx> {
|
|||
|
||||
pub fn promote_candidates<'tcx>(
|
||||
def_id: DefId,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
mut temps: IndexVec<Local, TempState>,
|
||||
candidates: Vec<Candidate>,
|
||||
) -> IndexVec<Promoted, BodyAndCache<'tcx>> {
|
||||
) -> IndexVec<Promoted, Body<'tcx>> {
|
||||
// Visit candidates in reverse, in case they're nested.
|
||||
debug!("promote_candidates({:?})", candidates);
|
||||
|
||||
|
@ -1093,7 +1092,7 @@ pub fn promote_candidates<'tcx>(
|
|||
promoted.ignore_interior_mut_in_const_validation = true;
|
||||
|
||||
let promoter = Promoter {
|
||||
promoted: BodyAndCache::new(promoted),
|
||||
promoted,
|
||||
tcx,
|
||||
source: body,
|
||||
temps: &mut temps,
|
||||
|
@ -1150,7 +1149,7 @@ pub fn promote_candidates<'tcx>(
|
|||
crate fn should_suggest_const_in_array_repeat_expressions_attribute<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
mir_def_id: DefId,
|
||||
body: ReadOnlyBodyAndCache<'_, 'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
operand: &Operand<'tcx>,
|
||||
) -> bool {
|
||||
let mut rpo = traversal::reverse_postorder(&body);
|
||||
|
|
|
@ -9,7 +9,7 @@ use rustc_middle::ty::TyCtxt;
|
|||
/// code for these.
|
||||
pub struct RemoveNoopLandingPads;
|
||||
|
||||
pub fn remove_noop_landing_pads<'tcx>(tcx: TyCtxt<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
pub fn remove_noop_landing_pads<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
if tcx.sess.no_landing_pads() {
|
||||
return;
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ pub fn remove_noop_landing_pads<'tcx>(tcx: TyCtxt<'tcx>, body: &mut BodyAndCache
|
|||
}
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for RemoveNoopLandingPads {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
remove_noop_landing_pads(tcx, body);
|
||||
}
|
||||
}
|
||||
|
@ -80,7 +80,7 @@ impl RemoveNoopLandingPads {
|
|||
}
|
||||
}
|
||||
|
||||
fn remove_nop_landing_pads(&self, body: &mut BodyAndCache<'_>) {
|
||||
fn remove_nop_landing_pads(&self, body: &mut Body<'_>) {
|
||||
// make sure there's a single resume block
|
||||
let resume_block = {
|
||||
let patch = MirPatch::new(body);
|
||||
|
|
|
@ -6,7 +6,7 @@ use rustc_target::spec::abi::Abi;
|
|||
use crate::transform::{MirPass, MirSource};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_index::bit_set::BitSet;
|
||||
use rustc_middle::mir::{self, Body, BodyAndCache, Local, Location};
|
||||
use rustc_middle::mir::{self, Body, Local, Location};
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
|
||||
use crate::dataflow::move_paths::{HasMoveData, MoveData};
|
||||
|
@ -21,7 +21,7 @@ use crate::dataflow::{
|
|||
pub struct SanityCheck;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for SanityCheck {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
use crate::dataflow::has_rustc_mir_with;
|
||||
let def_id = src.def_id();
|
||||
if !tcx.has_attr(def_id, sym::rustc_mir) {
|
||||
|
|
|
@ -45,7 +45,7 @@ impl SimplifyCfg {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn simplify_cfg(body: &mut BodyAndCache<'_>) {
|
||||
pub fn simplify_cfg(body: &mut Body<'_>) {
|
||||
CfgSimplifier::new(body).simplify();
|
||||
remove_dead_blocks(body);
|
||||
|
||||
|
@ -58,7 +58,7 @@ impl<'tcx> MirPass<'tcx> for SimplifyCfg {
|
|||
Cow::Borrowed(&self.label)
|
||||
}
|
||||
|
||||
fn run_pass(&self, _tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, _tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
debug!("SimplifyCfg({:?}) - simplifying {:?}", self.label, body);
|
||||
simplify_cfg(body);
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ pub struct CfgSimplifier<'a, 'tcx> {
|
|||
}
|
||||
|
||||
impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
|
||||
pub fn new(body: &'a mut BodyAndCache<'tcx>) -> Self {
|
||||
pub fn new(body: &'a mut Body<'tcx>) -> Self {
|
||||
let mut pred_count = IndexVec::from_elem(0u32, body.basic_blocks());
|
||||
|
||||
// we can't use mir.predecessors() here because that counts
|
||||
|
@ -272,7 +272,7 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn remove_dead_blocks(body: &mut BodyAndCache<'_>) {
|
||||
pub fn remove_dead_blocks(body: &mut Body<'_>) {
|
||||
let mut seen = BitSet::new_empty(body.basic_blocks().len());
|
||||
for (bb, _) in traversal::preorder(body) {
|
||||
seen.insert(bb.index());
|
||||
|
@ -304,15 +304,14 @@ pub fn remove_dead_blocks(body: &mut BodyAndCache<'_>) {
|
|||
pub struct SimplifyLocals;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for SimplifyLocals {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
trace!("running SimplifyLocals on {:?}", source);
|
||||
|
||||
// First, we're going to get a count of *actual* uses for every `Local`.
|
||||
// Take a look at `DeclMarker::visit_local()` to see exactly what is ignored.
|
||||
let mut used_locals = {
|
||||
let read_only_cache = read_only!(body);
|
||||
let mut marker = DeclMarker::new(body);
|
||||
marker.visit_body(&read_only_cache);
|
||||
marker.visit_body(&body);
|
||||
|
||||
marker.local_counts
|
||||
};
|
||||
|
|
|
@ -21,7 +21,7 @@ impl<'tcx> MirPass<'tcx> for SimplifyBranches {
|
|||
Cow::Borrowed(&self.label)
|
||||
}
|
||||
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
let param_env = tcx.param_env(src.def_id());
|
||||
for block in body.basic_blocks_mut() {
|
||||
let terminator = block.terminator_mut();
|
||||
|
|
|
@ -33,7 +33,7 @@ use rustc_target::abi::VariantIdx;
|
|||
pub struct SimplifyArmIdentity;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for SimplifyArmIdentity {
|
||||
fn run_pass(&self, _: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, _: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut();
|
||||
for bb in basic_blocks {
|
||||
// Need 3 statements:
|
||||
|
@ -153,7 +153,7 @@ fn match_variant_field_place<'tcx>(place: Place<'tcx>) -> Option<(Local, VarFiel
|
|||
pub struct SimplifyBranchSame;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for SimplifyBranchSame {
|
||||
fn run_pass(&self, _: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, _: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
let mut did_remove_blocks = false;
|
||||
let bbs = body.basic_blocks_mut();
|
||||
for bb_idx in bbs.indices() {
|
||||
|
|
|
@ -2,8 +2,7 @@
|
|||
|
||||
use crate::transform::{MirPass, MirSource};
|
||||
use rustc_middle::mir::{
|
||||
BasicBlock, BasicBlockData, Body, BodyAndCache, Local, Operand, Rvalue, StatementKind,
|
||||
TerminatorKind,
|
||||
BasicBlock, BasicBlockData, Body, Local, Operand, Rvalue, StatementKind, TerminatorKind,
|
||||
};
|
||||
use rustc_middle::ty::layout::TyAndLayout;
|
||||
use rustc_middle::ty::{Ty, TyCtxt};
|
||||
|
@ -67,7 +66,7 @@ fn variant_discriminants<'tcx>(
|
|||
}
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for UninhabitedEnumBranching {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, source: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
if source.promoted.is_some() {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ use std::borrow::Cow;
|
|||
pub struct UnreachablePropagation;
|
||||
|
||||
impl MirPass<'_> for UnreachablePropagation {
|
||||
fn run_pass<'tcx>(&self, tcx: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut BodyAndCache<'tcx>) {
|
||||
fn run_pass<'tcx>(&self, tcx: TyCtxt<'tcx>, _: MirSource<'tcx>, body: &mut Body<'tcx>) {
|
||||
if tcx.sess.opts.debugging_opts.mir_opt_level < 3 {
|
||||
// Enable only under -Zmir-opt-level=3 as in some cases (check the deeply-nested-opt
|
||||
// perf benchmark) LLVM may spend quite a lot of time optimizing the generated code.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
use rustc_index::vec::IndexVec;
|
||||
use rustc_middle::mir::visit::{MutVisitor, PlaceContext, Visitor};
|
||||
use rustc_middle::mir::{Body, BodyAndCache, Local, Location, ReadOnlyBodyAndCache, VarDebugInfo};
|
||||
use rustc_middle::mir::{Body, Local, Location, VarDebugInfo};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use std::mem;
|
||||
|
||||
|
@ -28,7 +28,7 @@ impl DefUseAnalysis {
|
|||
DefUseAnalysis { info: IndexVec::from_elem_n(Info::new(), body.local_decls.len()) }
|
||||
}
|
||||
|
||||
pub fn analyze(&mut self, body: ReadOnlyBodyAndCache<'_, '_>) {
|
||||
pub fn analyze(&mut self, body: &Body<'_>) {
|
||||
self.clear();
|
||||
|
||||
let mut finder = DefUseFinder {
|
||||
|
@ -53,7 +53,7 @@ impl DefUseAnalysis {
|
|||
fn mutate_defs_and_uses(
|
||||
&self,
|
||||
local: Local,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
new_local: Local,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) {
|
||||
|
@ -72,7 +72,7 @@ impl DefUseAnalysis {
|
|||
pub fn replace_all_defs_and_uses_with(
|
||||
&self,
|
||||
local: Local,
|
||||
body: &mut BodyAndCache<'tcx>,
|
||||
body: &mut Body<'tcx>,
|
||||
new_local: Local,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) {
|
||||
|
|
|
@ -56,7 +56,7 @@ pub struct LivenessResult {
|
|||
|
||||
/// Computes which local variables are live within the given function
|
||||
/// `mir`, including drops.
|
||||
pub fn liveness_of_locals(body: ReadOnlyBodyAndCache<'_, '_>) -> LivenessResult {
|
||||
pub fn liveness_of_locals(body: &Body<'_>) -> LivenessResult {
|
||||
let num_live_vars = body.local_decls.len();
|
||||
|
||||
let def_use: IndexVec<_, DefsUses> =
|
||||
|
|
|
@ -121,7 +121,7 @@ impl<'tcx> MirPatch<'tcx> {
|
|||
self.make_nop.push(loc);
|
||||
}
|
||||
|
||||
pub fn apply(self, body: &mut BodyAndCache<'tcx>) {
|
||||
pub fn apply(self, body: &mut Body<'tcx>) {
|
||||
debug!("MirPatch: make nops at: {:?}", self.make_nop);
|
||||
for loc in self.make_nop {
|
||||
body.make_statement_nop(loc);
|
||||
|
|
|
@ -21,12 +21,12 @@ use rustc_target::spec::PanicStrategy;
|
|||
|
||||
use super::lints;
|
||||
|
||||
crate fn mir_built(tcx: TyCtxt<'_>, def_id: DefId) -> &ty::steal::Steal<BodyAndCache<'_>> {
|
||||
crate fn mir_built(tcx: TyCtxt<'_>, def_id: DefId) -> &ty::steal::Steal<Body<'_>> {
|
||||
tcx.alloc_steal_mir(mir_build(tcx, def_id))
|
||||
}
|
||||
|
||||
/// Construct the MIR for a given `DefId`.
|
||||
fn mir_build(tcx: TyCtxt<'_>, def_id: DefId) -> BodyAndCache<'_> {
|
||||
fn mir_build(tcx: TyCtxt<'_>, def_id: DefId) -> Body<'_> {
|
||||
let id = tcx.hir().as_local_hir_id(def_id).unwrap();
|
||||
|
||||
// Figure out what primary body this item has.
|
||||
|
@ -183,9 +183,6 @@ fn mir_build(tcx: TyCtxt<'_>, def_id: DefId) -> BodyAndCache<'_> {
|
|||
|
||||
lints::check(tcx, &body, def_id);
|
||||
|
||||
let mut body = BodyAndCache::new(body);
|
||||
body.ensure_predecessors();
|
||||
|
||||
// The borrow checker will replace all the regions here with its own
|
||||
// inference variables. There's no point having non-erased regions here.
|
||||
// The exception is `body.user_type_annotations`, which is used unmodified
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue