move fn is_item_raw
to TypingEnv
This commit is contained in:
parent
89b6885529
commit
948cec0fad
60 changed files with 181 additions and 168 deletions
|
@ -3,7 +3,7 @@ use rustc_index::IndexVec;
|
|||
use rustc_middle::mir::interpret::Scalar;
|
||||
use rustc_middle::mir::visit::{MutatingUseContext, NonMutatingUseContext, PlaceContext, Visitor};
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::{self, ParamEnv, Ty, TyCtxt};
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
use rustc_session::Session;
|
||||
use tracing::{debug, trace};
|
||||
|
||||
|
@ -25,9 +25,9 @@ impl<'tcx> crate::MirPass<'tcx> for CheckAlignment {
|
|||
return;
|
||||
}
|
||||
|
||||
let typing_env = body.typing_env(tcx);
|
||||
let basic_blocks = body.basic_blocks.as_mut();
|
||||
let local_decls = &mut body.local_decls;
|
||||
let param_env = tcx.param_env_reveal_all_normalized(body.source.def_id());
|
||||
|
||||
// This pass inserts new blocks. Each insertion changes the Location for all
|
||||
// statements/blocks after. Iterating or visiting the MIR in order would require updating
|
||||
|
@ -41,7 +41,7 @@ impl<'tcx> crate::MirPass<'tcx> for CheckAlignment {
|
|||
let source_info = statement.source_info;
|
||||
|
||||
let mut finder =
|
||||
PointerFinder { tcx, local_decls, param_env, pointers: Vec::new() };
|
||||
PointerFinder { tcx, local_decls, typing_env, pointers: Vec::new() };
|
||||
finder.visit_statement(statement, location);
|
||||
|
||||
for (local, ty) in finder.pointers {
|
||||
|
@ -65,7 +65,7 @@ impl<'tcx> crate::MirPass<'tcx> for CheckAlignment {
|
|||
struct PointerFinder<'a, 'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
local_decls: &'a mut LocalDecls<'tcx>,
|
||||
param_env: ParamEnv<'tcx>,
|
||||
typing_env: ty::TypingEnv<'tcx>,
|
||||
pointers: Vec<(Place<'tcx>, Ty<'tcx>)>,
|
||||
}
|
||||
|
||||
|
@ -107,7 +107,7 @@ impl<'a, 'tcx> Visitor<'tcx> for PointerFinder<'a, 'tcx> {
|
|||
let pointee_ty =
|
||||
pointer_ty.builtin_deref(true).expect("no builtin_deref for an unsafe pointer");
|
||||
// Ideally we'd support this in the future, but for now we are limited to sized types.
|
||||
if !pointee_ty.is_sized(self.tcx, self.param_env) {
|
||||
if !pointee_ty.is_sized(self.tcx, self.typing_env) {
|
||||
debug!("Unsafe pointer, but pointee is not known to be sized: {:?}", pointer_ty);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -28,8 +28,8 @@ impl<'tcx> crate::MirPass<'tcx> for CopyProp {
|
|||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
debug!(def_id = ?body.source.def_id());
|
||||
|
||||
let param_env = tcx.param_env_reveal_all_normalized(body.source.def_id());
|
||||
let ssa = SsaLocals::new(tcx, body, param_env);
|
||||
let typing_env = body.typing_env(tcx);
|
||||
let ssa = SsaLocals::new(tcx, body, typing_env);
|
||||
|
||||
let fully_moved = fully_moved_locals(&ssa, body);
|
||||
debug!(?fully_moved);
|
||||
|
|
|
@ -208,7 +208,7 @@ pub(super) fn deduced_param_attrs<'tcx>(
|
|||
// blow-up in compile times: #113372
|
||||
&& tcx
|
||||
.normalize_erasing_regions(typing_env, local_decl.ty)
|
||||
.is_freeze(tcx, typing_env.param_env),
|
||||
.is_freeze(tcx, typing_env),
|
||||
},
|
||||
),
|
||||
);
|
||||
|
|
|
@ -120,12 +120,13 @@ impl<'tcx> crate::MirPass<'tcx> for GVN {
|
|||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
debug!(def_id = ?body.source.def_id());
|
||||
|
||||
let param_env = tcx.param_env_reveal_all_normalized(body.source.def_id());
|
||||
let ssa = SsaLocals::new(tcx, body, param_env);
|
||||
let typing_env = body.typing_env(tcx);
|
||||
let ssa = SsaLocals::new(tcx, body, typing_env);
|
||||
// Clone dominators because we need them while mutating the body.
|
||||
let dominators = body.basic_blocks.dominators().clone();
|
||||
|
||||
let mut state = VnState::new(tcx, body, param_env, &ssa, dominators, &body.local_decls);
|
||||
let mut state =
|
||||
VnState::new(tcx, body, typing_env.param_env, &ssa, dominators, &body.local_decls);
|
||||
ssa.for_each_assignment_mut(
|
||||
body.basic_blocks.as_mut_preserves_cfg(),
|
||||
|local, value, location| {
|
||||
|
@ -241,7 +242,6 @@ enum Value<'tcx> {
|
|||
struct VnState<'body, 'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
ecx: InterpCx<'tcx, DummyMachine>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
local_decls: &'body LocalDecls<'tcx>,
|
||||
/// Value stored in each local.
|
||||
locals: IndexVec<Local, Option<VnIndex>>,
|
||||
|
@ -281,7 +281,6 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
|
|||
VnState {
|
||||
tcx,
|
||||
ecx: InterpCx::new(tcx, DUMMY_SP, param_env, DummyMachine),
|
||||
param_env,
|
||||
local_decls,
|
||||
locals: IndexVec::from_elem(None, local_decls),
|
||||
rev_locals: IndexVec::with_capacity(num_values),
|
||||
|
@ -296,7 +295,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
|
|||
}
|
||||
|
||||
fn typing_env(&self) -> ty::TypingEnv<'tcx> {
|
||||
ty::TypingEnv { typing_mode: ty::TypingMode::PostAnalysis, param_env: self.param_env }
|
||||
self.ecx.typing_env()
|
||||
}
|
||||
|
||||
#[instrument(level = "trace", skip(self), ret)]
|
||||
|
@ -347,7 +346,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
|
|||
|
||||
// Only register the value if its type is `Sized`, as we will emit copies of it.
|
||||
let is_sized = !self.feature_unsized_locals
|
||||
|| self.local_decls[local].ty.is_sized(self.tcx, self.param_env);
|
||||
|| self.local_decls[local].ty.is_sized(self.tcx, self.typing_env());
|
||||
if is_sized {
|
||||
self.rev_locals[value].push(local);
|
||||
}
|
||||
|
@ -642,7 +641,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
|
|||
let ty = place.ty(self.local_decls, self.tcx).ty;
|
||||
if let Some(Mutability::Not) = ty.ref_mutability()
|
||||
&& let Some(pointee_ty) = ty.builtin_deref(true)
|
||||
&& pointee_ty.is_freeze(self.tcx, self.param_env)
|
||||
&& pointee_ty.is_freeze(self.tcx, self.typing_env())
|
||||
{
|
||||
// An immutable borrow `_x` always points to the same value for the
|
||||
// lifetime of the borrow, so we can merge all instances of `*_x`.
|
||||
|
@ -1061,7 +1060,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
|
|||
&& let ty::RawPtr(from_pointee_ty, from_mtbl) = cast_from.kind()
|
||||
&& let ty::RawPtr(_, output_mtbl) = output_pointer_ty.kind()
|
||||
&& from_mtbl == output_mtbl
|
||||
&& from_pointee_ty.is_sized(self.tcx, self.param_env)
|
||||
&& from_pointee_ty.is_sized(self.tcx, self.typing_env())
|
||||
{
|
||||
fields[0] = *cast_value;
|
||||
*data_pointer_ty = *cast_from;
|
||||
|
@ -1383,7 +1382,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
|
|||
&& let Value::Aggregate(AggregateTy::RawPtr { data_pointer_ty, .. }, _, fields) =
|
||||
self.get(value)
|
||||
&& let ty::RawPtr(to_pointee, _) = to.kind()
|
||||
&& to_pointee.is_sized(self.tcx, self.param_env)
|
||||
&& to_pointee.is_sized(self.tcx, self.typing_env())
|
||||
{
|
||||
from = *data_pointer_ty;
|
||||
value = fields[0];
|
||||
|
|
|
@ -199,10 +199,7 @@ impl<'tcx> Inliner<'tcx> {
|
|||
let TerminatorKind::Call { args, destination, .. } = &terminator.kind else { bug!() };
|
||||
let destination_ty = destination.ty(&caller_body.local_decls, self.tcx).ty;
|
||||
for arg in args {
|
||||
if !arg
|
||||
.node
|
||||
.ty(&caller_body.local_decls, self.tcx)
|
||||
.is_sized(self.tcx, self.typing_env.param_env)
|
||||
if !arg.node.ty(&caller_body.local_decls, self.tcx).is_sized(self.tcx, self.typing_env)
|
||||
{
|
||||
// We do not allow inlining functions with unsized params. Inlining these functions
|
||||
// could create unsized locals, which are unsound and being phased out.
|
||||
|
|
|
@ -451,7 +451,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
|
|||
if rvalue.has_param() {
|
||||
return None;
|
||||
}
|
||||
if !rvalue.ty(self.local_decls(), self.tcx).is_sized(self.tcx, self.typing_env.param_env) {
|
||||
if !rvalue.ty(self.local_decls(), self.tcx).is_sized(self.tcx, self.typing_env) {
|
||||
// the interpreter doesn't support unsized locals (only unsized arguments),
|
||||
// but rustc does (in a kinda broken way), so we have to skip them here
|
||||
return None;
|
||||
|
|
|
@ -85,8 +85,8 @@ impl<'tcx> crate::MirPass<'tcx> for ReferencePropagation {
|
|||
}
|
||||
|
||||
fn propagate_ssa<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) -> bool {
|
||||
let param_env = tcx.param_env_reveal_all_normalized(body.source.def_id());
|
||||
let ssa = SsaLocals::new(tcx, body, param_env);
|
||||
let typing_env = body.typing_env(tcx);
|
||||
let ssa = SsaLocals::new(tcx, body, typing_env);
|
||||
|
||||
let mut replacer = compute_replacement(tcx, body, &ssa);
|
||||
debug!(?replacer.targets);
|
||||
|
|
|
@ -13,7 +13,7 @@ use rustc_middle::bug;
|
|||
use rustc_middle::middle::resolve_bound_vars::Set1;
|
||||
use rustc_middle::mir::visit::*;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::{ParamEnv, TyCtxt};
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
use tracing::{debug, instrument, trace};
|
||||
|
||||
pub(super) struct SsaLocals {
|
||||
|
@ -42,7 +42,7 @@ impl SsaLocals {
|
|||
pub(super) fn new<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
param_env: ParamEnv<'tcx>,
|
||||
typing_env: ty::TypingEnv<'tcx>,
|
||||
) -> SsaLocals {
|
||||
let assignment_order = Vec::with_capacity(body.local_decls.len());
|
||||
|
||||
|
@ -80,7 +80,7 @@ impl SsaLocals {
|
|||
// have already been marked as non-SSA.
|
||||
debug!(?visitor.borrowed_locals);
|
||||
for local in visitor.borrowed_locals.iter() {
|
||||
if !body.local_decls[local].ty.is_freeze(tcx, param_env) {
|
||||
if !body.local_decls[local].ty.is_freeze(tcx, typing_env) {
|
||||
visitor.assignments[local] = Set1::Many;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -623,7 +623,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
|||
if let Operand::Copy(place) = operand {
|
||||
let ty = place.ty(&self.body.local_decls, self.tcx).ty;
|
||||
|
||||
if !ty.is_copy_modulo_regions(self.tcx, self.typing_env.param_env) {
|
||||
if !ty.is_copy_modulo_regions(self.tcx, self.typing_env) {
|
||||
self.fail(location, format!("`Operand::Copy` with non-`Copy` type {ty}"));
|
||||
}
|
||||
}
|
||||
|
@ -989,7 +989,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
|||
}
|
||||
|
||||
// FIXME: check `Thin` instead of `Sized`
|
||||
if !in_pointee.is_sized(self.tcx, self.typing_env.param_env) {
|
||||
if !in_pointee.is_sized(self.tcx, self.typing_env) {
|
||||
self.fail(location, "input pointer must be thin");
|
||||
}
|
||||
} else {
|
||||
|
@ -1004,7 +1004,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
|||
if !self.mir_assign_valid_types(metadata_ty, self.tcx.types.usize) {
|
||||
self.fail(location, "slice metadata must be usize");
|
||||
}
|
||||
} else if pointee_ty.is_sized(self.tcx, self.typing_env.param_env) {
|
||||
} else if pointee_ty.is_sized(self.tcx, self.typing_env) {
|
||||
if metadata_ty != self.tcx.types.unit {
|
||||
self.fail(location, "metadata for pointer-to-thin must be unit");
|
||||
}
|
||||
|
@ -1294,7 +1294,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
|||
if !self
|
||||
.tcx
|
||||
.normalize_erasing_regions(self.typing_env, op_ty)
|
||||
.is_sized(self.tcx, self.typing_env.param_env)
|
||||
.is_sized(self.tcx, self.typing_env)
|
||||
{
|
||||
self.fail(
|
||||
location,
|
||||
|
@ -1304,7 +1304,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
|||
if !self
|
||||
.tcx
|
||||
.normalize_erasing_regions(self.typing_env, *target_type)
|
||||
.is_sized(self.tcx, self.typing_env.param_env)
|
||||
.is_sized(self.tcx, self.typing_env)
|
||||
{
|
||||
self.fail(
|
||||
location,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue