diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h index 4df50e03de94b..acc81f069a5aa 100644 --- a/llvm/include/llvm/ADT/DenseMap.h +++ b/llvm/include/llvm/ADT/DenseMap.h @@ -220,8 +220,13 @@ class DenseMapBase : public DebugEpochBase { // Return the entry with the specified key, or \p Default. This variant is // useful, because `lookup` cannot be used with non-default-constructible // values. - ValueT lookup_or(const_arg_type_t Val, - const_arg_type_t Default) const { + ValueT lookup_or(const_arg_type_t Val, const ValueT &Default) const { + if (const BucketT *Bucket = doFind(Val)) + return Bucket->getSecond(); + return Default; + } + + ValueT lookup_or(const_arg_type_t Val, ValueT &&Default) const { if (const BucketT *Bucket = doFind(Val)) return Bucket->getSecond(); return Default; diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 3f9614254ae7a..16e3adcdca356 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -15860,10 +15860,7 @@ const SCEV *ScalarEvolution::LoopGuards::rewrite(const SCEV *Expr) const { const SCEV *visitAddRecExpr(const SCEVAddRecExpr *Expr) { return Expr; } const SCEV *visitUnknown(const SCEVUnknown *Expr) { - auto I = Map.find(Expr); - if (I == Map.end()) - return Expr; - return I->second; + return Map.lookup_or(Expr, Expr); } const SCEV *visitZeroExtendExpr(const SCEVZeroExtendExpr *Expr) { diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp index d002a3c15cf52..cf90b10495a14 100644 --- a/llvm/unittests/ADT/DenseMapTest.cpp +++ b/llvm/unittests/ADT/DenseMapTest.cpp @@ -668,7 +668,9 @@ TEST(DenseMapCustomTest, LookupOr) { EXPECT_EQ(M.lookup_or(0, 4u), 3u); EXPECT_EQ(M.lookup_or(1, 4u), 0u); - EXPECT_EQ(M.lookup_or(2, 4u), 4u); + + NonDefaultConstructible DefaultV = M.lookup_or(2, 4u); + EXPECT_EQ(DefaultV, 4u); } // Key traits that allows lookup with either an unsigned or char* key;