about summary refs log tree commit diff
diff options
context:
space:
mode:
authorScott A Carr <s.carr1024@gmail.com>2016-08-03 11:10:38 -0700
committerScott A Carr <s.carr1024@gmail.com>2016-08-03 11:10:38 -0700
commit06acf16cdb23dad19b9cf816a55df24d4084823c (patch)
treec1a8fa5a637a3c011d0144e67073ca582d2c86f5
parentd5908a32509ccbbc552179cd75d22c8ea20d4092 (diff)
downloadrust-06acf16cdb23dad19b9cf816a55df24d4084823c.tar.gz
rust-06acf16cdb23dad19b9cf816a55df24d4084823c.zip
reduce rightward drift, add precondition comment
-rw-r--r--src/librustc_mir/transform/deaggregator.rs35
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