mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 11:07:42 +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,21 +92,24 @@ 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 {
|
||||||
continue;
|
&AggregateKind::Adt(adt_def, variant, _) => (adt_def, variant),
|
||||||
}
|
_ => continue,
|
||||||
debug!("getting variant {:?}", variant);
|
};
|
||||||
debug!("for adt_def {:?}", adt_def);
|
if operands.len() == 0 || adt_def.variants.len() > 1 {
|
||||||
let variant_def = &adt_def.variants[variant];
|
// don't deaggregate ()
|
||||||
if variant_def.kind == VariantKind::Struct {
|
// don't deaggregate enums ... for now
|
||||||
return Some(i);
|
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
|
None
|
||||||
|
Loading…
Reference in New Issue
Block a user