diff options
| author | Scott A Carr <s.carr1024@gmail.com> | 2016-08-03 11:10:38 -0700 |
|---|---|---|
| committer | Scott A Carr <s.carr1024@gmail.com> | 2016-08-03 11:10:38 -0700 |
| commit | 06acf16cdb23dad19b9cf816a55df24d4084823c (patch) | |
| tree | c1a8fa5a637a3c011d0144e67073ca582d2c86f5 | |
| parent | d5908a32509ccbbc552179cd75d22c8ea20d4092 (diff) | |
| download | rust-06acf16cdb23dad19b9cf816a55df24d4084823c.tar.gz rust-06acf16cdb23dad19b9cf816a55df24d4084823c.zip | |
reduce rightward drift, add precondition comment
| -rw-r--r-- | src/librustc_mir/transform/deaggregator.rs | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/src/librustc_mir/transform/deaggregator.rs b/src/librustc_mir/transform/deaggregator.rs index ae91123c692..fccd4a607fd 100644 --- a/src/librustc_mir/transform/deaggregator.rs +++ b/src/librustc_mir/transform/deaggregator.rs @@ -34,6 +34,8 @@ impl<'tcx> MirPass<'tcx> for Deaggregator { // Do not trigger on constants. Could be revised in future if let MirSource::Fn(_) = source {} else { return; } + // In fact, we might not want to trigger in other cases. + // Ex: when we could use SROA. See issue #35259 let mut curr: usize = 0; for bb in mir.basic_blocks_mut() { @@ -90,21 +92,24 @@ fn get_aggregate_statement<'a, 'tcx, 'b>(curr: usize, for i in curr..statements.len() { let ref statement = statements[i]; let StatementKind::Assign(_, ref rhs) = statement.kind; - if let &Rvalue::Aggregate(ref kind, ref operands) = rhs { - if let &AggregateKind::Adt(adt_def, variant, _) = kind { - if operands.len() > 0 { // don't deaggregate () - if adt_def.variants.len() > 1 { - // only deaggrate structs for now - continue; - } - debug!("getting variant {:?}", variant); - debug!("for adt_def {:?}", adt_def); - let variant_def = &adt_def.variants[variant]; - if variant_def.kind == VariantKind::Struct { - return Some(i); - } - } - } + let (kind, operands) = match rhs { + &Rvalue::Aggregate(ref kind, ref operands) => (kind, operands), + _ => continue, + }; + let (adt_def, variant) = match kind { + &AggregateKind::Adt(adt_def, variant, _) => (adt_def, variant), + _ => continue, + }; + if operands.len() == 0 || adt_def.variants.len() > 1 { + // don't deaggregate () + // don't deaggregate enums ... for now + continue; + } + debug!("getting variant {:?}", variant); + debug!("for adt_def {:?}", adt_def); + let variant_def = &adt_def.variants[variant]; + if variant_def.kind == VariantKind::Struct { + return Some(i); } }; None |
