Skip to content

Commit 382fdc5

Browse files
committed
EagerResolver don't go into env if unnecessary
1 parent 926774a commit 382fdc5

File tree

6 files changed

+69
-16
lines changed

6 files changed

+69
-16
lines changed

compiler/rustc_middle/src/ty/structural_impls.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,19 @@ impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for ty::Clause<'tcx> {
570570
}
571571
}
572572

573+
impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for ty::Clauses<'tcx> {
574+
fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
575+
self,
576+
folder: &mut F,
577+
) -> Result<Self, F::Error> {
578+
folder.try_fold_clauses(self)
579+
}
580+
581+
fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
582+
folder.fold_clauses(self)
583+
}
584+
}
585+
573586
impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for ty::Predicate<'tcx> {
574587
fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
575588
visitor.visit_predicate(*self)
@@ -615,6 +628,19 @@ impl<'tcx> TypeSuperVisitable<TyCtxt<'tcx>> for ty::Clauses<'tcx> {
615628
}
616629
}
617630

631+
impl<'tcx> TypeSuperFoldable<TyCtxt<'tcx>> for ty::Clauses<'tcx> {
632+
fn try_super_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
633+
self,
634+
folder: &mut F,
635+
) -> Result<Self, F::Error> {
636+
ty::util::try_fold_list(self, folder, |tcx, v| tcx.mk_clauses(v))
637+
}
638+
639+
fn super_fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
640+
ty::util::fold_list(self, folder, |tcx, v| tcx.mk_clauses(v))
641+
}
642+
}
643+
618644
impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for ty::Const<'tcx> {
619645
fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
620646
self,
@@ -775,7 +801,6 @@ macro_rules! list_fold {
775801
}
776802

777803
list_fold! {
778-
ty::Clauses<'tcx> : mk_clauses,
779804
&'tcx ty::List<ty::PolyExistentialPredicate<'tcx>> : mk_poly_existential_predicates,
780805
&'tcx ty::List<PlaceElem<'tcx>> : mk_place_elems,
781806
&'tcx ty::List<ty::Pattern<'tcx>> : mk_patterns,

compiler/rustc_next_trait_solver/src/resolve.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::delegate::SolverDelegate;
1111
// EAGER RESOLUTION
1212

1313
/// Resolves ty, region, and const vars to their inferred values or their root vars.
14-
pub struct EagerResolver<'a, D, I = <D as SolverDelegate>::Interner>
14+
struct EagerResolver<'a, D, I = <D as SolverDelegate>::Interner>
1515
where
1616
D: SolverDelegate<Interner = I>,
1717
I: Interner,
@@ -22,8 +22,20 @@ where
2222
cache: DelayedMap<I::Ty, I::Ty>,
2323
}
2424

25+
pub fn eager_resolve_vars<D: SolverDelegate, T: TypeFoldable<D::Interner>>(
26+
delegate: &D,
27+
value: T,
28+
) -> T {
29+
if value.has_infer() {
30+
let mut folder = EagerResolver::new(delegate);
31+
value.fold_with(&mut folder)
32+
} else {
33+
value
34+
}
35+
}
36+
2537
impl<'a, D: SolverDelegate> EagerResolver<'a, D> {
26-
pub fn new(delegate: &'a D) -> Self {
38+
fn new(delegate: &'a D) -> Self {
2739
EagerResolver { delegate, cache: Default::default() }
2840
}
2941
}
@@ -86,4 +98,8 @@ impl<D: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for EagerResolv
8698
}
8799
}
88100
}
101+
102+
fn fold_clauses(&mut self, c: I::Clauses) -> I::Clauses {
103+
if c.has_infer() { c.super_fold_with(self) } else { c }
104+
}
89105
}

compiler/rustc_next_trait_solver/src/solve/eval_ctxt/canonical.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use tracing::{debug, instrument, trace};
2222

2323
use crate::canonicalizer::Canonicalizer;
2424
use crate::delegate::SolverDelegate;
25-
use crate::resolve::EagerResolver;
25+
use crate::resolve::eager_resolve_vars;
2626
use crate::solve::eval_ctxt::CurrentGoalKind;
2727
use crate::solve::{
2828
CanonicalInput, CanonicalResponse, Certainty, EvalCtxt, ExternalConstraintsData, Goal,
@@ -61,8 +61,7 @@ where
6161
// so we only canonicalize the lookup table and ignore
6262
// duplicate entries.
6363
let opaque_types = self.delegate.clone_opaque_types_lookup_table();
64-
let (goal, opaque_types) =
65-
(goal, opaque_types).fold_with(&mut EagerResolver::new(self.delegate));
64+
let (goal, opaque_types) = eager_resolve_vars(self.delegate, (goal, opaque_types));
6665

6766
let mut orig_values = Default::default();
6867
let canonical = Canonicalizer::canonicalize_input(
@@ -157,8 +156,8 @@ where
157156

158157
let external_constraints =
159158
self.compute_external_query_constraints(certainty, normalization_nested_goals);
160-
let (var_values, mut external_constraints) = (self.var_values, external_constraints)
161-
.fold_with(&mut EagerResolver::new(self.delegate));
159+
let (var_values, mut external_constraints) =
160+
eager_resolve_vars(self.delegate, (self.var_values, external_constraints));
162161

163162
// Remove any trivial or duplicated region constraints once we've resolved regions
164163
let mut unique = HashSet::default();
@@ -469,7 +468,7 @@ where
469468
{
470469
let var_values = CanonicalVarValues { var_values: delegate.cx().mk_args(var_values) };
471470
let state = inspect::State { var_values, data };
472-
let state = state.fold_with(&mut EagerResolver::new(delegate));
471+
let state = eager_resolve_vars(delegate, state);
473472
Canonicalizer::canonicalize_response(delegate, max_input_universe, &mut vec![], state)
474473
}
475474

compiler/rustc_trait_selection/src/solve/inspect/analyse.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ use rustc_infer::infer::{DefineOpaqueTypes, InferCtxt, InferOk};
1515
use rustc_macros::extension;
1616
use rustc_middle::traits::ObligationCause;
1717
use rustc_middle::traits::solve::{Certainty, Goal, GoalSource, NoSolution, QueryResult};
18-
use rustc_middle::ty::{TyCtxt, TypeFoldable, VisitorResult, try_visit};
18+
use rustc_middle::ty::{TyCtxt, VisitorResult, try_visit};
1919
use rustc_middle::{bug, ty};
20-
use rustc_next_trait_solver::resolve::EagerResolver;
20+
use rustc_next_trait_solver::resolve::eager_resolve_vars;
2121
use rustc_next_trait_solver::solve::inspect::{self, instantiate_canonical_state};
2222
use rustc_next_trait_solver::solve::{GenerateProofTree, MaybeCause, SolverDelegateEvalExt as _};
2323
use rustc_span::{DUMMY_SP, Span};
@@ -187,8 +187,7 @@ impl<'a, 'tcx> InspectCandidate<'a, 'tcx> {
187187
let _ = term_hack.constrain(infcx, span, param_env);
188188
}
189189

190-
let opt_impl_args =
191-
opt_impl_args.map(|impl_args| impl_args.fold_with(&mut EagerResolver::new(infcx)));
190+
let opt_impl_args = opt_impl_args.map(|impl_args| eager_resolve_vars(infcx, impl_args));
192191

193192
let goals = instantiated_goals
194193
.into_iter()
@@ -392,7 +391,7 @@ impl<'a, 'tcx> InspectGoal<'a, 'tcx> {
392391
infcx,
393392
depth,
394393
orig_values,
395-
goal: uncanonicalized_goal.fold_with(&mut EagerResolver::new(infcx)),
394+
goal: eager_resolve_vars(infcx, uncanonicalized_goal),
396395
result,
397396
evaluation_kind: evaluation.kind,
398397
normalizes_to_term_hack,

compiler/rustc_type_ir/src/fold.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,10 @@ pub trait TypeFolder<I: Interner>: Sized {
152152
fn fold_predicate(&mut self, p: I::Predicate) -> I::Predicate {
153153
p.super_fold_with(self)
154154
}
155+
156+
fn fold_clauses(&mut self, c: I::Clauses) -> I::Clauses {
157+
c.super_fold_with(self)
158+
}
155159
}
156160

157161
/// This trait is implemented for every folding traversal. There is a fold
@@ -190,6 +194,10 @@ pub trait FallibleTypeFolder<I: Interner>: Sized {
190194
fn try_fold_predicate(&mut self, p: I::Predicate) -> Result<I::Predicate, Self::Error> {
191195
p.try_super_fold_with(self)
192196
}
197+
198+
fn try_fold_clauses(&mut self, c: I::Clauses) -> Result<I::Clauses, Self::Error> {
199+
c.try_super_fold_with(self)
200+
}
193201
}
194202

195203
///////////////////////////////////////////////////////////////////////////

compiler/rustc_type_ir/src/interner.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::lang_items::TraitSolverLangItem;
1313
use crate::relate::Relate;
1414
use crate::solve::{CanonicalInput, ExternalConstraintsData, PredefinedOpaquesData, QueryResult};
1515
use crate::visit::{Flags, TypeSuperVisitable, TypeVisitable};
16-
use crate::{self as ty, CanonicalParamEnvCacheEntry, search_graph};
16+
use crate::{self as ty, CanonicalParamEnvCacheEntry, TypeSuperFoldable, search_graph};
1717

1818
#[cfg_attr(feature = "nightly", rustc_diagnostic_item = "type_ir_interner")]
1919
pub trait Interner:
@@ -146,7 +146,13 @@ pub trait Interner:
146146
type ParamEnv: ParamEnv<Self>;
147147
type Predicate: Predicate<Self>;
148148
type Clause: Clause<Self>;
149-
type Clauses: Copy + Debug + Hash + Eq + TypeSuperVisitable<Self> + Flags;
149+
type Clauses: Copy
150+
+ Debug
151+
+ Hash
152+
+ Eq
153+
+ TypeSuperVisitable<Self>
154+
+ TypeSuperFoldable<Self>
155+
+ Flags;
150156

151157
fn with_global_cache<R>(self, f: impl FnOnce(&mut search_graph::GlobalCache<Self>) -> R) -> R;
152158

0 commit comments

Comments
 (0)