Skip to content

Commit 06acf16

Browse files
committed
reduce rightward drift, add precondition comment
1 parent d5908a3 commit 06acf16

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

src/librustc_mir/transform/deaggregator.rs

+20-15
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ impl<'tcx> MirPass<'tcx> for Deaggregator {
3434

3535
// Do not trigger on constants. Could be revised in future
3636
if let MirSource::Fn(_) = source {} else { return; }
37+
// In fact, we might not want to trigger in other cases.
38+
// Ex: when we could use SROA. See issue #35259
3739

3840
let mut curr: usize = 0;
3941
for bb in mir.basic_blocks_mut() {
@@ -90,21 +92,24 @@ fn get_aggregate_statement<'a, 'tcx, 'b>(curr: usize,
9092
for i in curr..statements.len() {
9193
let ref statement = statements[i];
9294
let StatementKind::Assign(_, ref rhs) = statement.kind;
93-
if let &Rvalue::Aggregate(ref kind, ref operands) = rhs {
94-
if let &AggregateKind::Adt(adt_def, variant, _) = kind {
95-
if operands.len() > 0 { // don't deaggregate ()
96-
if adt_def.variants.len() > 1 {
97-
// only deaggrate structs for now
98-
continue;
99-
}
100-
debug!("getting variant {:?}", variant);
101-
debug!("for adt_def {:?}", adt_def);
102-
let variant_def = &adt_def.variants[variant];
103-
if variant_def.kind == VariantKind::Struct {
104-
return Some(i);
105-
}
106-
}
107-
}
95+
let (kind, operands) = match rhs {
96+
&Rvalue::Aggregate(ref kind, ref operands) => (kind, operands),
97+
_ => continue,
98+
};
99+
let (adt_def, variant) = match kind {
100+
&AggregateKind::Adt(adt_def, variant, _) => (adt_def, variant),
101+
_ => continue,
102+
};
103+
if operands.len() == 0 || adt_def.variants.len() > 1 {
104+
// don't deaggregate ()
105+
// don't deaggregate enums ... for now
106+
continue;
107+
}
108+
debug!("getting variant {:?}", variant);
109+
debug!("for adt_def {:?}", adt_def);
110+
let variant_def = &adt_def.variants[variant];
111+
if variant_def.kind == VariantKind::Struct {
112+
return Some(i);
108113
}
109114
};
110115
None

0 commit comments

Comments
 (0)