@@ -186,34 +186,39 @@ impl<'cx, 'gcx, 'tcx> LexicalResolver<'cx, 'gcx, 'tcx> {
186
186
}
187
187
188
188
fn expansion ( & self , var_values : & mut LexicalRegionResolutions < ' tcx > ) {
189
- self . iterate_until_fixed_point ( "Expansion" , |constraint, origin | {
190
- debug ! ( "expansion: constraint={:?} origin={:?} " , constraint, origin ) ;
191
- match * constraint {
189
+ self . iterate_until_fixed_point ( "Expansion" , |constraint| {
190
+ debug ! ( "expansion: constraint={:?}" , constraint) ;
191
+ let ( a_region , b_vid , b_data , retain ) = match * constraint {
192
192
Constraint :: RegSubVar ( a_region, b_vid) => {
193
193
let b_data = var_values. value_mut ( b_vid) ;
194
- ( self . expand_node ( a_region, b_vid, b_data) , false )
194
+ ( a_region, b_vid, b_data, false )
195
195
}
196
196
Constraint :: VarSubVar ( a_vid, b_vid) => match * var_values. value ( a_vid) {
197
- VarValue :: ErrorValue => ( false , false ) ,
197
+ VarValue :: ErrorValue => return ( false , false ) ,
198
198
VarValue :: Value ( a_region) => {
199
- let b_node = var_values. value_mut ( b_vid) ;
200
- let changed = self . expand_node ( a_region, b_vid, b_node) ;
201
- let retain = match * b_node {
199
+ let b_data = var_values. value_mut ( b_vid) ;
200
+ let retain = match * b_data {
202
201
VarValue :: Value ( ReStatic ) | VarValue :: ErrorValue => false ,
203
202
_ => true
204
203
} ;
205
- ( changed , retain)
204
+ ( a_region , b_vid , b_data , retain)
206
205
}
207
206
} ,
208
207
Constraint :: RegSubReg ( ..) | Constraint :: VarSubReg ( ..) => {
209
208
// These constraints are checked after expansion
210
209
// is done, in `collect_errors`.
211
- ( false , false )
210
+ return ( false , false )
212
211
}
213
- }
212
+ } ;
213
+
214
+ let changed = self . expand_node ( a_region, b_vid, b_data) ;
215
+ ( changed, retain)
214
216
} )
215
217
}
216
218
219
+ // This function is very hot in some workloads. There's a single callsite
220
+ // so always inlining is ok even though it's large.
221
+ #[ inline( always) ]
217
222
fn expand_node (
218
223
& self ,
219
224
a_region : Region < ' tcx > ,
@@ -722,18 +727,17 @@ impl<'cx, 'gcx, 'tcx> LexicalResolver<'cx, 'gcx, 'tcx> {
722
727
}
723
728
724
729
fn iterate_until_fixed_point < F > ( & self , tag : & str , mut body : F )
725
- where
726
- F : FnMut ( & Constraint < ' tcx > , & SubregionOrigin < ' tcx > ) -> ( bool , bool ) ,
730
+ where F : FnMut ( & Constraint < ' tcx > ) -> ( bool , bool ) ,
727
731
{
728
- let mut constraints: SmallVec < [ _ ; 16 ] > = self . data . constraints . iter ( ) . collect ( ) ;
732
+ let mut constraints: SmallVec < [ _ ; 16 ] > = self . data . constraints . keys ( ) . collect ( ) ;
729
733
let mut iteration = 0 ;
730
734
let mut changed = true ;
731
735
while changed {
732
736
changed = false ;
733
737
iteration += 1 ;
734
738
debug ! ( "---- {} Iteration {}{}" , "#" , tag, iteration) ;
735
- constraints. retain ( |( constraint, origin ) | {
736
- let ( edge_changed, retain) = body ( constraint, origin ) ;
739
+ constraints. retain ( |constraint| {
740
+ let ( edge_changed, retain) = body ( constraint) ;
737
741
if edge_changed {
738
742
debug ! ( "Updated due to constraint {:?}" , constraint) ;
739
743
changed = true ;
0 commit comments