Skip to content

Commit 99f60ec

Browse files
Revert "don't uniquify regions when canonicalizing"
This reverts commit 171f541.
1 parent 0d95f91 commit 99f60ec

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

compiler/rustc_trait_selection/src/solve/canonicalize.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)