]>
Commit | Line | Data |
---|---|---|
dc9dc135 | 1 | use crate::util::expand_aggregate; |
c295e0f8 | 2 | use crate::MirPass; |
ba9703b0 XL |
3 | use rustc_middle::mir::*; |
4 | use rustc_middle::ty::TyCtxt; | |
5bcae85e SL |
5 | |
6 | pub struct Deaggregator; | |
7 | ||
e1599b0c | 8 | impl<'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 | } |