mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Reduce visibilities, and add warn(unreachable_pub)
.
Lots of unnecessary `pub`s in this crate. Most are downgraded to `pub(super)`, though some don't need any visibility.
This commit is contained in:
parent
adf8d168af
commit
6af470e360
@ -20,7 +20,7 @@ use rustc_target::spec::PanicStrategy;
|
|||||||
/// This forces all unwinds, in panic=abort mode happening in foreign code, to
|
/// This forces all unwinds, in panic=abort mode happening in foreign code, to
|
||||||
/// trigger a process abort.
|
/// trigger a process abort.
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
pub struct AbortUnwindingCalls;
|
pub(super) struct AbortUnwindingCalls;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for AbortUnwindingCalls {
|
impl<'tcx> crate::MirPass<'tcx> for AbortUnwindingCalls {
|
||||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
|
@ -4,11 +4,11 @@ use rustc_middle::ty::TyCtxt;
|
|||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
pub enum AddCallGuards {
|
pub(super) enum AddCallGuards {
|
||||||
AllCallEdges,
|
AllCallEdges,
|
||||||
CriticalCallEdges,
|
CriticalCallEdges,
|
||||||
}
|
}
|
||||||
pub use self::AddCallGuards::*;
|
pub(super) use self::AddCallGuards::*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Breaks outgoing critical edges for call terminators in the MIR.
|
* Breaks outgoing critical edges for call terminators in the MIR.
|
||||||
@ -37,7 +37,7 @@ impl<'tcx> crate::MirPass<'tcx> for AddCallGuards {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AddCallGuards {
|
impl AddCallGuards {
|
||||||
pub fn add_call_guards(&self, body: &mut Body<'_>) {
|
pub(super) fn add_call_guards(&self, body: &mut Body<'_>) {
|
||||||
let mut pred_count: IndexVec<_, _> =
|
let mut pred_count: IndexVec<_, _> =
|
||||||
body.basic_blocks.predecessors().iter().map(|ps| ps.len()).collect();
|
body.basic_blocks.predecessors().iter().map(|ps| ps.len()).collect();
|
||||||
pred_count[START_BLOCK] += 1;
|
pred_count[START_BLOCK] += 1;
|
||||||
|
@ -35,7 +35,7 @@ use crate::util;
|
|||||||
///
|
///
|
||||||
/// The storage instructions are required to avoid stack space
|
/// The storage instructions are required to avoid stack space
|
||||||
/// blowup.
|
/// blowup.
|
||||||
pub struct AddMovesForPackedDrops;
|
pub(super) struct AddMovesForPackedDrops;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for AddMovesForPackedDrops {
|
impl<'tcx> crate::MirPass<'tcx> for AddMovesForPackedDrops {
|
||||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
@ -44,7 +44,7 @@ impl<'tcx> crate::MirPass<'tcx> for AddMovesForPackedDrops {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_moves_for_packed_drops<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn add_moves_for_packed_drops<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
let patch = add_moves_for_packed_drops_patch(tcx, body);
|
let patch = add_moves_for_packed_drops_patch(tcx, body);
|
||||||
patch.apply(body);
|
patch.apply(body);
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ use rustc_hir::LangItem;
|
|||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
|
|
||||||
pub struct AddRetag;
|
pub(super) struct AddRetag;
|
||||||
|
|
||||||
/// Determine whether this type may contain a reference (or box), and thus needs retagging.
|
/// Determine whether this type may contain a reference (or box), and thus needs retagging.
|
||||||
/// We will only recurse `depth` times into Tuples/ADTs to bound the cost of this.
|
/// We will only recurse `depth` times into Tuples/ADTs to bound the cost of this.
|
||||||
|
@ -4,9 +4,9 @@ use rustc_middle::mir::visit::MutVisitor;
|
|||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
|
|
||||||
pub struct Subtyper;
|
pub(super) struct Subtyper;
|
||||||
|
|
||||||
pub struct SubTypeChecker<'a, 'tcx> {
|
struct SubTypeChecker<'a, 'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
patcher: MirPatch<'tcx>,
|
patcher: MirPatch<'tcx>,
|
||||||
local_decls: &'a IndexVec<Local, LocalDecl<'tcx>>,
|
local_decls: &'a IndexVec<Local, LocalDecl<'tcx>>,
|
||||||
@ -52,7 +52,7 @@ impl<'a, 'tcx> MutVisitor<'tcx> for SubTypeChecker<'a, 'tcx> {
|
|||||||
// // gets transformed to
|
// // gets transformed to
|
||||||
// let temp: rval_ty = rval;
|
// let temp: rval_ty = rval;
|
||||||
// let place: place_ty = temp as place_ty;
|
// let place: place_ty = temp as place_ty;
|
||||||
pub fn subtype_finder<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn subtype_finder<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
let patch = MirPatch::new(body);
|
let patch = MirPatch::new(body);
|
||||||
let mut checker = SubTypeChecker { tcx, patcher: patch, local_decls: &body.local_decls };
|
let mut checker = SubTypeChecker { tcx, patcher: patch, local_decls: &body.local_decls };
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ use rustc_middle::ty::{self, ParamEnv, Ty, TyCtxt};
|
|||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use tracing::{debug, trace};
|
use tracing::{debug, trace};
|
||||||
|
|
||||||
pub struct CheckAlignment;
|
pub(super) struct CheckAlignment;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for CheckAlignment {
|
impl<'tcx> crate::MirPass<'tcx> for CheckAlignment {
|
||||||
fn is_enabled(&self, sess: &Session) -> bool {
|
fn is_enabled(&self, sess: &Session) -> bool {
|
||||||
|
@ -8,7 +8,7 @@ use rustc_span::Span;
|
|||||||
|
|
||||||
use crate::errors;
|
use crate::errors;
|
||||||
|
|
||||||
pub struct CheckConstItemMutation;
|
pub(super) struct CheckConstItemMutation;
|
||||||
|
|
||||||
impl<'tcx> crate::MirLint<'tcx> for CheckConstItemMutation {
|
impl<'tcx> crate::MirLint<'tcx> for CheckConstItemMutation {
|
||||||
fn run_lint(&self, tcx: TyCtxt<'tcx>, body: &Body<'tcx>) {
|
fn run_lint(&self, tcx: TyCtxt<'tcx>, body: &Body<'tcx>) {
|
||||||
|
@ -5,7 +5,7 @@ use rustc_middle::ty::{self, TyCtxt};
|
|||||||
|
|
||||||
use crate::{errors, util};
|
use crate::{errors, util};
|
||||||
|
|
||||||
pub struct CheckPackedRef;
|
pub(super) struct CheckPackedRef;
|
||||||
|
|
||||||
impl<'tcx> crate::MirLint<'tcx> for CheckPackedRef {
|
impl<'tcx> crate::MirLint<'tcx> for CheckPackedRef {
|
||||||
fn run_lint(&self, tcx: TyCtxt<'tcx>, body: &Body<'tcx>) {
|
fn run_lint(&self, tcx: TyCtxt<'tcx>, body: &Body<'tcx>) {
|
||||||
|
@ -21,7 +21,7 @@ use rustc_middle::mir::{Body, BorrowKind, CastKind, Rvalue, StatementKind, Termi
|
|||||||
use rustc_middle::ty::adjustment::PointerCoercion;
|
use rustc_middle::ty::adjustment::PointerCoercion;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
|
|
||||||
pub struct CleanupPostBorrowck;
|
pub(super) struct CleanupPostBorrowck;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for CleanupPostBorrowck {
|
impl<'tcx> crate::MirPass<'tcx> for CleanupPostBorrowck {
|
||||||
fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
|
@ -17,7 +17,7 @@ use crate::ssa::SsaLocals;
|
|||||||
/// where each of the locals is only assigned once.
|
/// where each of the locals is only assigned once.
|
||||||
///
|
///
|
||||||
/// We want to replace all those locals by `_a`, either copied or moved.
|
/// We want to replace all those locals by `_a`, either copied or moved.
|
||||||
pub struct CopyProp;
|
pub(super) struct CopyProp;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for CopyProp {
|
impl<'tcx> crate::MirPass<'tcx> for CopyProp {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
mod by_move_body;
|
mod by_move_body;
|
||||||
use std::{iter, ops};
|
use std::{iter, ops};
|
||||||
|
|
||||||
pub use by_move_body::coroutine_by_move_body_def_id;
|
pub(super) use by_move_body::coroutine_by_move_body_def_id;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::pluralize;
|
use rustc_errors::pluralize;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
@ -85,7 +85,7 @@ use tracing::{debug, instrument, trace};
|
|||||||
use crate::deref_separator::deref_finder;
|
use crate::deref_separator::deref_finder;
|
||||||
use crate::{abort_unwinding_calls, errors, pass_manager as pm, simplify};
|
use crate::{abort_unwinding_calls, errors, pass_manager as pm, simplify};
|
||||||
|
|
||||||
pub struct StateTransform;
|
pub(super) struct StateTransform;
|
||||||
|
|
||||||
struct RenameLocalVisitor<'tcx> {
|
struct RenameLocalVisitor<'tcx> {
|
||||||
from: Local,
|
from: Local,
|
||||||
|
@ -82,7 +82,7 @@ use rustc_middle::ty::{self, InstanceKind, Ty, TyCtxt, TypeVisitableExt};
|
|||||||
use rustc_span::symbol::kw;
|
use rustc_span::symbol::kw;
|
||||||
use rustc_target::abi::{FieldIdx, VariantIdx};
|
use rustc_target::abi::{FieldIdx, VariantIdx};
|
||||||
|
|
||||||
pub fn coroutine_by_move_body_def_id<'tcx>(
|
pub(crate) fn coroutine_by_move_body_def_id<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
coroutine_def_id: LocalDefId,
|
coroutine_def_id: LocalDefId,
|
||||||
) -> DefId {
|
) -> DefId {
|
||||||
|
@ -12,7 +12,7 @@ const CONST_SWITCH_BONUS: usize = 10;
|
|||||||
|
|
||||||
/// Verify that the callee body is compatible with the caller.
|
/// Verify that the callee body is compatible with the caller.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub(crate) struct CostChecker<'b, 'tcx> {
|
pub(super) struct CostChecker<'b, 'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ParamEnv<'tcx>,
|
param_env: ParamEnv<'tcx>,
|
||||||
penalty: usize,
|
penalty: usize,
|
||||||
@ -22,7 +22,7 @@ pub(crate) struct CostChecker<'b, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'b, 'tcx> CostChecker<'b, 'tcx> {
|
impl<'b, 'tcx> CostChecker<'b, 'tcx> {
|
||||||
pub fn new(
|
pub(super) fn new(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ParamEnv<'tcx>,
|
param_env: ParamEnv<'tcx>,
|
||||||
instance: Option<ty::Instance<'tcx>>,
|
instance: Option<ty::Instance<'tcx>>,
|
||||||
@ -36,7 +36,7 @@ impl<'b, 'tcx> CostChecker<'b, 'tcx> {
|
|||||||
/// Needed because the `CostChecker` is used sometimes for just blocks,
|
/// Needed because the `CostChecker` is used sometimes for just blocks,
|
||||||
/// and even the full `Inline` doesn't call `visit_body`, so there's nowhere
|
/// and even the full `Inline` doesn't call `visit_body`, so there's nowhere
|
||||||
/// to put this logic in the visitor.
|
/// to put this logic in the visitor.
|
||||||
pub fn add_function_level_costs(&mut self) {
|
pub(super) fn add_function_level_costs(&mut self) {
|
||||||
fn is_call_like(bbd: &BasicBlockData<'_>) -> bool {
|
fn is_call_like(bbd: &BasicBlockData<'_>) -> bool {
|
||||||
use TerminatorKind::*;
|
use TerminatorKind::*;
|
||||||
match bbd.terminator().kind {
|
match bbd.terminator().kind {
|
||||||
@ -64,7 +64,7 @@ impl<'b, 'tcx> CostChecker<'b, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cost(&self) -> usize {
|
pub(super) fn cost(&self) -> usize {
|
||||||
usize::saturating_sub(self.penalty, self.bonus)
|
usize::saturating_sub(self.penalty, self.bonus)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
pub mod query;
|
pub(super) mod query;
|
||||||
|
|
||||||
mod counters;
|
mod counters;
|
||||||
mod graph;
|
mod graph;
|
||||||
@ -32,7 +32,7 @@ use crate::coverage::mappings::ExtractedMappings;
|
|||||||
/// Inserts `StatementKind::Coverage` statements that either instrument the binary with injected
|
/// Inserts `StatementKind::Coverage` statements that either instrument the binary with injected
|
||||||
/// counters, via intrinsic `llvm.instrprof.increment`, and/or inject metadata used during codegen
|
/// counters, via intrinsic `llvm.instrprof.increment`, and/or inject metadata used during codegen
|
||||||
/// to construct the coverage map.
|
/// to construct the coverage map.
|
||||||
pub struct InstrumentCoverage;
|
pub(super) struct InstrumentCoverage;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for InstrumentCoverage {
|
impl<'tcx> crate::MirPass<'tcx> for InstrumentCoverage {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -10,7 +10,7 @@ use rustc_span::sym;
|
|||||||
|
|
||||||
use crate::{inline, pass_manager as pm};
|
use crate::{inline, pass_manager as pm};
|
||||||
|
|
||||||
pub fn provide(providers: &mut Providers) {
|
pub(super) fn provide(providers: &mut Providers) {
|
||||||
providers.cross_crate_inlinable = cross_crate_inlinable;
|
providers.cross_crate_inlinable = cross_crate_inlinable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ use rustc_middle::mir::{
|
|||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
pub struct CtfeLimit;
|
pub(super) struct CtfeLimit;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for CtfeLimit {
|
impl<'tcx> crate::MirPass<'tcx> for CtfeLimit {
|
||||||
#[instrument(skip(self, _tcx, body))]
|
#[instrument(skip(self, _tcx, body))]
|
||||||
|
@ -26,7 +26,7 @@ use tracing::{debug, debug_span, instrument};
|
|||||||
const BLOCK_LIMIT: usize = 100;
|
const BLOCK_LIMIT: usize = 100;
|
||||||
const PLACE_LIMIT: usize = 100;
|
const PLACE_LIMIT: usize = 100;
|
||||||
|
|
||||||
pub struct DataflowConstProp;
|
pub(super) struct DataflowConstProp;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for DataflowConstProp {
|
impl<'tcx> crate::MirPass<'tcx> for DataflowConstProp {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
@ -332,7 +332,7 @@ impl<'tcx> ValueAnalysis<'tcx> for ConstAnalysis<'_, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> ConstAnalysis<'a, 'tcx> {
|
impl<'a, 'tcx> ConstAnalysis<'a, 'tcx> {
|
||||||
pub fn new(tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, map: Map<'tcx>) -> Self {
|
fn new(tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, map: Map<'tcx>) -> Self {
|
||||||
let param_env = tcx.param_env_reveal_all_normalized(body.source.def_id());
|
let param_env = tcx.param_env_reveal_all_normalized(body.source.def_id());
|
||||||
Self {
|
Self {
|
||||||
map,
|
map,
|
||||||
|
@ -28,7 +28,7 @@ use crate::util::is_within_packed;
|
|||||||
///
|
///
|
||||||
/// The `borrowed` set must be a `BitSet` of all the locals that are ever borrowed in this body. It
|
/// The `borrowed` set must be a `BitSet` of all the locals that are ever borrowed in this body. It
|
||||||
/// can be generated via the [`borrowed_locals`] function.
|
/// can be generated via the [`borrowed_locals`] function.
|
||||||
pub fn eliminate<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn eliminate<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
let borrowed_locals = borrowed_locals(body);
|
let borrowed_locals = borrowed_locals(body);
|
||||||
|
|
||||||
// If the user requests complete debuginfo, mark the locals that appear in it as live, so
|
// If the user requests complete debuginfo, mark the locals that appear in it as live, so
|
||||||
@ -127,7 +127,7 @@ pub fn eliminate<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum DeadStoreElimination {
|
pub(super) enum DeadStoreElimination {
|
||||||
Initial,
|
Initial,
|
||||||
Final,
|
Final,
|
||||||
}
|
}
|
||||||
|
@ -150,7 +150,7 @@ fn type_will_always_be_passed_directly(ty: Ty<'_>) -> bool {
|
|||||||
/// body of the function instead of just the signature. These can be useful for optimization
|
/// body of the function instead of just the signature. These can be useful for optimization
|
||||||
/// purposes on a best-effort basis. We compute them here and store them into the crate metadata so
|
/// purposes on a best-effort basis. We compute them here and store them into the crate metadata so
|
||||||
/// dependent crates can use them.
|
/// dependent crates can use them.
|
||||||
pub fn deduced_param_attrs<'tcx>(
|
pub(super) fn deduced_param_attrs<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def_id: LocalDefId,
|
def_id: LocalDefId,
|
||||||
) -> &'tcx [DeducedParamAttrs] {
|
) -> &'tcx [DeducedParamAttrs] {
|
||||||
|
@ -13,7 +13,7 @@ use tracing::debug;
|
|||||||
|
|
||||||
use super::simplify::simplify_cfg;
|
use super::simplify::simplify_cfg;
|
||||||
|
|
||||||
pub struct DeduplicateBlocks;
|
pub(super) struct DeduplicateBlocks;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for DeduplicateBlocks {
|
impl<'tcx> crate::MirPass<'tcx> for DeduplicateBlocks {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -5,9 +5,9 @@ use rustc_middle::mir::visit::{MutVisitor, PlaceContext};
|
|||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
|
|
||||||
pub struct Derefer;
|
pub(super) struct Derefer;
|
||||||
|
|
||||||
pub struct DerefChecker<'a, 'tcx> {
|
struct DerefChecker<'a, 'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
patcher: MirPatch<'tcx>,
|
patcher: MirPatch<'tcx>,
|
||||||
local_decls: &'a IndexVec<Local, LocalDecl<'tcx>>,
|
local_decls: &'a IndexVec<Local, LocalDecl<'tcx>>,
|
||||||
@ -67,7 +67,7 @@ impl<'a, 'tcx> MutVisitor<'tcx> for DerefChecker<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deref_finder<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
pub(super) fn deref_finder<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
let patch = MirPatch::new(body);
|
let patch = MirPatch::new(body);
|
||||||
let mut checker = DerefChecker { tcx, patcher: patch, local_decls: &body.local_decls };
|
let mut checker = DerefChecker { tcx, patcher: patch, local_decls: &body.local_decls };
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ use rustc_mir_dataflow::points::{save_as_intervals, DenseLocationMap, PointIndex
|
|||||||
use rustc_mir_dataflow::Analysis;
|
use rustc_mir_dataflow::Analysis;
|
||||||
use tracing::{debug, trace};
|
use tracing::{debug, trace};
|
||||||
|
|
||||||
pub struct DestinationPropagation;
|
pub(super) struct DestinationPropagation;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for DestinationPropagation {
|
impl<'tcx> crate::MirPass<'tcx> for DestinationPropagation {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -7,7 +7,7 @@ use rustc_middle::mir::{write_mir_pretty, Body};
|
|||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_session::config::{OutFileName, OutputType};
|
use rustc_session::config::{OutFileName, OutputType};
|
||||||
|
|
||||||
pub struct Marker(pub &'static str);
|
pub(super) struct Marker(pub &'static str);
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for Marker {
|
impl<'tcx> crate::MirPass<'tcx> for Marker {
|
||||||
fn name(&self) -> &'static str {
|
fn name(&self) -> &'static str {
|
||||||
|
@ -90,7 +90,7 @@ use super::simplify::simplify_cfg;
|
|||||||
/// | ... |
|
/// | ... |
|
||||||
/// =================
|
/// =================
|
||||||
/// ```
|
/// ```
|
||||||
pub struct EarlyOtherwiseBranch;
|
pub(super) struct EarlyOtherwiseBranch;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for EarlyOtherwiseBranch {
|
impl<'tcx> crate::MirPass<'tcx> for EarlyOtherwiseBranch {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -11,7 +11,7 @@ use rustc_middle::ty::{Ty, TyCtxt};
|
|||||||
use rustc_target::abi::FieldIdx;
|
use rustc_target::abi::FieldIdx;
|
||||||
|
|
||||||
/// Constructs the types used when accessing a Box's pointer
|
/// Constructs the types used when accessing a Box's pointer
|
||||||
pub fn build_ptr_tys<'tcx>(
|
fn build_ptr_tys<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
pointee: Ty<'tcx>,
|
pointee: Ty<'tcx>,
|
||||||
unique_did: DefId,
|
unique_did: DefId,
|
||||||
@ -26,7 +26,7 @@ pub fn build_ptr_tys<'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Constructs the projection needed to access a Box's pointer
|
/// Constructs the projection needed to access a Box's pointer
|
||||||
pub fn build_projection<'tcx>(
|
pub(super) fn build_projection<'tcx>(
|
||||||
unique_ty: Ty<'tcx>,
|
unique_ty: Ty<'tcx>,
|
||||||
nonnull_ty: Ty<'tcx>,
|
nonnull_ty: Ty<'tcx>,
|
||||||
ptr_ty: Ty<'tcx>,
|
ptr_ty: Ty<'tcx>,
|
||||||
@ -88,7 +88,7 @@ impl<'tcx, 'a> MutVisitor<'tcx> for ElaborateBoxDerefVisitor<'tcx, 'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ElaborateBoxDerefs;
|
pub(super) struct ElaborateBoxDerefs;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for ElaborateBoxDerefs {
|
impl<'tcx> crate::MirPass<'tcx> for ElaborateBoxDerefs {
|
||||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
|
@ -47,7 +47,7 @@ use crate::deref_separator::deref_finder;
|
|||||||
/// }
|
/// }
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
pub struct ElaborateDrops;
|
pub(super) struct ElaborateDrops;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for ElaborateDrops {
|
impl<'tcx> crate::MirPass<'tcx> for ElaborateDrops {
|
||||||
#[instrument(level = "trace", skip(self, tcx, body))]
|
#[instrument(level = "trace", skip(self, tcx, body))]
|
||||||
|
@ -64,7 +64,7 @@ impl<'a, P: std::fmt::Debug> LintDiagnostic<'a, ()> for AssertLint<P> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AssertLintKind {
|
impl AssertLintKind {
|
||||||
pub fn lint(&self) -> &'static Lint {
|
pub(crate) fn lint(&self) -> &'static Lint {
|
||||||
match self {
|
match self {
|
||||||
AssertLintKind::ArithmeticOverflow => lint::builtin::ARITHMETIC_OVERFLOW,
|
AssertLintKind::ArithmeticOverflow => lint::builtin::ARITHMETIC_OVERFLOW,
|
||||||
AssertLintKind::UnconditionalPanic => lint::builtin::UNCONDITIONAL_PANIC,
|
AssertLintKind::UnconditionalPanic => lint::builtin::UNCONDITIONAL_PANIC,
|
||||||
|
@ -11,7 +11,7 @@ use rustc_target::spec::abi::Abi;
|
|||||||
|
|
||||||
use crate::errors;
|
use crate::errors;
|
||||||
|
|
||||||
pub struct FunctionItemReferences;
|
pub(super) struct FunctionItemReferences;
|
||||||
|
|
||||||
impl<'tcx> crate::MirLint<'tcx> for FunctionItemReferences {
|
impl<'tcx> crate::MirLint<'tcx> for FunctionItemReferences {
|
||||||
fn run_lint(&self, tcx: TyCtxt<'tcx>, body: &Body<'tcx>) {
|
fn run_lint(&self, tcx: TyCtxt<'tcx>, body: &Body<'tcx>) {
|
||||||
|
@ -109,7 +109,7 @@ use tracing::{debug, instrument, trace};
|
|||||||
|
|
||||||
use crate::ssa::{AssignedValue, SsaLocals};
|
use crate::ssa::{AssignedValue, SsaLocals};
|
||||||
|
|
||||||
pub struct GVN;
|
pub(super) struct GVN;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for GVN {
|
impl<'tcx> crate::MirPass<'tcx> for GVN {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -32,6 +32,8 @@ pub(crate) mod cycle;
|
|||||||
|
|
||||||
const TOP_DOWN_DEPTH_LIMIT: usize = 5;
|
const TOP_DOWN_DEPTH_LIMIT: usize = 5;
|
||||||
|
|
||||||
|
// Made public so that `mir_drops_elaborated_and_const_checked` can be overridden
|
||||||
|
// by custom rustc drivers, running all the steps by themselves. See #114628.
|
||||||
pub struct Inline;
|
pub struct Inline;
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
|
@ -13,13 +13,13 @@ use rustc_target::spec::abi::Abi;
|
|||||||
use crate::simplify::simplify_duplicate_switch_targets;
|
use crate::simplify::simplify_duplicate_switch_targets;
|
||||||
use crate::take_array;
|
use crate::take_array;
|
||||||
|
|
||||||
pub enum InstSimplify {
|
pub(super) enum InstSimplify {
|
||||||
BeforeInline,
|
BeforeInline,
|
||||||
AfterSimplifyCfg,
|
AfterSimplifyCfg,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl InstSimplify {
|
impl InstSimplify {
|
||||||
pub fn name(&self) -> &'static str {
|
fn name(&self) -> &'static str {
|
||||||
match self {
|
match self {
|
||||||
InstSimplify::BeforeInline => "InstSimplify-before-inline",
|
InstSimplify::BeforeInline => "InstSimplify-before-inline",
|
||||||
InstSimplify::AfterSimplifyCfg => "InstSimplify-after-simplifycfg",
|
InstSimplify::AfterSimplifyCfg => "InstSimplify-after-simplifycfg",
|
||||||
|
@ -55,7 +55,7 @@ use tracing::{debug, instrument, trace};
|
|||||||
|
|
||||||
use crate::cost_checker::CostChecker;
|
use crate::cost_checker::CostChecker;
|
||||||
|
|
||||||
pub struct JumpThreading;
|
pub(super) struct JumpThreading;
|
||||||
|
|
||||||
const MAX_BACKTRACK: usize = 5;
|
const MAX_BACKTRACK: usize = 5;
|
||||||
const MAX_COST: usize = 100;
|
const MAX_COST: usize = 100;
|
||||||
|
@ -26,7 +26,7 @@ use tracing::{debug, instrument, trace};
|
|||||||
|
|
||||||
use crate::errors::{AssertLint, AssertLintKind};
|
use crate::errors::{AssertLint, AssertLintKind};
|
||||||
|
|
||||||
pub struct KnownPanicsLint;
|
pub(super) struct KnownPanicsLint;
|
||||||
|
|
||||||
impl<'tcx> crate::MirLint<'tcx> for KnownPanicsLint {
|
impl<'tcx> crate::MirLint<'tcx> for KnownPanicsLint {
|
||||||
fn run_lint(&self, tcx: TyCtxt<'tcx>, body: &Body<'tcx>) {
|
fn run_lint(&self, tcx: TyCtxt<'tcx>, body: &Body<'tcx>) {
|
||||||
@ -852,7 +852,7 @@ const MAX_ALLOC_LIMIT: u64 = 1024;
|
|||||||
|
|
||||||
/// The mode that `ConstProp` is allowed to run in for a given `Local`.
|
/// The mode that `ConstProp` is allowed to run in for a given `Local`.
|
||||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||||
pub enum ConstPropMode {
|
enum ConstPropMode {
|
||||||
/// The `Local` can be propagated into and reads of this `Local` can also be propagated.
|
/// The `Local` can be propagated into and reads of this `Local` can also be propagated.
|
||||||
FullConstProp,
|
FullConstProp,
|
||||||
/// The `Local` can only be propagated into and from its own block.
|
/// The `Local` can only be propagated into and from its own block.
|
||||||
@ -864,7 +864,7 @@ pub enum ConstPropMode {
|
|||||||
|
|
||||||
/// A visitor that determines locals in a MIR body
|
/// A visitor that determines locals in a MIR body
|
||||||
/// that can be const propagated
|
/// that can be const propagated
|
||||||
pub struct CanConstProp {
|
struct CanConstProp {
|
||||||
can_const_prop: IndexVec<Local, ConstPropMode>,
|
can_const_prop: IndexVec<Local, ConstPropMode>,
|
||||||
// False at the beginning. Once set, no more assignments are allowed to that local.
|
// False at the beginning. Once set, no more assignments are allowed to that local.
|
||||||
found_assignment: BitSet<Local>,
|
found_assignment: BitSet<Local>,
|
||||||
@ -872,7 +872,7 @@ pub struct CanConstProp {
|
|||||||
|
|
||||||
impl CanConstProp {
|
impl CanConstProp {
|
||||||
/// Returns true if `local` can be propagated
|
/// Returns true if `local` can be propagated
|
||||||
pub fn check<'tcx>(
|
fn check<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ParamEnv<'tcx>,
|
param_env: ParamEnv<'tcx>,
|
||||||
body: &Body<'tcx>,
|
body: &Body<'tcx>,
|
||||||
|
@ -23,7 +23,7 @@ use rustc_target::abi::{HasDataLayout, Size, TagEncoding, Variants};
|
|||||||
/// In summary, what this does is at runtime determine which enum variant is active,
|
/// In summary, what this does is at runtime determine which enum variant is active,
|
||||||
/// and instead of copying all the bytes of the largest possible variant,
|
/// and instead of copying all the bytes of the largest possible variant,
|
||||||
/// copy only the bytes for the currently active variant.
|
/// copy only the bytes for the currently active variant.
|
||||||
pub struct EnumSizeOpt {
|
pub(super) struct EnumSizeOpt {
|
||||||
pub(crate) discrepancy: u64,
|
pub(crate) discrepancy: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#![feature(round_char_boundary)]
|
#![feature(round_char_boundary)]
|
||||||
#![feature(try_blocks)]
|
#![feature(try_blocks)]
|
||||||
#![feature(yeet_expr)]
|
#![feature(yeet_expr)]
|
||||||
|
#![warn(unreachable_pub)]
|
||||||
// tidy-alphabetical-end
|
// tidy-alphabetical-end
|
||||||
|
|
||||||
use hir::ConstContext;
|
use hir::ConstContext;
|
||||||
@ -72,6 +73,8 @@ mod errors;
|
|||||||
mod ffi_unwind_calls;
|
mod ffi_unwind_calls;
|
||||||
mod function_item_references;
|
mod function_item_references;
|
||||||
mod gvn;
|
mod gvn;
|
||||||
|
// Made public so that `mir_drops_elaborated_and_const_checked` can be overridden
|
||||||
|
// by custom rustc drivers, running all the steps by themselves. See #114628.
|
||||||
pub mod inline;
|
pub mod inline;
|
||||||
mod instsimplify;
|
mod instsimplify;
|
||||||
mod jump_threading;
|
mod jump_threading;
|
||||||
@ -459,8 +462,8 @@ fn mir_drops_elaborated_and_const_checked(tcx: TyCtxt<'_>, def: LocalDefId) -> &
|
|||||||
tcx.alloc_steal_mir(body)
|
tcx.alloc_steal_mir(body)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Made public such that `mir_drops_elaborated_and_const_checked` can be overridden
|
// Made public so that `mir_drops_elaborated_and_const_checked` can be overridden
|
||||||
// by custom rustc drivers, running all the steps by themselves.
|
// by custom rustc drivers, running all the steps by themselves. See #114628.
|
||||||
pub fn run_analysis_to_runtime_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
pub fn run_analysis_to_runtime_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
assert!(body.phase == MirPhase::Analysis(AnalysisPhase::Initial));
|
assert!(body.phase == MirPhase::Analysis(AnalysisPhase::Initial));
|
||||||
let did = body.source.def_id();
|
let did = body.source.def_id();
|
||||||
|
@ -13,7 +13,7 @@ use rustc_mir_dataflow::impls::{MaybeStorageDead, MaybeStorageLive};
|
|||||||
use rustc_mir_dataflow::storage::always_storage_live_locals;
|
use rustc_mir_dataflow::storage::always_storage_live_locals;
|
||||||
use rustc_mir_dataflow::{Analysis, ResultsCursor};
|
use rustc_mir_dataflow::{Analysis, ResultsCursor};
|
||||||
|
|
||||||
pub fn lint_body<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, when: String) {
|
pub(super) fn lint_body<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, when: String) {
|
||||||
let always_live_locals = &always_storage_live_locals(body);
|
let always_live_locals = &always_storage_live_locals(body);
|
||||||
|
|
||||||
let maybe_storage_live = MaybeStorageLive::new(Cow::Borrowed(always_live_locals))
|
let maybe_storage_live = MaybeStorageLive::new(Cow::Borrowed(always_live_locals))
|
||||||
|
@ -7,7 +7,7 @@ use rustc_span::symbol::sym;
|
|||||||
|
|
||||||
use crate::take_array;
|
use crate::take_array;
|
||||||
|
|
||||||
pub struct LowerIntrinsics;
|
pub(super) struct LowerIntrinsics;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for LowerIntrinsics {
|
impl<'tcx> crate::MirPass<'tcx> for LowerIntrinsics {
|
||||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
|
@ -5,7 +5,7 @@ use rustc_hir::def_id::DefId;
|
|||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
|
|
||||||
pub struct LowerSliceLenCalls;
|
pub(super) struct LowerSliceLenCalls;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for LowerSliceLenCalls {
|
impl<'tcx> crate::MirPass<'tcx> for LowerSliceLenCalls {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
@ -17,7 +17,7 @@ impl<'tcx> crate::MirPass<'tcx> for LowerSliceLenCalls {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn lower_slice_len_calls<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn lower_slice_len_calls<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
let language_items = tcx.lang_items();
|
let language_items = tcx.lang_items();
|
||||||
let Some(slice_len_fn_item_def_id) = language_items.slice_len_fn() else {
|
let Some(slice_len_fn_item_def_id) = language_items.slice_len_fn() else {
|
||||||
// there is no lang item to compare to :)
|
// there is no lang item to compare to :)
|
||||||
|
@ -10,7 +10,7 @@ use rustc_type_ir::TyKind::*;
|
|||||||
|
|
||||||
use super::simplify::simplify_cfg;
|
use super::simplify::simplify_cfg;
|
||||||
|
|
||||||
pub struct MatchBranchSimplification;
|
pub(super) struct MatchBranchSimplification;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for MatchBranchSimplification {
|
impl<'tcx> crate::MirPass<'tcx> for MatchBranchSimplification {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -5,7 +5,7 @@ use rustc_middle::ty::{self, TyCtxt};
|
|||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
|
|
||||||
pub struct MentionedItems;
|
pub(super) struct MentionedItems;
|
||||||
|
|
||||||
struct MentionedItemsVisitor<'a, 'tcx> {
|
struct MentionedItemsVisitor<'a, 'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
|
@ -7,7 +7,7 @@ use rustc_middle::ty::TyCtxt;
|
|||||||
|
|
||||||
use crate::simplify;
|
use crate::simplify;
|
||||||
|
|
||||||
pub struct MultipleReturnTerminators;
|
pub(super) struct MultipleReturnTerminators;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for MultipleReturnTerminators {
|
impl<'tcx> crate::MirPass<'tcx> for MultipleReturnTerminators {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -30,7 +30,7 @@ use tracing::{debug, trace};
|
|||||||
///
|
///
|
||||||
/// [#47954]: https://github.com/rust-lang/rust/pull/47954
|
/// [#47954]: https://github.com/rust-lang/rust/pull/47954
|
||||||
/// [#71003]: https://github.com/rust-lang/rust/pull/71003
|
/// [#71003]: https://github.com/rust-lang/rust/pull/71003
|
||||||
pub struct RenameReturnPlace;
|
pub(super) struct RenameReturnPlace;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for RenameReturnPlace {
|
impl<'tcx> crate::MirPass<'tcx> for RenameReturnPlace {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -269,12 +269,7 @@ pub(super) fn validate_body<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>, when
|
|||||||
validate::Validator { when, mir_phase: body.phase }.run_pass(tcx, body);
|
validate::Validator { when, mir_phase: body.phase }.run_pass(tcx, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn dump_mir_for_pass<'tcx>(
|
fn dump_mir_for_pass<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, pass_name: &str, is_after: bool) {
|
||||||
tcx: TyCtxt<'tcx>,
|
|
||||||
body: &Body<'tcx>,
|
|
||||||
pass_name: &str,
|
|
||||||
is_after: bool,
|
|
||||||
) {
|
|
||||||
mir::dump_mir(
|
mir::dump_mir(
|
||||||
tcx,
|
tcx,
|
||||||
true,
|
true,
|
||||||
|
@ -15,7 +15,7 @@ use rustc_session::Session;
|
|||||||
///
|
///
|
||||||
/// Thus after this pass, all the successors of a block are later than it in the
|
/// Thus after this pass, all the successors of a block are later than it in the
|
||||||
/// `IndexVec`, unless that successor is a back-edge (such as from a loop).
|
/// `IndexVec`, unless that successor is a back-edge (such as from a loop).
|
||||||
pub struct ReorderBasicBlocks;
|
pub(super) struct ReorderBasicBlocks;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for ReorderBasicBlocks {
|
impl<'tcx> crate::MirPass<'tcx> for ReorderBasicBlocks {
|
||||||
fn is_enabled(&self, _session: &Session) -> bool {
|
fn is_enabled(&self, _session: &Session) -> bool {
|
||||||
@ -43,7 +43,7 @@ impl<'tcx> crate::MirPass<'tcx> for ReorderBasicBlocks {
|
|||||||
/// assigned or referenced will have a smaller number.
|
/// assigned or referenced will have a smaller number.
|
||||||
///
|
///
|
||||||
/// (Does not reorder arguments nor the [`RETURN_PLACE`].)
|
/// (Does not reorder arguments nor the [`RETURN_PLACE`].)
|
||||||
pub struct ReorderLocals;
|
pub(super) struct ReorderLocals;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for ReorderLocals {
|
impl<'tcx> crate::MirPass<'tcx> for ReorderLocals {
|
||||||
fn is_enabled(&self, _session: &Session) -> bool {
|
fn is_enabled(&self, _session: &Session) -> bool {
|
||||||
@ -135,8 +135,8 @@ impl<'tcx> Visitor<'tcx> for LocalFinder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct LocalUpdater<'tcx> {
|
struct LocalUpdater<'tcx> {
|
||||||
pub map: IndexVec<Local, Local>,
|
map: IndexVec<Local, Local>,
|
||||||
pub tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> MutVisitor<'tcx> for LocalUpdater<'tcx> {
|
impl<'tcx> MutVisitor<'tcx> for LocalUpdater<'tcx> {
|
||||||
|
@ -37,7 +37,7 @@ use tracing::{debug, instrument};
|
|||||||
/// After this pass is run, `promoted_fragments` will hold the MIR body corresponding to each
|
/// After this pass is run, `promoted_fragments` will hold the MIR body corresponding to each
|
||||||
/// newly created `Constant`.
|
/// newly created `Constant`.
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct PromoteTemps<'tcx> {
|
pub(super) struct PromoteTemps<'tcx> {
|
||||||
pub promoted_fragments: Cell<IndexVec<Promoted, Body<'tcx>>>,
|
pub promoted_fragments: Cell<IndexVec<Promoted, Body<'tcx>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ use crate::ssa::{SsaLocals, StorageLiveLocals};
|
|||||||
///
|
///
|
||||||
/// For immutable borrows, we do not need to preserve such uniqueness property,
|
/// For immutable borrows, we do not need to preserve such uniqueness property,
|
||||||
/// so we perform all the possible instantiations without removing the `_1 = &_2` statement.
|
/// so we perform all the possible instantiations without removing the `_1 = &_2` statement.
|
||||||
pub struct ReferencePropagation;
|
pub(super) struct ReferencePropagation;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for ReferencePropagation {
|
impl<'tcx> crate::MirPass<'tcx> for ReferencePropagation {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -8,7 +8,7 @@ use tracing::debug;
|
|||||||
/// A pass that removes noop landing pads and replaces jumps to them with
|
/// A pass that removes noop landing pads and replaces jumps to them with
|
||||||
/// `UnwindAction::Continue`. This is important because otherwise LLVM generates
|
/// `UnwindAction::Continue`. This is important because otherwise LLVM generates
|
||||||
/// terrible code for these.
|
/// terrible code for these.
|
||||||
pub struct RemoveNoopLandingPads;
|
pub(super) struct RemoveNoopLandingPads;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for RemoveNoopLandingPads {
|
impl<'tcx> crate::MirPass<'tcx> for RemoveNoopLandingPads {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -4,7 +4,7 @@ use rustc_middle::mir::*;
|
|||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use tracing::trace;
|
use tracing::trace;
|
||||||
|
|
||||||
pub struct RemovePlaceMention;
|
pub(super) struct RemovePlaceMention;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for RemovePlaceMention {
|
impl<'tcx> crate::MirPass<'tcx> for RemovePlaceMention {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -4,7 +4,7 @@ use rustc_middle::mir::*;
|
|||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use tracing::trace;
|
use tracing::trace;
|
||||||
|
|
||||||
pub struct RemoveStorageMarkers;
|
pub(super) struct RemoveStorageMarkers;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for RemoveStorageMarkers {
|
impl<'tcx> crate::MirPass<'tcx> for RemoveStorageMarkers {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -14,7 +14,7 @@ use rustc_target::abi::FieldIdx;
|
|||||||
/// like [#90770].
|
/// like [#90770].
|
||||||
///
|
///
|
||||||
/// [#90770]: https://github.com/rust-lang/rust/issues/90770
|
/// [#90770]: https://github.com/rust-lang/rust/issues/90770
|
||||||
pub struct RemoveUninitDrops;
|
pub(super) struct RemoveUninitDrops;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for RemoveUninitDrops {
|
impl<'tcx> crate::MirPass<'tcx> for RemoveUninitDrops {
|
||||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
|
@ -10,7 +10,7 @@ use tracing::{debug, trace};
|
|||||||
|
|
||||||
use super::simplify::simplify_cfg;
|
use super::simplify::simplify_cfg;
|
||||||
|
|
||||||
pub struct RemoveUnneededDrops;
|
pub(super) struct RemoveUnneededDrops;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for RemoveUnneededDrops {
|
impl<'tcx> crate::MirPass<'tcx> for RemoveUnneededDrops {
|
||||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
|
@ -4,7 +4,7 @@ use rustc_middle::mir::visit::*;
|
|||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
|
|
||||||
pub struct RemoveZsts;
|
pub(super) struct RemoveZsts;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for RemoveZsts {
|
impl<'tcx> crate::MirPass<'tcx> for RemoveZsts {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use rustc_middle::mir::visit::Visitor;
|
use rustc_middle::mir::visit::Visitor;
|
||||||
use rustc_middle::mir::{traversal, Body, ConstOperand, Location};
|
use rustc_middle::mir::{traversal, Body, ConstOperand, Location};
|
||||||
|
|
||||||
pub struct RequiredConstsVisitor<'a, 'tcx> {
|
pub(super) struct RequiredConstsVisitor<'a, 'tcx> {
|
||||||
required_consts: &'a mut Vec<ConstOperand<'tcx>>,
|
required_consts: &'a mut Vec<ConstOperand<'tcx>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ impl<'a, 'tcx> RequiredConstsVisitor<'a, 'tcx> {
|
|||||||
RequiredConstsVisitor { required_consts }
|
RequiredConstsVisitor { required_consts }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn compute_required_consts(body: &mut Body<'tcx>) {
|
pub(super) fn compute_required_consts(body: &mut Body<'tcx>) {
|
||||||
let mut required_consts = Vec::new();
|
let mut required_consts = Vec::new();
|
||||||
let mut required_consts_visitor = RequiredConstsVisitor::new(&mut required_consts);
|
let mut required_consts_visitor = RequiredConstsVisitor::new(&mut required_consts);
|
||||||
for (bb, bb_data) in traversal::reverse_postorder(&body) {
|
for (bb, bb_data) in traversal::reverse_postorder(&body) {
|
||||||
|
@ -4,7 +4,7 @@ use rustc_middle::mir::visit::*;
|
|||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
|
|
||||||
pub struct RevealAll;
|
pub(super) struct RevealAll;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for RevealAll {
|
impl<'tcx> crate::MirPass<'tcx> for RevealAll {
|
||||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
|
@ -26,7 +26,7 @@ use crate::{
|
|||||||
|
|
||||||
mod async_destructor_ctor;
|
mod async_destructor_ctor;
|
||||||
|
|
||||||
pub fn provide(providers: &mut Providers) {
|
pub(super) fn provide(providers: &mut Providers) {
|
||||||
providers.mir_shims = make_shim;
|
providers.mir_shims = make_shim;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,7 +331,7 @@ fn new_body<'tcx>(
|
|||||||
body
|
body
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct DropShimElaborator<'a, 'tcx> {
|
pub(super) struct DropShimElaborator<'a, 'tcx> {
|
||||||
pub body: &'a Body<'tcx>,
|
pub body: &'a Body<'tcx>,
|
||||||
pub patch: MirPatch<'tcx>,
|
pub patch: MirPatch<'tcx>,
|
||||||
pub tcx: TyCtxt<'tcx>,
|
pub tcx: TyCtxt<'tcx>,
|
||||||
@ -913,7 +913,7 @@ fn build_call_shim<'tcx>(
|
|||||||
body
|
body
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_adt_ctor(tcx: TyCtxt<'_>, ctor_id: DefId) -> Body<'_> {
|
pub(super) fn build_adt_ctor(tcx: TyCtxt<'_>, ctor_id: DefId) -> Body<'_> {
|
||||||
debug_assert!(tcx.is_constructor(ctor_id));
|
debug_assert!(tcx.is_constructor(ctor_id));
|
||||||
|
|
||||||
let param_env = tcx.param_env_reveal_all_normalized(ctor_id);
|
let param_env = tcx.param_env_reveal_all_normalized(ctor_id);
|
||||||
|
@ -23,7 +23,7 @@ use tracing::debug;
|
|||||||
|
|
||||||
use super::{local_decls_for_sig, new_body};
|
use super::{local_decls_for_sig, new_body};
|
||||||
|
|
||||||
pub fn build_async_destructor_ctor_shim<'tcx>(
|
pub(super) fn build_async_destructor_ctor_shim<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def_id: DefId,
|
def_id: DefId,
|
||||||
ty: Option<Ty<'tcx>>,
|
ty: Option<Ty<'tcx>>,
|
||||||
|
@ -35,7 +35,7 @@ use rustc_span::DUMMY_SP;
|
|||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use tracing::{debug, trace};
|
use tracing::{debug, trace};
|
||||||
|
|
||||||
pub enum SimplifyCfg {
|
pub(super) enum SimplifyCfg {
|
||||||
Initial,
|
Initial,
|
||||||
PromoteConsts,
|
PromoteConsts,
|
||||||
RemoveFalseEdges,
|
RemoveFalseEdges,
|
||||||
@ -50,7 +50,7 @@ pub enum SimplifyCfg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl SimplifyCfg {
|
impl SimplifyCfg {
|
||||||
pub fn name(&self) -> &'static str {
|
fn name(&self) -> &'static str {
|
||||||
match self {
|
match self {
|
||||||
SimplifyCfg::Initial => "SimplifyCfg-initial",
|
SimplifyCfg::Initial => "SimplifyCfg-initial",
|
||||||
SimplifyCfg::PromoteConsts => "SimplifyCfg-promote-consts",
|
SimplifyCfg::PromoteConsts => "SimplifyCfg-promote-consts",
|
||||||
@ -66,7 +66,7 @@ impl SimplifyCfg {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn simplify_cfg(body: &mut Body<'_>) {
|
pub(super) fn simplify_cfg(body: &mut Body<'_>) {
|
||||||
CfgSimplifier::new(body).simplify();
|
CfgSimplifier::new(body).simplify();
|
||||||
remove_dead_blocks(body);
|
remove_dead_blocks(body);
|
||||||
|
|
||||||
@ -85,13 +85,13 @@ impl<'tcx> crate::MirPass<'tcx> for SimplifyCfg {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct CfgSimplifier<'a, 'tcx> {
|
struct CfgSimplifier<'a, 'tcx> {
|
||||||
basic_blocks: &'a mut IndexSlice<BasicBlock, BasicBlockData<'tcx>>,
|
basic_blocks: &'a mut IndexSlice<BasicBlock, BasicBlockData<'tcx>>,
|
||||||
pred_count: IndexVec<BasicBlock, u32>,
|
pred_count: IndexVec<BasicBlock, u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
|
impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
|
||||||
pub fn new(body: &'a mut Body<'tcx>) -> Self {
|
fn new(body: &'a mut Body<'tcx>) -> Self {
|
||||||
let mut pred_count = IndexVec::from_elem(0u32, &body.basic_blocks);
|
let mut pred_count = IndexVec::from_elem(0u32, &body.basic_blocks);
|
||||||
|
|
||||||
// we can't use mir.predecessors() here because that counts
|
// we can't use mir.predecessors() here because that counts
|
||||||
@ -111,7 +111,7 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
|
|||||||
CfgSimplifier { basic_blocks, pred_count }
|
CfgSimplifier { basic_blocks, pred_count }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn simplify(mut self) {
|
fn simplify(mut self) {
|
||||||
self.strip_nops();
|
self.strip_nops();
|
||||||
|
|
||||||
// Vec of the blocks that should be merged. We store the indices here, instead of the
|
// Vec of the blocks that should be merged. We store the indices here, instead of the
|
||||||
@ -280,7 +280,7 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn simplify_duplicate_switch_targets(terminator: &mut Terminator<'_>) {
|
pub(super) fn simplify_duplicate_switch_targets(terminator: &mut Terminator<'_>) {
|
||||||
if let TerminatorKind::SwitchInt { targets, .. } = &mut terminator.kind {
|
if let TerminatorKind::SwitchInt { targets, .. } = &mut terminator.kind {
|
||||||
let otherwise = targets.otherwise();
|
let otherwise = targets.otherwise();
|
||||||
if targets.iter().any(|t| t.1 == otherwise) {
|
if targets.iter().any(|t| t.1 == otherwise) {
|
||||||
@ -292,7 +292,7 @@ pub fn simplify_duplicate_switch_targets(terminator: &mut Terminator<'_>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn remove_dead_blocks(body: &mut Body<'_>) {
|
pub(super) fn remove_dead_blocks(body: &mut Body<'_>) {
|
||||||
let should_deduplicate_unreachable = |bbdata: &BasicBlockData<'_>| {
|
let should_deduplicate_unreachable = |bbdata: &BasicBlockData<'_>| {
|
||||||
// CfgSimplifier::simplify leaves behind some unreachable basic blocks without a
|
// CfgSimplifier::simplify leaves behind some unreachable basic blocks without a
|
||||||
// terminator. Those blocks will be deleted by remove_dead_blocks, but we run just
|
// terminator. Those blocks will be deleted by remove_dead_blocks, but we run just
|
||||||
@ -360,7 +360,7 @@ pub(crate) fn remove_dead_blocks(body: &mut Body<'_>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum SimplifyLocals {
|
pub(super) enum SimplifyLocals {
|
||||||
BeforeConstProp,
|
BeforeConstProp,
|
||||||
AfterGVN,
|
AfterGVN,
|
||||||
Final,
|
Final,
|
||||||
@ -385,7 +385,7 @@ impl<'tcx> crate::MirPass<'tcx> for SimplifyLocals {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_unused_definitions<'tcx>(body: &mut Body<'tcx>) {
|
pub(super) fn remove_unused_definitions<'tcx>(body: &mut Body<'tcx>) {
|
||||||
// First, we're going to get a count of *actual* uses for every `Local`.
|
// First, we're going to get a count of *actual* uses for every `Local`.
|
||||||
let mut used_locals = UsedLocals::new(body);
|
let mut used_locals = UsedLocals::new(body);
|
||||||
|
|
||||||
@ -397,7 +397,7 @@ pub fn remove_unused_definitions<'tcx>(body: &mut Body<'tcx>) {
|
|||||||
remove_unused_definitions_helper(&mut used_locals, body);
|
remove_unused_definitions_helper(&mut used_locals, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn simplify_locals<'tcx>(body: &mut Body<'tcx>, tcx: TyCtxt<'tcx>) {
|
fn simplify_locals<'tcx>(body: &mut Body<'tcx>, tcx: TyCtxt<'tcx>) {
|
||||||
// First, we're going to get a count of *actual* uses for every `Local`.
|
// First, we're going to get a count of *actual* uses for every `Local`.
|
||||||
let mut used_locals = UsedLocals::new(body);
|
let mut used_locals = UsedLocals::new(body);
|
||||||
|
|
||||||
|
@ -2,10 +2,11 @@ use rustc_middle::mir::*;
|
|||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use tracing::trace;
|
use tracing::trace;
|
||||||
|
|
||||||
pub enum SimplifyConstCondition {
|
pub(super) enum SimplifyConstCondition {
|
||||||
AfterConstProp,
|
AfterConstProp,
|
||||||
Final,
|
Final,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A pass that replaces a branch with a goto when its condition is known.
|
/// A pass that replaces a branch with a goto when its condition is known.
|
||||||
impl<'tcx> crate::MirPass<'tcx> for SimplifyConstCondition {
|
impl<'tcx> crate::MirPass<'tcx> for SimplifyConstCondition {
|
||||||
fn name(&self) -> &'static str {
|
fn name(&self) -> &'static str {
|
||||||
|
@ -23,7 +23,7 @@ use tracing::trace;
|
|||||||
/// ```ignore (MIR)
|
/// ```ignore (MIR)
|
||||||
/// switchInt(_4) -> [43i32: bb3, otherwise: bb2];
|
/// switchInt(_4) -> [43i32: bb3, otherwise: bb2];
|
||||||
/// ```
|
/// ```
|
||||||
pub struct SimplifyComparisonIntegral;
|
pub(super) struct SimplifyComparisonIntegral;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for SimplifyComparisonIntegral {
|
impl<'tcx> crate::MirPass<'tcx> for SimplifyComparisonIntegral {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -19,7 +19,7 @@ use rustc_middle::ty::TyCtxt;
|
|||||||
///
|
///
|
||||||
/// It also removes *never*-used constants, since it had all the information
|
/// It also removes *never*-used constants, since it had all the information
|
||||||
/// needed to do that too, including updating the debug info.
|
/// needed to do that too, including updating the debug info.
|
||||||
pub struct SingleUseConsts;
|
pub(super) struct SingleUseConsts;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for SingleUseConsts {
|
impl<'tcx> crate::MirPass<'tcx> for SingleUseConsts {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -11,7 +11,7 @@ use rustc_mir_dataflow::value_analysis::{excluded_locals, iter_fields};
|
|||||||
use rustc_target::abi::{FieldIdx, FIRST_VARIANT};
|
use rustc_target::abi::{FieldIdx, FIRST_VARIANT};
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
|
||||||
pub struct ScalarReplacementOfAggregates;
|
pub(super) struct ScalarReplacementOfAggregates;
|
||||||
|
|
||||||
impl<'tcx> crate::MirPass<'tcx> for ScalarReplacementOfAggregates {
|
impl<'tcx> crate::MirPass<'tcx> for ScalarReplacementOfAggregates {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -16,7 +16,7 @@ use rustc_middle::mir::*;
|
|||||||
use rustc_middle::ty::{ParamEnv, TyCtxt};
|
use rustc_middle::ty::{ParamEnv, TyCtxt};
|
||||||
use tracing::{debug, instrument, trace};
|
use tracing::{debug, instrument, trace};
|
||||||
|
|
||||||
pub struct SsaLocals {
|
pub(super) struct SsaLocals {
|
||||||
/// Assignments to each local. This defines whether the local is SSA.
|
/// Assignments to each local. This defines whether the local is SSA.
|
||||||
assignments: IndexVec<Local, Set1<DefLocation>>,
|
assignments: IndexVec<Local, Set1<DefLocation>>,
|
||||||
/// We visit the body in reverse postorder, to ensure each local is assigned before it is used.
|
/// We visit the body in reverse postorder, to ensure each local is assigned before it is used.
|
||||||
@ -32,14 +32,18 @@ pub struct SsaLocals {
|
|||||||
borrowed_locals: BitSet<Local>,
|
borrowed_locals: BitSet<Local>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum AssignedValue<'a, 'tcx> {
|
pub(super) enum AssignedValue<'a, 'tcx> {
|
||||||
Arg,
|
Arg,
|
||||||
Rvalue(&'a mut Rvalue<'tcx>),
|
Rvalue(&'a mut Rvalue<'tcx>),
|
||||||
Terminator,
|
Terminator,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SsaLocals {
|
impl SsaLocals {
|
||||||
pub fn new<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, param_env: ParamEnv<'tcx>) -> SsaLocals {
|
pub(super) fn new<'tcx>(
|
||||||
|
tcx: TyCtxt<'tcx>,
|
||||||
|
body: &Body<'tcx>,
|
||||||
|
param_env: ParamEnv<'tcx>,
|
||||||
|
) -> SsaLocals {
|
||||||
let assignment_order = Vec::with_capacity(body.local_decls.len());
|
let assignment_order = Vec::with_capacity(body.local_decls.len());
|
||||||
|
|
||||||
let assignments = IndexVec::from_elem(Set1::Empty, &body.local_decls);
|
let assignments = IndexVec::from_elem(Set1::Empty, &body.local_decls);
|
||||||
@ -101,25 +105,25 @@ impl SsaLocals {
|
|||||||
ssa
|
ssa
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn num_locals(&self) -> usize {
|
pub(super) fn num_locals(&self) -> usize {
|
||||||
self.assignments.len()
|
self.assignments.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn locals(&self) -> impl Iterator<Item = Local> {
|
pub(super) fn locals(&self) -> impl Iterator<Item = Local> {
|
||||||
self.assignments.indices()
|
self.assignments.indices()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_ssa(&self, local: Local) -> bool {
|
pub(super) fn is_ssa(&self, local: Local) -> bool {
|
||||||
matches!(self.assignments[local], Set1::One(_))
|
matches!(self.assignments[local], Set1::One(_))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the number of uses if a local that are not "Deref".
|
/// Return the number of uses if a local that are not "Deref".
|
||||||
pub fn num_direct_uses(&self, local: Local) -> u32 {
|
pub(super) fn num_direct_uses(&self, local: Local) -> u32 {
|
||||||
self.direct_uses[local]
|
self.direct_uses[local]
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn assignment_dominates(
|
pub(super) fn assignment_dominates(
|
||||||
&self,
|
&self,
|
||||||
dominators: &Dominators<BasicBlock>,
|
dominators: &Dominators<BasicBlock>,
|
||||||
local: Local,
|
local: Local,
|
||||||
@ -131,7 +135,7 @@ impl SsaLocals {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn assignments<'a, 'tcx>(
|
pub(super) fn assignments<'a, 'tcx>(
|
||||||
&'a self,
|
&'a self,
|
||||||
body: &'a Body<'tcx>,
|
body: &'a Body<'tcx>,
|
||||||
) -> impl Iterator<Item = (Local, &'a Rvalue<'tcx>, Location)> + 'a {
|
) -> impl Iterator<Item = (Local, &'a Rvalue<'tcx>, Location)> + 'a {
|
||||||
@ -148,7 +152,7 @@ impl SsaLocals {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn for_each_assignment_mut<'tcx>(
|
pub(super) fn for_each_assignment_mut<'tcx>(
|
||||||
&self,
|
&self,
|
||||||
basic_blocks: &mut IndexSlice<BasicBlock, BasicBlockData<'tcx>>,
|
basic_blocks: &mut IndexSlice<BasicBlock, BasicBlockData<'tcx>>,
|
||||||
mut f: impl FnMut(Local, AssignedValue<'_, 'tcx>, Location),
|
mut f: impl FnMut(Local, AssignedValue<'_, 'tcx>, Location),
|
||||||
@ -194,17 +198,17 @@ impl SsaLocals {
|
|||||||
/// _d => _a // transitively through _c
|
/// _d => _a // transitively through _c
|
||||||
///
|
///
|
||||||
/// Exception: we do not see through the return place, as it cannot be instantiated.
|
/// Exception: we do not see through the return place, as it cannot be instantiated.
|
||||||
pub fn copy_classes(&self) -> &IndexSlice<Local, Local> {
|
pub(super) fn copy_classes(&self) -> &IndexSlice<Local, Local> {
|
||||||
&self.copy_classes
|
&self.copy_classes
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set of SSA locals that are immutably borrowed.
|
/// Set of SSA locals that are immutably borrowed.
|
||||||
pub fn borrowed_locals(&self) -> &BitSet<Local> {
|
pub(super) fn borrowed_locals(&self) -> &BitSet<Local> {
|
||||||
&self.borrowed_locals
|
&self.borrowed_locals
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Make a property uniform on a copy equivalence class by removing elements.
|
/// Make a property uniform on a copy equivalence class by removing elements.
|
||||||
pub fn meet_copy_equivalence(&self, property: &mut BitSet<Local>) {
|
pub(super) fn meet_copy_equivalence(&self, property: &mut BitSet<Local>) {
|
||||||
// Consolidate to have a local iff all its copies are.
|
// Consolidate to have a local iff all its copies are.
|
||||||
//
|
//
|
||||||
// `copy_classes` defines equivalence classes between locals. The `local`s that recursively
|
// `copy_classes` defines equivalence classes between locals. The `local`s that recursively
|
||||||
|
@ -12,7 +12,7 @@ use rustc_middle::ty::{Ty, TyCtxt};
|
|||||||
use rustc_target::abi::{Abi, Variants};
|
use rustc_target::abi::{Abi, Variants};
|
||||||
use tracing::trace;
|
use tracing::trace;
|
||||||
|
|
||||||
pub struct UnreachableEnumBranching;
|
pub(super) struct UnreachableEnumBranching;
|
||||||
|
|
||||||
fn get_discriminant_local(terminator: &TerminatorKind<'_>) -> Option<Local> {
|
fn get_discriminant_local(terminator: &TerminatorKind<'_>) -> Option<Local> {
|
||||||
if let TerminatorKind::SwitchInt { discr: Operand::Move(p), .. } = terminator {
|
if let TerminatorKind::SwitchInt { discr: Operand::Move(p), .. } = terminator {
|
||||||
|
@ -10,7 +10,7 @@ use rustc_middle::mir::*;
|
|||||||
use rustc_middle::ty::{self, TyCtxt};
|
use rustc_middle::ty::{self, TyCtxt};
|
||||||
use rustc_target::abi::Size;
|
use rustc_target::abi::Size;
|
||||||
|
|
||||||
pub struct UnreachablePropagation;
|
pub(super) struct UnreachablePropagation;
|
||||||
|
|
||||||
impl crate::MirPass<'_> for UnreachablePropagation {
|
impl crate::MirPass<'_> for UnreachablePropagation {
|
||||||
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
||||||
|
@ -26,7 +26,7 @@ enum EdgeKind {
|
|||||||
Normal,
|
Normal,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Validator {
|
pub(super) struct Validator {
|
||||||
/// Describes at which point in the pipeline this validation is happening.
|
/// Describes at which point in the pipeline this validation is happening.
|
||||||
pub when: String,
|
pub when: String,
|
||||||
/// The phase for which we are upholding the dialect. If the given phase forbids a specific
|
/// The phase for which we are upholding the dialect. If the given phase forbids a specific
|
||||||
@ -531,7 +531,7 @@ impl<'a, 'tcx> Visitor<'tcx> for CfgChecker<'a, 'tcx> {
|
|||||||
///
|
///
|
||||||
/// `caller_body` is used to detect cycles in MIR inlining and MIR validation before
|
/// `caller_body` is used to detect cycles in MIR inlining and MIR validation before
|
||||||
/// `optimized_mir` is available.
|
/// `optimized_mir` is available.
|
||||||
pub fn validate_types<'tcx>(
|
pub(super) fn validate_types<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
mir_phase: MirPhase,
|
mir_phase: MirPhase,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
|
Loading…
Reference in New Issue
Block a user