Author: Younan Zhang Date: 2026-09-01T12:12:04Z New Revision: a54901ed3a9a7c47783f83d692f4b7082b138ea6
URL: https://github.com/llvm/llvm-project/commit/a54901ed3a9a7c47783f83d692f4b7082b138ea6 DIFF: https://github.com/llvm/llvm-project/commit/a54901ed3a9a7c47783f83d692f4b7082b138ea6.diff LOG: [Clang][NFC] Clean up ConstraintSatisfactionChecker (#220161) We had duplicated cache lookup/insertion logic and we could combine them together. Added: Modified: clang/lib/Sema/SemaConcept.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index 1fb9485b411bd..ee17f826dc32c 100644 --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -505,6 +505,25 @@ class HashParameterMapping : public RecursiveASTVisitor<HashParameterMapping> { } void VisitConstraint(const NormalizedConstraintWithParamMapping &Constraint) { + switch (Constraint.getKind()) { + case NormalizedConstraint::ConstraintKind::Atomic: + ID.AddPointer(static_cast<const AtomicConstraint &>(Constraint) + .getConstraintExpr()); + ID.AddInteger(OuterPackSubstIndex.toInternalRepresentation()); + break; + case NormalizedConstraint::ConstraintKind::ConceptId: + ID.AddPointer( + static_cast<const ConceptIdConstraint &>(Constraint).getConceptId()); + ID.AddInteger(OuterPackSubstIndex.toInternalRepresentation()); + break; + case NormalizedConstraint::ConstraintKind::FoldExpanded: + ID.AddPointer( + static_cast<const FoldExpandedConstraint &>(Constraint).getPattern()); + break; + case NormalizedConstraint::ConstraintKind::Compound: + llvm_unreachable("Cannot hash a compound constraint"); + } + if (!Constraint.hasParameterMapping()) { for (const auto &List : TemplateArgs) for (const TemplateArgument &Arg : List.Args) @@ -548,6 +567,56 @@ class ConstraintSatisfactionChecker { llvm::DenseMap<llvm::FoldingSetNodeID, TemplateArgumentLoc> CachedTemplateArgs; +private: + struct ParameterMappingInstantiationCache { + llvm::FoldingSetNodeID ID; + ConstraintSatisfactionChecker &Checker; + HashParameterMapping H; + unsigned PreviousDetailsSize; + + ParameterMappingInstantiationCache( + ConstraintSatisfactionChecker &Checker, + const NormalizedConstraintWithParamMapping &Constraint, + const MultiLevelTemplateArgumentList &MLTAL, UnsignedOrNone PackIndex, + UnsignedOrNone PreviousDetailsSize = std::nullopt) + : Checker(Checker), H(Checker.S, MLTAL, ID, PackIndex), + PreviousDetailsSize(PreviousDetailsSize + ? *PreviousDetailsSize + : Checker.Satisfaction.Details.size()) { + H.VisitConstraint(Constraint); + } + + const UnsubstitutedConstraintSatisfactionCacheResult *available() { + auto &Cache = Checker.S.UnsubstitutedConstraintSatisfactionCache; + auto Iter = Cache.find(ID); + if (Iter == Cache.end()) + return nullptr; + auto &Satisfaction = Checker.Satisfaction; + auto &Cached = Iter->second.Satisfaction; + Satisfaction.ContainsErrors = Cached.ContainsErrors; + Satisfaction.IsSatisfied = Cached.IsSatisfied; + Satisfaction.Details.insert(Satisfaction.Details.begin() + + PreviousDetailsSize, + Cached.Details.begin(), Cached.Details.end()); + return &Iter->second; + } + + ExprResult cache(ExprResult E) { + UnsubstitutedConstraintSatisfactionCacheResult Cache; + auto &Satisfaction = Checker.Satisfaction; + Cache.Satisfaction.ContainsErrors = Satisfaction.ContainsErrors; + Cache.Satisfaction.IsSatisfied = Satisfaction.IsSatisfied; + Cache.Satisfaction.Details.insert(Cache.Satisfaction.Details.end(), + Satisfaction.Details.begin() + + PreviousDetailsSize, + Satisfaction.Details.end()); + Cache.SubstExpr = E; + Checker.S.UnsubstitutedConstraintSatisfactionCache.insert( + {ID, std::move(Cache)}); + return E; + } + }; + private: template <class Constraint> UnsignedOrNone getOuterPackIndex(const Constraint &C) const { @@ -870,37 +939,13 @@ ExprResult ConstraintSatisfactionChecker::Evaluate( const AtomicConstraint &Constraint, const MultiLevelTemplateArgumentList &MLTAL) { - unsigned Size = Satisfaction.Details.size(); - llvm::FoldingSetNodeID ID; - UnsignedOrNone OuterPackSubstIndex = getOuterPackIndex(Constraint); - - ID.AddPointer(Constraint.getConstraintExpr()); - ID.AddInteger(OuterPackSubstIndex.toInternalRepresentation()); - HashParameterMapping(S, MLTAL, ID, OuterPackSubstIndex) - .VisitConstraint(Constraint); - - if (auto Iter = S.UnsubstitutedConstraintSatisfactionCache.find(ID); - Iter != S.UnsubstitutedConstraintSatisfactionCache.end()) { - auto &Cached = Iter->second.Satisfaction; - Satisfaction.ContainsErrors = Cached.ContainsErrors; - Satisfaction.IsSatisfied = Cached.IsSatisfied; - Satisfaction.Details.insert(Satisfaction.Details.begin() + Size, - Cached.Details.begin(), Cached.Details.end()); - return Iter->second.SubstExpr; - } - - ExprResult E = EvaluateSlow(Constraint, MLTAL); - - UnsubstitutedConstraintSatisfactionCacheResult Cache; - Cache.Satisfaction.ContainsErrors = Satisfaction.ContainsErrors; - Cache.Satisfaction.IsSatisfied = Satisfaction.IsSatisfied; - Cache.Satisfaction.Details.insert(Cache.Satisfaction.Details.end(), - Satisfaction.Details.begin() + Size, - Satisfaction.Details.end()); - Cache.SubstExpr = E; - S.UnsubstitutedConstraintSatisfactionCache.insert({ID, std::move(Cache)}); - - return E; + ParameterMappingInstantiationCache PMCache(*this, Constraint, MLTAL, + getOuterPackIndex(Constraint)); + + if (auto *V = PMCache.available()) + return V->SubstExpr; + + return PMCache.cache(EvaluateSlow(Constraint, MLTAL)); } UnsignedOrNone @@ -997,33 +1042,13 @@ ExprResult ConstraintSatisfactionChecker::Evaluate( const FoldExpandedConstraint &Constraint, const MultiLevelTemplateArgumentList &MLTAL) { - llvm::FoldingSetNodeID ID; - ID.AddPointer(Constraint.getPattern()); - HashParameterMapping(S, MLTAL, ID, std::nullopt).VisitConstraint(Constraint); + ParameterMappingInstantiationCache PMCache(*this, Constraint, MLTAL, + /*PackIndex=*/std::nullopt); - if (auto Iter = S.UnsubstitutedConstraintSatisfactionCache.find(ID); - Iter != S.UnsubstitutedConstraintSatisfactionCache.end()) { + if (auto *V = PMCache.available()) + return V->SubstExpr; - auto &Cached = Iter->second.Satisfaction; - Satisfaction.ContainsErrors = Cached.ContainsErrors; - Satisfaction.IsSatisfied = Cached.IsSatisfied; - Satisfaction.Details.insert(Satisfaction.Details.end(), - Cached.Details.begin(), Cached.Details.end()); - return Iter->second.SubstExpr; - } - - unsigned Size = Satisfaction.Details.size(); - - ExprResult E = EvaluateSlow(Constraint, MLTAL); - UnsubstitutedConstraintSatisfactionCacheResult Cache; - Cache.Satisfaction.ContainsErrors = Satisfaction.ContainsErrors; - Cache.Satisfaction.IsSatisfied = Satisfaction.IsSatisfied; - Cache.Satisfaction.Details.insert(Cache.Satisfaction.Details.end(), - Satisfaction.Details.begin() + Size, - Satisfaction.Details.end()); - Cache.SubstExpr = E; - S.UnsubstitutedConstraintSatisfactionCache.insert({ID, std::move(Cache)}); - return E; + return PMCache.cache(EvaluateSlow(Constraint, MLTAL)); } ExprResult ConstraintSatisfactionChecker::EvaluateSlow( @@ -1129,36 +1154,13 @@ ExprResult ConstraintSatisfactionChecker::Evaluate( if (Satisfaction.IsSatisfied) return E; - UnsignedOrNone OuterPackSubstIndex = getOuterPackIndex(Constraint); - llvm::FoldingSetNodeID ID; - ID.AddPointer(Constraint.getConceptId()); - ID.AddInteger(OuterPackSubstIndex.toInternalRepresentation()); - HashParameterMapping(S, MLTAL, ID, OuterPackSubstIndex) - .VisitConstraint(Constraint); + ParameterMappingInstantiationCache PMCache( + *this, Constraint, MLTAL, getOuterPackIndex(Constraint), Size); - if (auto Iter = S.UnsubstitutedConstraintSatisfactionCache.find(ID); - Iter != S.UnsubstitutedConstraintSatisfactionCache.end()) { + if (auto *V = PMCache.available()) + return V->SubstExpr; - auto &Cached = Iter->second.Satisfaction; - Satisfaction.ContainsErrors = Cached.ContainsErrors; - Satisfaction.IsSatisfied = Cached.IsSatisfied; - Satisfaction.Details.insert(Satisfaction.Details.begin() + Size, - Cached.Details.begin(), Cached.Details.end()); - return Iter->second.SubstExpr; - } - - ExprResult CE = EvaluateSlow(Constraint, MLTAL, Size); - if (CE.isInvalid()) - return E; - UnsubstitutedConstraintSatisfactionCacheResult Cache; - Cache.Satisfaction.ContainsErrors = Satisfaction.ContainsErrors; - Cache.Satisfaction.IsSatisfied = Satisfaction.IsSatisfied; - Cache.Satisfaction.Details.insert(Cache.Satisfaction.Details.end(), - Satisfaction.Details.begin() + Size, - Satisfaction.Details.end()); - Cache.SubstExpr = CE; - S.UnsubstitutedConstraintSatisfactionCache.insert({ID, std::move(Cache)}); - return CE; + return PMCache.cache(EvaluateSlow(Constraint, MLTAL, Size)); } ExprResult ConstraintSatisfactionChecker::Evaluate( _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
