]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_mir_transform/src/deaggregator.rs
New upstream version 1.61.0+dfsg1
[rustc.git] / compiler / rustc_mir_transform / src / deaggregator.rs
CommitLineData
dc9dc135 1use crate::util::expand_aggregate;
c295e0f8 2use crate::MirPass;
ba9703b0
XL
3use rustc_middle::mir::*;
4use rustc_middle::ty::TyCtxt;
5bcae85e
SL
5
6pub struct Deaggregator;
7
e1599b0c 8impl<'tcx> MirPass<'tcx> for Deaggregator {
5e7ed085
FG
9 fn phase_change(&self) -> Option<MirPhase> {
10 Some(MirPhase::Deaggregated)
11 }
12
29967ef6 13 fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
dc9dc135 14 let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut();
0531ce1d
XL
15 let local_decls = &*local_decls;
16 for bb in basic_blocks {
17 bb.expand_statements(|stmt| {
18 // FIXME(eddyb) don't match twice on `stmt.kind` (post-NLL).
3dfed10e
XL
19 match stmt.kind {
20 // FIXME(#48193) Deaggregate arrays when it's cheaper to do so.
21 StatementKind::Assign(box (
22 _,
23 Rvalue::Aggregate(box AggregateKind::Array(_), _),
24 )) => {
0531ce1d
XL
25 return None;
26 }
3dfed10e
XL
27 StatementKind::Assign(box (_, Rvalue::Aggregate(_, _))) => {}
28 _ => return None,
476ff2be
SL
29 }
30
0531ce1d
XL
31 let stmt = stmt.replace_nop();
32 let source_info = stmt.source_info;
5e7ed085
FG
33 let StatementKind::Assign(box (lhs, Rvalue::Aggregate(kind, operands))) = stmt.kind else {
34 bug!();
5bcae85e 35 };
5bcae85e 36
dc9dc135
XL
37 Some(expand_aggregate(
38 lhs,
39 operands.into_iter().map(|op| {
0531ce1d 40 let ty = op.ty(local_decls, tcx);
dc9dc135
XL
41 (op, ty)
42 }),
43 *kind,
44 source_info,
e74abb32 45 tcx,
dc9dc135 46 ))
0531ce1d 47 });
5bcae85e 48 }
0531ce1d 49 }
5bcae85e 50}