reduce rightward drift, add precondition comment

This commit is contained in:
Scott A Carr 2016-08-03 11:10:38 -07:00
parent d5908a3250
commit 06acf16cdb

View File

@ -34,6 +34,8 @@ impl<'tcx> MirPass<'tcx> for Deaggregator {
// Do not trigger on constants. Could be revised in future // Do not trigger on constants. Could be revised in future
if let MirSource::Fn(_) = source {} else { return; } 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; let mut curr: usize = 0;
for bb in mir.basic_blocks_mut() { for bb in mir.basic_blocks_mut() {
@ -90,11 +92,17 @@ fn get_aggregate_statement<'a, 'tcx, 'b>(curr: usize,
for i in curr..statements.len() { for i in curr..statements.len() {
let ref statement = statements[i]; let ref statement = statements[i];
let StatementKind::Assign(_, ref rhs) = statement.kind; let StatementKind::Assign(_, ref rhs) = statement.kind;
if let &Rvalue::Aggregate(ref kind, ref operands) = rhs { let (kind, operands) = match rhs {
if let &AggregateKind::Adt(adt_def, variant, _) = kind { &Rvalue::Aggregate(ref kind, ref operands) => (kind, operands),
if operands.len() > 0 { // don't deaggregate () _ => continue,
if adt_def.variants.len() > 1 { };
// only deaggrate structs for now 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; continue;
} }
debug!("getting variant {:?}", variant); debug!("getting variant {:?}", variant);
@ -103,9 +111,6 @@ fn get_aggregate_statement<'a, 'tcx, 'b>(curr: usize,
if variant_def.kind == VariantKind::Struct { if variant_def.kind == VariantKind::Struct {
return Some(i); return Some(i);
} }
}
}
}
}; };
None None
} }