]>
git.proxmox.com Git - rustc.git/blob - compiler/rustc_mir/src/transform/deaggregator.rs
1 use crate::transform
::{MirPass, MirSource}
;
2 use crate::util
::expand_aggregate
;
3 use rustc_middle
::mir
::*;
4 use rustc_middle
::ty
::TyCtxt
;
6 pub struct Deaggregator
;
8 impl<'tcx
> MirPass
<'tcx
> for Deaggregator
{
9 fn run_pass(&self, tcx
: TyCtxt
<'tcx
>, _source
: MirSource
<'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).
16 // FIXME(#48193) Deaggregate arrays when it's cheaper to do so.
17 StatementKind
::Assign(box (
19 Rvalue
::Aggregate(box AggregateKind
::Array(_
), _
),
23 StatementKind
::Assign(box (_
, Rvalue
::Aggregate(_
, _
))) => {}
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
))) => {
36 Some(expand_aggregate(
38 operands
.into_iter().map(|op
| {
39 let ty
= op
.ty(local_decls
, tcx
);