@@ -125,9 +125,8 @@ impl<'a, 'tcx> Canonicalizer<'a, 'tcx> {
125125 // - var_infos: [E0, U1, E1, U1, E1, E6, U6], curr_compressed_uv: 1, next_orig_uv: 6
126126 // - var_infos: [E0, U1, E1, U1, E1, E2, U2], curr_compressed_uv: 2, next_orig_uv: -
127127 //
128- // This algorithm runs in `O(nm)` where `n` is the number of different universe
129- // indices in the input and `m` is the number of canonical variables.
130- // This should be fine as both `n` and `m` are expected to be small.
128+ // This algorithm runs in `O(n²)` where `n` is the number of different universe
129+ // indices in the input. This should be fine as `n` is expected to be small.
131130 let mut curr_compressed_uv = ty:: UniverseIndex :: ROOT ;
132131 let mut existential_in_new_uv = false ;
133132 let mut next_orig_uv = Some ( ty:: UniverseIndex :: ROOT ) ;
@@ -263,14 +262,18 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'_, 'tcx> {
263262 ty:: ReError ( _) => return r,
264263 } ;
265264
266- let var = ty:: BoundVar :: from (
267- self . variables . iter ( ) . position ( |& v| v == r. into ( ) ) . unwrap_or_else ( || {
268- let var = self . variables . len ( ) ;
269- self . variables . push ( r. into ( ) ) ;
270- self . primitive_var_infos . push ( CanonicalVarInfo { kind } ) ;
271- var
272- } ) ,
273- ) ;
265+ let existing_bound_var = match self . canonicalize_mode {
266+ CanonicalizeMode :: Input => None ,
267+ CanonicalizeMode :: Response { .. } => {
268+ self . variables . iter ( ) . position ( |& v| v == r. into ( ) ) . map ( ty:: BoundVar :: from)
269+ }
270+ } ;
271+ let var = existing_bound_var. unwrap_or_else ( || {
272+ let var = ty:: BoundVar :: from ( self . variables . len ( ) ) ;
273+ self . variables . push ( r. into ( ) ) ;
274+ self . primitive_var_infos . push ( CanonicalVarInfo { kind } ) ;
275+ var
276+ } ) ;
274277 let br = ty:: BoundRegion { var, kind : BrAnon ( None ) } ;
275278 ty:: Region :: new_late_bound ( self . interner ( ) , self . binder_index , br)
276279 }
0 commit comments