]>
git.proxmox.com Git - rustc.git/blob - src/librustc_mir/transform/deaggregator.rs
3 use crate::transform
::{MirPass, MirSource}
;
4 use crate::util
::expand_aggregate
;
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).
15 if let StatementKind
::Assign(box(_
, ref rhs
)) = stmt
.kind
{
16 if let Rvalue
::Aggregate(ref kind
, _
) = *rhs
{
17 // FIXME(#48193) Deaggregate arrays when it's cheaper to do so.
18 if let AggregateKind
::Array(_
) = **kind
{
28 let stmt
= stmt
.replace_nop();
29 let source_info
= stmt
.source_info
;
30 let (lhs
, kind
, operands
) = match stmt
.kind
{
31 StatementKind
::Assign(box(lhs
, rvalue
)) => {
33 Rvalue
::Aggregate(kind
, operands
) => (lhs
, kind
, operands
),
40 Some(expand_aggregate(
42 operands
.into_iter().map(|op
| {
43 let ty
= op
.ty(local_decls
, tcx
);