@@ -125,9 +125,8 @@ impl<'a, 'tcx> Canonicalizer<'a, 'tcx> {
125
125
// - var_infos: [E0, U1, E1, U1, E1, E6, U6], curr_compressed_uv: 1, next_orig_uv: 6
126
126
// - var_infos: [E0, U1, E1, U1, E1, E2, U2], curr_compressed_uv: 2, next_orig_uv: -
127
127
//
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.
131
130
let mut curr_compressed_uv = ty:: UniverseIndex :: ROOT ;
132
131
let mut existential_in_new_uv = false ;
133
132
let mut next_orig_uv = Some ( ty:: UniverseIndex :: ROOT ) ;
@@ -263,14 +262,18 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'_, 'tcx> {
263
262
ty:: ReError ( _) => return r,
264
263
} ;
265
264
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
+ } ) ;
274
277
let br = ty:: BoundRegion { var, kind : BrAnon ( None ) } ;
275
278
ty:: Region :: new_late_bound ( self . interner ( ) , self . binder_index , br)
276
279
}
0 commit comments