IR: Optimize StructType::get to perform one hash lookup instead of two, NFCI

Summary:
This function was performing two hash lookups when a new struct type was requested: first checking if it exists and second to insert it. This patch updates the function to perform a single hash lookup in this case by updating the value in the hash table in-place in case the struct type was not there before.

Similar to r345151.

Reviewers: bkramer

Reviewed By: bkramer

Subscribers: llvm-commits

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

llvm-svn: 345264
This commit is contained in:
Krasimir Georgiev 2018-10-25 13:38:07 +00:00
parent 53e8e145e9
commit 142919bc23
1 changed files with 14 additions and 7 deletions

View File

@ -342,18 +342,25 @@ bool FunctionType::isValidArgumentType(Type *ArgTy) {
StructType *StructType::get(LLVMContext &Context, ArrayRef<Type*> ETypes,
bool isPacked) {
LLVMContextImpl *pImpl = Context.pImpl;
AnonStructTypeKeyInfo::KeyTy Key(ETypes, isPacked);
auto I = pImpl->AnonStructTypes.find_as(Key);
StructType *ST;
const AnonStructTypeKeyInfo::KeyTy Key(ETypes, isPacked);
if (I == pImpl->AnonStructTypes.end()) {
// Value not found. Create a new type!
StructType *ST;
// Since we only want to allocate a fresh struct type in case none is found
// and we don't want to perform two lookups (one for checking if existent and
// one for inserting the newly allocated one), here we instead lookup based on
// Key and update the reference to the struct type in-place to a newly
// allocated one if not found.
auto Insertion = pImpl->AnonStructTypes.insert_as(nullptr, Key);
if (Insertion.second) {
// The struct type was not found. Allocate one and update AnonStructTypes
// in-place.
ST = new (Context.pImpl->TypeAllocator) StructType(Context);
ST->setSubclassData(SCDB_IsLiteral); // Literal struct.
ST->setBody(ETypes, isPacked);
Context.pImpl->AnonStructTypes.insert(ST);
*Insertion.first = ST;
} else {
ST = *I;
// The struct type was found. Just return it.
ST = *Insertion.first;
}
return ST;