diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-04-02 12:25:40 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2021-04-02 12:25:40 +0100 |
commit | 00ce7ae5248b41d5944abe6075407236cde1b075 (patch) | |
tree | a7d300232f331eb2d4e854e884c8d8c0d60404c6 /crates/hir_ty/src/infer/unify.rs | |
parent | a0b3eb7135361315ed953613a1a8c7a038b1562d (diff) | |
parent | 0e8c4503bf4754f4437d8bd45a110b9d0ec671e0 (diff) |
Merge #8285
8285: Don't recheck obligations if we have learned nothing new r=matklad a=flodiebold
This is just the most trivial check: If no inference variables have been updated, and there are no new obligations, we can just skip trying to solve them again. We could be smarter about it, but this already helps quite a bit, and I don't want to touch this too much before we replace the inference table by Chalk's.
Fixes #8263 (well, improves it quite a bit).
Co-authored-by: Florian Diebold <[email protected]>
Diffstat (limited to 'crates/hir_ty/src/infer/unify.rs')
-rw-r--r-- | crates/hir_ty/src/infer/unify.rs | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/crates/hir_ty/src/infer/unify.rs b/crates/hir_ty/src/infer/unify.rs index 6e7b0f5a6..5ea4b7481 100644 --- a/crates/hir_ty/src/infer/unify.rs +++ b/crates/hir_ty/src/infer/unify.rs | |||
@@ -231,6 +231,7 @@ pub(crate) struct TypeVariableData { | |||
231 | pub(crate) struct InferenceTable { | 231 | pub(crate) struct InferenceTable { |
232 | pub(super) var_unification_table: InPlaceUnificationTable<TypeVarId>, | 232 | pub(super) var_unification_table: InPlaceUnificationTable<TypeVarId>, |
233 | pub(super) type_variable_table: TypeVariableTable, | 233 | pub(super) type_variable_table: TypeVariableTable, |
234 | pub(super) revision: u32, | ||
234 | } | 235 | } |
235 | 236 | ||
236 | impl InferenceTable { | 237 | impl InferenceTable { |
@@ -238,6 +239,7 @@ impl InferenceTable { | |||
238 | InferenceTable { | 239 | InferenceTable { |
239 | var_unification_table: InPlaceUnificationTable::new(), | 240 | var_unification_table: InPlaceUnificationTable::new(), |
240 | type_variable_table: TypeVariableTable { inner: Vec::new() }, | 241 | type_variable_table: TypeVariableTable { inner: Vec::new() }, |
242 | revision: 0, | ||
241 | } | 243 | } |
242 | } | 244 | } |
243 | 245 | ||
@@ -360,7 +362,10 @@ impl InferenceTable { | |||
360 | == self.type_variable_table.is_diverging(*tv2) => | 362 | == self.type_variable_table.is_diverging(*tv2) => |
361 | { | 363 | { |
362 | // both type vars are unknown since we tried to resolve them | 364 | // both type vars are unknown since we tried to resolve them |
363 | self.var_unification_table.union(tv1.to_inner(), tv2.to_inner()); | 365 | if !self.var_unification_table.unioned(tv1.to_inner(), tv2.to_inner()) { |
366 | self.var_unification_table.union(tv1.to_inner(), tv2.to_inner()); | ||
367 | self.revision += 1; | ||
368 | } | ||
364 | true | 369 | true |
365 | } | 370 | } |
366 | 371 | ||
@@ -398,6 +403,7 @@ impl InferenceTable { | |||
398 | tv.to_inner(), | 403 | tv.to_inner(), |
399 | TypeVarValue::Known(other.clone().intern(&Interner)), | 404 | TypeVarValue::Known(other.clone().intern(&Interner)), |
400 | ); | 405 | ); |
406 | self.revision += 1; | ||
401 | true | 407 | true |
402 | } | 408 | } |
403 | 409 | ||