]>
Commit | Line | Data |
---|---|---|
1 | use crate::util::expand_aggregate; | |
2 | use crate::MirPass; | |
3 | use rustc_middle::mir::*; | |
4 | use rustc_middle::ty::TyCtxt; | |
5 | ||
6 | pub struct Deaggregator; | |
7 | ||
8 | impl<'tcx> MirPass<'tcx> for Deaggregator { | |
9 | fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { | |
10 | let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut(); | |
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). | |
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 | )) => { | |
21 | return None; | |
22 | } | |
23 | StatementKind::Assign(box (_, Rvalue::Aggregate(_, _))) => {} | |
24 | _ => return None, | |
25 | } | |
26 | ||
27 | let stmt = stmt.replace_nop(); | |
28 | let source_info = stmt.source_info; | |
29 | let (lhs, kind, operands) = match stmt.kind { | |
30 | StatementKind::Assign(box (lhs, Rvalue::Aggregate(kind, operands))) => { | |
31 | (lhs, kind, operands) | |
32 | } | |
33 | _ => bug!(), | |
34 | }; | |
35 | ||
36 | Some(expand_aggregate( | |
37 | lhs, | |
38 | operands.into_iter().map(|op| { | |
39 | let ty = op.ty(local_decls, tcx); | |
40 | (op, ty) | |
41 | }), | |
42 | *kind, | |
43 | source_info, | |
44 | tcx, | |
45 | )) | |
46 | }); | |
47 | } | |
48 | } | |
49 | } |