@@ -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