]>
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 { |
29967ef6 | 9 | fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { |
dc9dc135 | 10 | let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut(); |
0531ce1d XL |
11 | let local_decls = &*local_decls; |
12 | for bb in basic_blocks { | |
13 | bb.expand_statements(|stmt| { | |
14 | // FIXME(eddyb) don't match twice on `stmt.kind` (post-NLL). | |
3dfed10e XL |
15 | match stmt.kind { |
16 | // FIXME(#48193) Deaggregate arrays when it's cheaper to do so. | |
17 | StatementKind::Assign(box ( | |
18 | _, | |
19 | Rvalue::Aggregate(box AggregateKind::Array(_), _), | |
20 | )) => { | |
0531ce1d XL |
21 | return None; |
22 | } | |
3dfed10e XL |
23 | StatementKind::Assign(box (_, Rvalue::Aggregate(_, _))) => {} |
24 | _ => return None, | |
476ff2be SL |
25 | } |
26 | ||
0531ce1d XL |
27 | let stmt = stmt.replace_nop(); |
28 | let source_info = stmt.source_info; | |
dc9dc135 | 29 | let (lhs, kind, operands) = match stmt.kind { |
3dfed10e XL |
30 | StatementKind::Assign(box (lhs, Rvalue::Aggregate(kind, operands))) => { |
31 | (lhs, kind, operands) | |
32 | } | |
dfeec247 | 33 | _ => bug!(), |
5bcae85e | 34 | }; |
5bcae85e | 35 | |
dc9dc135 XL |
36 | Some(expand_aggregate( |
37 | lhs, | |
38 | operands.into_iter().map(|op| { | |
0531ce1d | 39 | let ty = op.ty(local_decls, tcx); |
dc9dc135 XL |
40 | (op, ty) |
41 | }), | |
42 | *kind, | |
43 | source_info, | |
e74abb32 | 44 | tcx, |
dc9dc135 | 45 | )) |
0531ce1d | 46 | }); |
5bcae85e | 47 | } |
0531ce1d | 48 | } |
5bcae85e | 49 | } |