mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 19:17:43 +00:00
reduce rightward drift, add precondition comment
This commit is contained in:
parent
d5908a3250
commit
06acf16cdb
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user