Stop deaggegating MIR.
This commit is contained in:
parent
6a0b218161
commit
134d819072
4 changed files with 0 additions and 132 deletions
|
@ -1,77 +0,0 @@
|
||||||
use rustc_index::vec::Idx;
|
|
||||||
use rustc_middle::mir::*;
|
|
||||||
use rustc_middle::ty::{Ty, TyCtxt};
|
|
||||||
use rustc_target::abi::VariantIdx;
|
|
||||||
|
|
||||||
use std::iter::TrustedLen;
|
|
||||||
|
|
||||||
/// Expand `lhs = Rvalue::Aggregate(kind, operands)` into assignments to the fields.
|
|
||||||
///
|
|
||||||
/// Produces something like
|
|
||||||
/// ```ignore (ilustrative)
|
|
||||||
/// (lhs as Variant).field0 = arg0; // We only have a downcast if this is an enum
|
|
||||||
/// (lhs as Variant).field1 = arg1;
|
|
||||||
/// discriminant(lhs) = variant_index; // If lhs is an enum or generator.
|
|
||||||
/// ```
|
|
||||||
pub fn expand_aggregate<'tcx>(
|
|
||||||
orig_lhs: Place<'tcx>,
|
|
||||||
operands: impl Iterator<Item = (Operand<'tcx>, Ty<'tcx>)> + TrustedLen,
|
|
||||||
kind: AggregateKind<'tcx>,
|
|
||||||
source_info: SourceInfo,
|
|
||||||
tcx: TyCtxt<'tcx>,
|
|
||||||
) -> impl Iterator<Item = Statement<'tcx>> + TrustedLen {
|
|
||||||
let mut lhs = orig_lhs;
|
|
||||||
let mut set_discriminant = None;
|
|
||||||
let active_field_index = match kind {
|
|
||||||
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(orig_lhs),
|
|
||||||
variant_index,
|
|
||||||
},
|
|
||||||
source_info,
|
|
||||||
});
|
|
||||||
lhs = tcx.mk_place_downcast(orig_lhs, adt_def, variant_index);
|
|
||||||
}
|
|
||||||
active_field_index
|
|
||||||
}
|
|
||||||
AggregateKind::Generator(..) => {
|
|
||||||
// Right now we only support initializing generators to
|
|
||||||
// variant 0 (Unresumed).
|
|
||||||
let variant_index = VariantIdx::new(0);
|
|
||||||
set_discriminant = Some(Statement {
|
|
||||||
kind: StatementKind::SetDiscriminant { place: Box::new(orig_lhs), variant_index },
|
|
||||||
source_info,
|
|
||||||
});
|
|
||||||
|
|
||||||
// Operands are upvars stored on the base place, so no
|
|
||||||
// downcast is necessary.
|
|
||||||
|
|
||||||
None
|
|
||||||
}
|
|
||||||
_ => None,
|
|
||||||
};
|
|
||||||
|
|
||||||
let operands = operands.enumerate().map(move |(i, (op, ty))| {
|
|
||||||
let lhs_field = if let AggregateKind::Array(_) = kind {
|
|
||||||
let offset = u64::try_from(i).unwrap();
|
|
||||||
tcx.mk_place_elem(
|
|
||||||
lhs,
|
|
||||||
ProjectionElem::ConstantIndex { offset, min_length: offset + 1, from_end: false },
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
let field = Field::new(active_field_index.unwrap_or(i));
|
|
||||||
tcx.mk_place_field(lhs, field, ty)
|
|
||||||
};
|
|
||||||
Statement {
|
|
||||||
source_info,
|
|
||||||
kind: StatementKind::Assign(Box::new((lhs_field, Rvalue::Use(op)))),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
[Statement { source_info, kind: StatementKind::Deinit(Box::new(orig_lhs)) }]
|
|
||||||
.into_iter()
|
|
||||||
.chain(operands)
|
|
||||||
.chain(set_discriminant)
|
|
||||||
}
|
|
|
@ -1,4 +1,3 @@
|
||||||
pub mod aggregate;
|
|
||||||
mod alignment;
|
mod alignment;
|
||||||
mod call_kind;
|
mod call_kind;
|
||||||
pub mod collect_writes;
|
pub mod collect_writes;
|
||||||
|
@ -7,7 +6,6 @@ mod find_self_call;
|
||||||
mod might_permit_raw_init;
|
mod might_permit_raw_init;
|
||||||
mod type_name;
|
mod type_name;
|
||||||
|
|
||||||
pub use self::aggregate::expand_aggregate;
|
|
||||||
pub use self::alignment::is_disaligned;
|
pub use self::alignment::is_disaligned;
|
||||||
pub use self::call_kind::{call_kind, CallDesugaringKind, CallKind};
|
pub use self::call_kind::{call_kind, CallDesugaringKind, CallKind};
|
||||||
pub use self::compare_types::{is_equal_up_to_subtyping, is_subtype};
|
pub use self::compare_types::{is_equal_up_to_subtyping, is_subtype};
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
use crate::util::expand_aggregate;
|
|
||||||
use crate::MirPass;
|
|
||||||
use rustc_hir::def::DefKind;
|
|
||||||
use rustc_middle::mir::*;
|
|
||||||
use rustc_middle::ty::TyCtxt;
|
|
||||||
|
|
||||||
pub struct Deaggregator;
|
|
||||||
|
|
||||||
impl<'tcx> MirPass<'tcx> for Deaggregator {
|
|
||||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
|
||||||
let basic_blocks = body.basic_blocks.as_mut_preserves_cfg();
|
|
||||||
for bb in basic_blocks {
|
|
||||||
bb.expand_statements(|stmt| {
|
|
||||||
// FIXME(eddyb) don't match twice on `stmt.kind` (post-NLL).
|
|
||||||
let StatementKind::Assign(box (
|
|
||||||
_, Rvalue::Aggregate(box ref kind, _))
|
|
||||||
) = stmt.kind else { return None };
|
|
||||||
|
|
||||||
// FIXME(#48193) Deaggregate arrays when it's cheaper to do so.
|
|
||||||
if let AggregateKind::Array(_) = kind {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
if let AggregateKind::Adt(def_id, ..) = kind
|
|
||||||
&& matches!(tcx.def_kind(def_id), DefKind::Enum)
|
|
||||||
{
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
let stmt = stmt.replace_nop();
|
|
||||||
let source_info = stmt.source_info;
|
|
||||||
let StatementKind::Assign(box (lhs, Rvalue::Aggregate(kind, operands))) = stmt.kind else {
|
|
||||||
bug!();
|
|
||||||
};
|
|
||||||
|
|
||||||
Some(expand_aggregate(
|
|
||||||
lhs,
|
|
||||||
operands.into_iter().map(|op| {
|
|
||||||
let ty = op.ty(&body.local_decls, tcx);
|
|
||||||
(op, ty)
|
|
||||||
}),
|
|
||||||
*kind,
|
|
||||||
source_info,
|
|
||||||
tcx,
|
|
||||||
))
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -60,7 +60,6 @@ mod coverage;
|
||||||
mod ctfe_limit;
|
mod ctfe_limit;
|
||||||
mod dataflow_const_prop;
|
mod dataflow_const_prop;
|
||||||
mod dead_store_elimination;
|
mod dead_store_elimination;
|
||||||
mod deaggregator;
|
|
||||||
mod deduce_param_attrs;
|
mod deduce_param_attrs;
|
||||||
mod deduplicate_blocks;
|
mod deduplicate_blocks;
|
||||||
mod deref_separator;
|
mod deref_separator;
|
||||||
|
@ -523,9 +522,6 @@ fn run_runtime_lowering_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
&elaborate_box_derefs::ElaborateBoxDerefs,
|
&elaborate_box_derefs::ElaborateBoxDerefs,
|
||||||
&generator::StateTransform,
|
&generator::StateTransform,
|
||||||
&add_retag::AddRetag,
|
&add_retag::AddRetag,
|
||||||
// Deaggregator is necessary for const prop. We may want to consider implementing
|
|
||||||
// CTFE support for aggregates.
|
|
||||||
&deaggregator::Deaggregator,
|
|
||||||
&Lint(const_prop_lint::ConstProp),
|
&Lint(const_prop_lint::ConstProp),
|
||||||
];
|
];
|
||||||
pm::run_passes_no_validate(tcx, body, passes, Some(MirPhase::Runtime(RuntimePhase::Initial)));
|
pm::run_passes_no_validate(tcx, body, passes, Some(MirPhase::Runtime(RuntimePhase::Initial)));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue