forked from OSchip/llvm-project
Switch SmallSetVector to use DenseSet when it overflows its inline space.
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 llvm-svn: 284887
This commit is contained in:
parent
104887ed08
commit
5e83dfedb8
|
@ -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"
|
||||
|
@ -144,7 +145,7 @@ public:
|
|||
|
||||
/// \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;
|
||||
|
|
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -843,7 +844,7 @@ protected:
|
|||
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.
|
||||
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -282,7 +282,8 @@ private:
|
|||
/// \brief A SetVector that performs no allocations if smaller than
|
||||
/// a certain size.
|
||||
template <typename T, unsigned N>
|
||||
class SmallSetVector : public SetVector<T, SmallVector<T, N>, SmallSet<T, N> > {
|
||||
class SmallSetVector
|
||||
: public SetVector<T, SmallVector<T, N>, SmallDenseSet<T, N>> {
|
||||
public:
|
||||
SmallSetVector() {}
|
||||
|
||||
|
|
|
@ -97,6 +97,7 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "CodeGenTarget.h"
|
||||
#include "llvm/ADT/CachedHashString.h"
|
||||
#include "llvm/ADT/PointerUnion.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
|
@ -1822,10 +1823,11 @@ void MatchableInfo::buildAliasResultOperands() {
|
|||
}
|
||||
}
|
||||
|
||||
static unsigned getConverterOperandID(const std::string &Name,
|
||||
SmallSetVector<std::string, 16> &Table,
|
||||
bool &IsNew) {
|
||||
IsNew = Table.insert(Name);
|
||||
static unsigned
|
||||
getConverterOperandID(const std::string &Name,
|
||||
SmallSetVector<CachedHashString, 16> &Table,
|
||||
bool &IsNew) {
|
||||
IsNew = Table.insert(CachedHashString(Name));
|
||||
|
||||
unsigned ID = IsNew ? Table.size() - 1 : find(Table, Name) - Table.begin();
|
||||
|
||||
|
@ -1838,8 +1840,8 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
|
|||
std::vector<std::unique_ptr<MatchableInfo>> &Infos,
|
||||
bool HasMnemonicFirst, bool HasOptionalOperands,
|
||||
raw_ostream &OS) {
|
||||
SmallSetVector<std::string, 16> OperandConversionKinds;
|
||||
SmallSetVector<std::string, 16> InstructionConversionKinds;
|
||||
SmallSetVector<CachedHashString, 16> OperandConversionKinds;
|
||||
SmallSetVector<CachedHashString, 16> InstructionConversionKinds;
|
||||
std::vector<std::vector<uint8_t> > ConversionTable;
|
||||
size_t MaxRowLength = 2; // minimum is custom converter plus terminator.
|
||||
|
||||
|
@ -1911,9 +1913,9 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
|
|||
|
||||
// Pre-populate the operand conversion kinds with the standard always
|
||||
// available entries.
|
||||
OperandConversionKinds.insert("CVT_Done");
|
||||
OperandConversionKinds.insert("CVT_Reg");
|
||||
OperandConversionKinds.insert("CVT_Tied");
|
||||
OperandConversionKinds.insert(CachedHashString("CVT_Done"));
|
||||
OperandConversionKinds.insert(CachedHashString("CVT_Reg"));
|
||||
OperandConversionKinds.insert(CachedHashString("CVT_Tied"));
|
||||
enum { CVT_Done, CVT_Reg, CVT_Tied };
|
||||
|
||||
for (auto &II : Infos) {
|
||||
|
@ -1925,13 +1927,13 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
|
|||
II->ConversionFnKind = Signature;
|
||||
|
||||
// Check if we have already generated this signature.
|
||||
if (!InstructionConversionKinds.insert(Signature))
|
||||
if (!InstructionConversionKinds.insert(CachedHashString(Signature)))
|
||||
continue;
|
||||
|
||||
// Remember this converter for the kind enum.
|
||||
unsigned KindID = OperandConversionKinds.size();
|
||||
OperandConversionKinds.insert("CVT_" +
|
||||
getEnumNameForToken(AsmMatchConverter));
|
||||
OperandConversionKinds.insert(
|
||||
CachedHashString("CVT_" + getEnumNameForToken(AsmMatchConverter)));
|
||||
|
||||
// Add the converter row for this instruction.
|
||||
ConversionTable.emplace_back();
|
||||
|
@ -2113,7 +2115,7 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
|
|||
|
||||
// Save the signature. If we already have it, don't add a new row
|
||||
// to the table.
|
||||
if (!InstructionConversionKinds.insert(Signature))
|
||||
if (!InstructionConversionKinds.insert(CachedHashString(Signature)))
|
||||
continue;
|
||||
|
||||
// Add the row to the table.
|
||||
|
@ -2130,14 +2132,14 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
|
|||
|
||||
// Output the operand conversion kind enum.
|
||||
OS << "enum OperatorConversionKind {\n";
|
||||
for (const std::string &Converter : OperandConversionKinds)
|
||||
for (const auto &Converter : OperandConversionKinds)
|
||||
OS << " " << Converter << ",\n";
|
||||
OS << " CVT_NUM_CONVERTERS\n";
|
||||
OS << "};\n\n";
|
||||
|
||||
// Output the instruction conversion kind enum.
|
||||
OS << "enum InstructionConversionKind {\n";
|
||||
for (const std::string &Signature : InstructionConversionKinds)
|
||||
for (const auto &Signature : InstructionConversionKinds)
|
||||
OS << " " << Signature << ",\n";
|
||||
OS << " CVT_NUM_SIGNATURES\n";
|
||||
OS << "};\n\n";
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
#include "CodeGenTarget.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/CachedHashString.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
|
@ -66,8 +67,8 @@ typedef std::vector<uint8_t> DecoderTable;
|
|||
typedef uint32_t DecoderFixup;
|
||||
typedef std::vector<DecoderFixup> FixupList;
|
||||
typedef std::vector<FixupList> FixupScopeList;
|
||||
typedef SmallSetVector<std::string, 16> PredicateSet;
|
||||
typedef SmallSetVector<std::string, 16> DecoderSet;
|
||||
typedef SmallSetVector<CachedHashString, 16> PredicateSet;
|
||||
typedef SmallSetVector<CachedHashString, 16> DecoderSet;
|
||||
struct DecoderTableInfo {
|
||||
DecoderTable Table;
|
||||
FixupScopeList FixupStack;
|
||||
|
@ -1106,7 +1107,7 @@ unsigned FilterChooser::getDecoderIndex(DecoderSet &Decoders,
|
|||
// overkill for now, though.
|
||||
|
||||
// Make sure the predicate is in the table.
|
||||
Decoders.insert(StringRef(Decoder));
|
||||
Decoders.insert(CachedHashString(Decoder));
|
||||
// Now figure out the index for when we write out the table.
|
||||
DecoderSet::const_iterator P = find(Decoders, Decoder.str());
|
||||
return (unsigned)(P - Decoders.begin());
|
||||
|
@ -1179,9 +1180,9 @@ unsigned FilterChooser::getPredicateIndex(DecoderTableInfo &TableInfo,
|
|||
// overkill for now, though.
|
||||
|
||||
// Make sure the predicate is in the table.
|
||||
TableInfo.Predicates.insert(Predicate.str());
|
||||
TableInfo.Predicates.insert(CachedHashString(Predicate));
|
||||
// Now figure out the index for when we write out the table.
|
||||
PredicateSet::const_iterator P = find(TableInfo.Predicates, Predicate.str());
|
||||
PredicateSet::const_iterator P = find(TableInfo.Predicates, Predicate);
|
||||
return (unsigned)(P - TableInfo.Predicates.begin());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue