Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
Switch SmallSetVector to use DenseSet when it overflows its inline sp…
Browse files Browse the repository at this point in the history
…ace.

Summary:
SetVector already used DenseSet, but SmallSetVector used std::set.  This
leads to surprising performance differences.  Moreover, it means that
the set of key types accepted by SetVector and SmallSetVector are
quite different!

In order to make this change, we had to convert some callsites that used
SmallSetVector<std::string, N> to use SmallSetVector<CachedHashString, N>
instead.

Reviewers: timshen

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D25648

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284887 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Justin Lebar committed Oct 21, 2016
1 parent d18ea66 commit a663b0a
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 7 deletions.
3 changes: 2 additions & 1 deletion include/clang/Lex/HeaderSearchOptions.h
Expand Up @@ -11,6 +11,7 @@
#define LLVM_CLANG_LEX_HEADERSEARCHOPTIONS_H

#include "clang/Basic/LLVM.h"
#include "llvm/ADT/CachedHashString.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/StringRef.h"
Expand Down Expand Up @@ -144,7 +145,7 @@ class HeaderSearchOptions : public RefCountedBase<HeaderSearchOptions> {

/// \brief The set of macro names that should be ignored for the purposes
/// of computing the module hash.
llvm::SmallSetVector<std::string, 16> ModulesIgnoreMacros;
llvm::SmallSetVector<llvm::CachedHashString, 16> ModulesIgnoreMacros;

/// \brief The set of user-provided virtual filesystem overlay files.
std::vector<std::string> VFSOverlayFiles;
Expand Down
7 changes: 4 additions & 3 deletions lib/CodeGen/CGObjCMac.cpp
Expand Up @@ -11,9 +11,9 @@
//
//===----------------------------------------------------------------------===//

#include "CGObjCRuntime.h"
#include "CGBlocks.h"
#include "CGCleanup.h"
#include "CGObjCRuntime.h"
#include "CGRecordLayout.h"
#include "CodeGenFunction.h"
#include "CodeGenModule.h"
Expand All @@ -25,6 +25,7 @@
#include "clang/Basic/LangOptions.h"
#include "clang/CodeGen/CGFunctionInfo.h"
#include "clang/Frontend/CodeGenOptions.h"
#include "llvm/ADT/CachedHashString.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
Expand Down Expand Up @@ -843,7 +844,7 @@ class CGObjCCommonMac : public CodeGen::CGObjCRuntime {
llvm::DenseMap<Selector, llvm::GlobalVariable*> MethodVarNames;

/// DefinedCategoryNames - list of category names in form Class_Category.
llvm::SmallSetVector<std::string, 16> DefinedCategoryNames;
llvm::SmallSetVector<llvm::CachedHashString, 16> DefinedCategoryNames;

/// MethodVarTypes - uniqued method type signatures. We have to use
/// a StringMap here because have no other unique reference.
Expand Down Expand Up @@ -3156,7 +3157,7 @@ void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
"__OBJC,__category,regular,no_dead_strip",
CGM.getPointerAlign(), true);
DefinedCategories.push_back(GV);
DefinedCategoryNames.insert(ExtName.str());
DefinedCategoryNames.insert(llvm::CachedHashString(ExtName));
// method definition entries must be clear for next implementation.
MethodDefinitions.clear();
}
Expand Down
3 changes: 2 additions & 1 deletion lib/Frontend/CompilerInstance.cpp
Expand Up @@ -955,7 +955,8 @@ static bool compileModuleImpl(CompilerInstance &ImportingInstance,
std::remove_if(PPOpts.Macros.begin(), PPOpts.Macros.end(),
[&HSOpts](const std::pair<std::string, bool> &def) {
StringRef MacroDef = def.first;
return HSOpts.ModulesIgnoreMacros.count(MacroDef.split('=').first) > 0;
return HSOpts.ModulesIgnoreMacros.count(
llvm::CachedHashString(MacroDef.split('=').first)) > 0;
}),
PPOpts.Macros.end());

Expand Down
6 changes: 4 additions & 2 deletions lib/Frontend/CompilerInvocation.cpp
Expand Up @@ -1432,7 +1432,8 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {

for (const Arg *A : Args.filtered(OPT_fmodules_ignore_macro)) {
StringRef MacroDef = A->getValue();
Opts.ModulesIgnoreMacros.insert(MacroDef.split('=').first);
Opts.ModulesIgnoreMacros.insert(
llvm::CachedHashString(MacroDef.split('=').first));
}

// Add -I..., -F..., and -index-header-map options in order.
Expand Down Expand Up @@ -2519,7 +2520,8 @@ std::string CompilerInvocation::getModuleHash() const {
if (!hsOpts.ModulesIgnoreMacros.empty()) {
// Check whether we're ignoring this macro.
StringRef MacroDef = I->first;
if (hsOpts.ModulesIgnoreMacros.count(MacroDef.split('=').first))
if (hsOpts.ModulesIgnoreMacros.count(
llvm::CachedHashString(MacroDef.split('=').first)))
continue;
}

Expand Down

0 comments on commit a663b0a

Please sign in to comment.