https://github.com/kazutakahirata created https://github.com/llvm/llvm-project/pull/109375
GlobalMethodPool, the type of MethodPool, is a type wrapping DenseMap and exposes only a subset of the DenseMap methods. This patch adds operator[] to GlobalMethodPool so that we can avoid repeated hash lookups. I don't bother using references or rvalue references in operator[] because Selector, the key type, is small and trivially copyable. Note that Selector is a class that wraps a PointerUnion. >From 60d190e733b7a0f333bcb6676d0c701db1370d90 Mon Sep 17 00:00:00 2001 From: Kazu Hirata <k...@google.com> Date: Thu, 19 Sep 2024 09:28:49 -0700 Subject: [PATCH] [Sema] Avoid repeated hash lookups (NFC) GlobalMethodPool, the type of MethodPool, is a type wrapping DenseMap and exposes only a subset of the DenseMap methods. This patch adds operator[] to GlobalMethodPool so that we can avoid repeated hash lookups. I don't bother using references or rvalue references in operator[] because Selector, the key type, is small and trivially copyable. Note that Selector is a class that wraps a PointerUnion. --- clang/include/clang/Sema/SemaObjC.h | 1 + clang/lib/Sema/SemaDeclObjC.cpp | 9 ++------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Sema/SemaObjC.h b/clang/include/clang/Sema/SemaObjC.h index 213c37b5091fe0..b868e9e7cd0aa9 100644 --- a/clang/include/clang/Sema/SemaObjC.h +++ b/clang/include/clang/Sema/SemaObjC.h @@ -218,6 +218,7 @@ class SemaObjC : public SemaBase { std::pair<iterator, bool> insert(std::pair<Selector, Lists> &&Val) { return Methods.insert(Val); } + Lists &operator[](Selector Key) { return Methods[Key]; } int count(Selector Sel) const { return Methods.count(Sel); } bool empty() const { return Methods.empty(); } diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 807453400abdd0..87be43b13813d3 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -3441,16 +3441,11 @@ void SemaObjC::AddMethodToGlobalPool(ObjCMethodDecl *Method, bool impl, if (SemaRef.ExternalSource) ReadMethodPool(Method->getSelector()); - GlobalMethodPool::iterator Pos = MethodPool.find(Method->getSelector()); - if (Pos == MethodPool.end()) - Pos = MethodPool - .insert(std::make_pair(Method->getSelector(), - GlobalMethodPool::Lists())) - .first; + auto &Lists = MethodPool[Method->getSelector()]; Method->setDefined(impl); - ObjCMethodList &Entry = instance ? Pos->second.first : Pos->second.second; + ObjCMethodList &Entry = instance ? Lists.first : Lists.second; addMethodToGlobalList(&Entry, Method); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits