Re-introduce concept of projection cache 'completion'
Instead of clearing out the cache entirely, we store the intermediate evaluation result into the cache entry. This accomplishes several things: * We avoid the performance hit associated with re-evaluating the sub-obligations * We avoid causing issues with incremental compilation, since the final evaluation result is always the same * We avoid affecting other uses of the same `InferCtxt` which might care about 'side effects' from processing the sub-obligations (e,g. region constraints). Only code that is specifically aware of the new 'complete' code is affected
This commit is contained in:
parent
91a0600a5c
commit
40ef1d3223
5 changed files with 138 additions and 6 deletions
|
@ -889,7 +889,7 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>(
|
|||
debug!("recur cache");
|
||||
return Err(InProgress);
|
||||
}
|
||||
Err(ProjectionCacheEntry::NormalizedTy(ty)) => {
|
||||
Err(ProjectionCacheEntry::NormalizedTy { ty, complete: _ }) => {
|
||||
// This is the hottest path in this function.
|
||||
//
|
||||
// If we find the value in the cache, then return it along
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue