@@ -34,6 +34,8 @@ impl<'tcx> MirPass<'tcx> for Deaggregator {
34
34
35
35
// Do not trigger on constants. Could be revised in future
36
36
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
37
39
38
40
let mut curr: usize = 0 ;
39
41
for bb in mir. basic_blocks_mut ( ) {
@@ -90,21 +92,24 @@ fn get_aggregate_statement<'a, 'tcx, 'b>(curr: usize,
90
92
for i in curr..statements. len ( ) {
91
93
let ref statement = statements[ i] ;
92
94
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) ;
108
113
}
109
114
} ;
110
115
None
0 commit comments