diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h index c44706a597fa6..afd87b492ed61 100644 --- a/llvm/include/llvm/ADT/DenseMap.h +++ b/llvm/include/llvm/ADT/DenseMap.h @@ -348,11 +348,11 @@ class DenseMapBase : public DebugEpochBase { } ValueT &operator[](const KeyT &Key) { - return try_emplace_impl(Key).first->second; + return lookupOrInsertIntoBucket(Key).first->second; } ValueT &operator[](KeyT &&Key) { - return try_emplace_impl(std::move(Key)).first->second; + return lookupOrInsertIntoBucket(std::move(Key)).first->second; } /// isPointerIntoBucketsArray - Return true if the specified pointer points @@ -477,16 +477,24 @@ class DenseMapBase : public DebugEpochBase { private: template - std::pair try_emplace_impl(KeyArgT &&Key, Ts &&...Args) { + std::pair lookupOrInsertIntoBucket(KeyArgT &&Key, + Ts &&...Args) { BucketT *TheBucket = nullptr; if (LookupBucketFor(Key, TheBucket)) - return {makeInsertIterator(TheBucket), false}; // Already in the map. + return {TheBucket, false}; // Already in the map. // Otherwise, insert the new element. TheBucket = findBucketForInsertion(Key, TheBucket); TheBucket->getFirst() = std::forward(Key); ::new (&TheBucket->getSecond()) ValueT(std::forward(Args)...); - return {makeInsertIterator(TheBucket), true}; + return {TheBucket, true}; + } + + template + std::pair try_emplace_impl(KeyArgT &&Key, Ts &&...Args) { + auto [Bucket, Inserted] = lookupOrInsertIntoBucket( + std::forward(Key), std::forward(Args)...); + return {makeInsertIterator(Bucket), Inserted}; } iterator makeIterator(BucketT *P, BucketT *E, DebugEpochBase &Epoch,