Skip to content

Commit 171f541

Browse files
committed
don't uniquify regions when canonicalizing
1 parent b80ee39 commit 171f541

File tree

1 file changed

+11
-14
lines changed

1 file changed

+11
-14
lines changed

compiler/rustc_trait_selection/src/solve/canonicalize.rs

+11-14
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,9 @@ 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(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.
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.
130131
let mut curr_compressed_uv = ty::UniverseIndex::ROOT;
131132
let mut existential_in_new_uv = false;
132133
let mut next_orig_uv = Some(ty::UniverseIndex::ROOT);
@@ -245,18 +246,14 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'_, 'tcx> {
245246
ty::ReError(_) => return r,
246247
};
247248

248-
let existing_bound_var = match self.canonicalize_mode {
249-
CanonicalizeMode::Input => None,
250-
CanonicalizeMode::Response { .. } => {
251-
self.variables.iter().position(|&v| v == r.into()).map(ty::BoundVar::from)
252-
}
253-
};
254-
let var = existing_bound_var.unwrap_or_else(|| {
255-
let var = ty::BoundVar::from(self.variables.len());
256-
self.variables.push(r.into());
257-
self.primitive_var_infos.push(CanonicalVarInfo { kind });
258-
var
259-
});
249+
let var = ty::BoundVar::from(
250+
self.variables.iter().position(|&v| v == r.into()).unwrap_or_else(|| {
251+
let var = self.variables.len();
252+
self.variables.push(r.into());
253+
self.primitive_var_infos.push(CanonicalVarInfo { kind });
254+
var
255+
}),
256+
);
260257
let br = ty::BoundRegion { var, kind: BrAnon(None) };
261258
self.interner().mk_re_late_bound(self.binder_index, br)
262259
}

0 commit comments

Comments
 (0)