Rollup merge of #92203 - Aaron1011:mir-adt-def, r=oli-obk
Store a `DefId` instead of an `AdtDef` in `AggregateKind::Adt` The `AggregateKind` enum ends up in the final mir `Body`. Currently, any changes to `AdtDef` (regardless of how significant they are) will legitimately cause the overall result of `optimized_mir` to change, invalidating any codegen re-use involving that mir. This will get worse once we start hashing the `Span` inside `FieldDef` (which is itself contained in `AdtDef`). To try to reduce these kinds of invalidations, this commit changes `AggregateKind::Adt` to store just the `DefId`, instead of the full `AdtDef`. This allows the result of `optimized_mir` to be unchanged if the `AdtDef` changes in a way that doesn't actually affect any of the MIR we build.
This commit is contained in:
commit
8a61ae0479
@ -1916,7 +1916,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||
let tcx = self.tcx();
|
||||
|
||||
match *ak {
|
||||
AggregateKind::Adt(def, variant_index, substs, _, active_field_index) => {
|
||||
AggregateKind::Adt(adt_did, variant_index, substs, _, active_field_index) => {
|
||||
let def = tcx.adt_def(adt_did);
|
||||
let variant = &def.variants[variant_index];
|
||||
let adj_field_index = active_field_index.unwrap_or(field_index);
|
||||
if let Some(field) = variant.fields.get(adj_field_index) {
|
||||
@ -2621,8 +2622,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||
);
|
||||
|
||||
let (def_id, instantiated_predicates) = match aggregate_kind {
|
||||
AggregateKind::Adt(def, _, substs, _, _) => {
|
||||
(def.did, tcx.predicates_of(def.did).instantiate(tcx, substs))
|
||||
AggregateKind::Adt(adt_did, _, substs, _, _) => {
|
||||
(*adt_did, tcx.predicates_of(*adt_did).instantiate(tcx, substs))
|
||||
}
|
||||
|
||||
// For closures, we have some **extra requirements** we
|
||||
|
@ -112,9 +112,9 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||
|
||||
mir::Rvalue::Aggregate(ref kind, ref operands) => {
|
||||
let (dest, active_field_index) = match **kind {
|
||||
mir::AggregateKind::Adt(adt_def, variant_index, _, _, active_field_index) => {
|
||||
mir::AggregateKind::Adt(adt_did, variant_index, _, _, active_field_index) => {
|
||||
dest.codegen_set_discr(&mut bx, variant_index);
|
||||
if adt_def.is_enum() {
|
||||
if bx.tcx().adt_def(adt_did).is_enum() {
|
||||
(dest.project_downcast(&mut bx, variant_index), active_field_index)
|
||||
} else {
|
||||
(dest, active_field_index)
|
||||
|
@ -199,9 +199,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
Aggregate(ref kind, ref operands) => {
|
||||
// active_field_index is for union initialization.
|
||||
let (dest, active_field_index) = match **kind {
|
||||
mir::AggregateKind::Adt(adt_def, variant_index, _, _, active_field_index) => {
|
||||
mir::AggregateKind::Adt(adt_did, variant_index, _, _, active_field_index) => {
|
||||
self.write_discriminant(variant_index, &dest)?;
|
||||
if adt_def.is_enum() {
|
||||
if self.tcx.adt_def(adt_did).is_enum() {
|
||||
assert!(active_field_index.is_none());
|
||||
(self.place_downcast(&dest, variant_index)?, None)
|
||||
} else {
|
||||
|
@ -270,7 +270,8 @@ where
|
||||
Rvalue::Aggregate(kind, operands) => {
|
||||
// Return early if we know that the struct or enum being constructed is always
|
||||
// qualified.
|
||||
if let AggregateKind::Adt(def, _, substs, ..) = **kind {
|
||||
if let AggregateKind::Adt(adt_did, _, substs, ..) = **kind {
|
||||
let def = cx.tcx.adt_def(adt_did);
|
||||
if Q::in_adt_inherently(cx, def, substs) {
|
||||
return true;
|
||||
}
|
||||
|
@ -22,7 +22,8 @@ pub fn expand_aggregate<'tcx>(
|
||||
) -> impl Iterator<Item = Statement<'tcx>> + TrustedLen {
|
||||
let mut set_discriminant = None;
|
||||
let active_field_index = match kind {
|
||||
AggregateKind::Adt(adt_def, variant_index, _, _, active_field_index) => {
|
||||
AggregateKind::Adt(adt_did, variant_index, _, _, active_field_index) => {
|
||||
let adt_def = tcx.adt_def(adt_did);
|
||||
if adt_def.is_enum() {
|
||||
set_discriminant = Some(Statement {
|
||||
kind: StatementKind::SetDiscriminant { place: Box::new(lhs), variant_index },
|
||||
|
@ -2268,7 +2268,7 @@ pub enum AggregateKind<'tcx> {
|
||||
/// active field number and is present only for union expressions
|
||||
/// -- e.g., for a union expression `SomeUnion { c: .. }`, the
|
||||
/// active field index would identity the field `c`
|
||||
Adt(&'tcx AdtDef, VariantIdx, SubstsRef<'tcx>, Option<UserTypeAnnotationIndex>, Option<usize>),
|
||||
Adt(DefId, VariantIdx, SubstsRef<'tcx>, Option<UserTypeAnnotationIndex>, Option<usize>),
|
||||
|
||||
Closure(DefId, SubstsRef<'tcx>),
|
||||
Generator(DefId, SubstsRef<'tcx>, hir::Movability),
|
||||
@ -2427,28 +2427,26 @@ impl<'tcx> Debug for Rvalue<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
AggregateKind::Adt(adt_def, variant, substs, _user_ty, _) => {
|
||||
let variant_def = &adt_def.variants[variant];
|
||||
|
||||
let name = ty::tls::with(|tcx| {
|
||||
AggregateKind::Adt(adt_did, variant, substs, _user_ty, _) => {
|
||||
ty::tls::with(|tcx| {
|
||||
let mut name = String::new();
|
||||
let variant_def = &tcx.adt_def(adt_did).variants[variant];
|
||||
let substs = tcx.lift(substs).expect("could not lift for printing");
|
||||
FmtPrinter::new(tcx, &mut name, Namespace::ValueNS)
|
||||
.print_def_path(variant_def.def_id, substs)?;
|
||||
Ok(name)
|
||||
})?;
|
||||
|
||||
match variant_def.ctor_kind {
|
||||
CtorKind::Const => fmt.write_str(&name),
|
||||
CtorKind::Fn => fmt_tuple(fmt, &name),
|
||||
CtorKind::Fictive => {
|
||||
let mut struct_fmt = fmt.debug_struct(&name);
|
||||
for (field, place) in iter::zip(&variant_def.fields, places) {
|
||||
struct_fmt.field(field.ident.as_str(), place);
|
||||
match variant_def.ctor_kind {
|
||||
CtorKind::Const => fmt.write_str(&name),
|
||||
CtorKind::Fn => fmt_tuple(fmt, &name),
|
||||
CtorKind::Fictive => {
|
||||
let mut struct_fmt = fmt.debug_struct(&name);
|
||||
for (field, place) in iter::zip(&variant_def.fields, places) {
|
||||
struct_fmt.field(field.ident.as_str(), place);
|
||||
}
|
||||
struct_fmt.finish()
|
||||
}
|
||||
struct_fmt.finish()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
AggregateKind::Closure(def_id, substs) => ty::tls::with(|tcx| {
|
||||
|
@ -200,7 +200,7 @@ impl<'tcx> Rvalue<'tcx> {
|
||||
Rvalue::Aggregate(ref ak, ref ops) => match **ak {
|
||||
AggregateKind::Array(ty) => tcx.mk_array(ty, ops.len() as u64),
|
||||
AggregateKind::Tuple => tcx.mk_tup(ops.iter().map(|op| op.ty(local_decls, tcx))),
|
||||
AggregateKind::Adt(def, _, substs, _, _) => tcx.type_of(def.did).subst(tcx, substs),
|
||||
AggregateKind::Adt(did, _, substs, _, _) => tcx.type_of(did).subst(tcx, substs),
|
||||
AggregateKind::Closure(did, substs) => tcx.mk_closure(did, substs),
|
||||
AggregateKind::Generator(did, substs, movability) => {
|
||||
tcx.mk_generator(did, substs, movability)
|
||||
|
@ -377,7 +377,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||
})
|
||||
});
|
||||
let adt = Box::new(AggregateKind::Adt(
|
||||
adt_def,
|
||||
adt_def.did,
|
||||
variant_index,
|
||||
substs,
|
||||
user_ty,
|
||||
|
@ -117,8 +117,8 @@ impl<'tcx> Visitor<'tcx> for UnsafetyChecker<'_, 'tcx> {
|
||||
match rvalue {
|
||||
Rvalue::Aggregate(box ref aggregate, _) => match aggregate {
|
||||
&AggregateKind::Array(..) | &AggregateKind::Tuple => {}
|
||||
&AggregateKind::Adt(ref def, ..) => {
|
||||
match self.tcx.layout_scalar_valid_range(def.did) {
|
||||
&AggregateKind::Adt(adt_did, ..) => {
|
||||
match self.tcx.layout_scalar_valid_range(adt_did) {
|
||||
(Bound::Unbounded, Bound::Unbounded) => {}
|
||||
_ => self.require_unsafe(
|
||||
UnsafetyViolationKind::General,
|
||||
|
@ -243,7 +243,7 @@ impl<'tcx> TransformVisitor<'tcx> {
|
||||
val: Operand<'tcx>,
|
||||
source_info: SourceInfo,
|
||||
) -> impl Iterator<Item = Statement<'tcx>> {
|
||||
let kind = AggregateKind::Adt(self.state_adt_ref, idx, self.state_substs, None, None);
|
||||
let kind = AggregateKind::Adt(self.state_adt_ref.did, idx, self.state_substs, None, None);
|
||||
assert_eq!(self.state_adt_ref.variants[idx].fields.len(), 1);
|
||||
let ty = self
|
||||
.tcx
|
||||
|
@ -777,7 +777,7 @@ pub fn build_adt_ctor(tcx: TyCtxt<'_>, ctor_id: DefId) -> Body<'_> {
|
||||
adt_def.variants[variant_index].fields.iter().enumerate().map(|(idx, field_def)| {
|
||||
(Operand::Move(Place::from(Local::new(idx + 1))), field_def.ty(tcx, substs))
|
||||
}),
|
||||
AggregateKind::Adt(adt_def, variant_index, substs, None, None),
|
||||
AggregateKind::Adt(adt_def.did, variant_index, substs, None, None),
|
||||
source_info,
|
||||
tcx,
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user