diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp index 0774b9880590d..15dada6f854bd 100644 --- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp +++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp @@ -3441,6 +3441,18 @@ template struct ReachabilityQueryInfo { /// and remember if it worked: Reachable Result = Reachable::No; + /// Precomputed hash for this RQI. + unsigned Hash = 0; + + unsigned computeHashValue() const { + assert(Hash == 0 && "Computed hash twice!"); + using InstSetDMI = DenseMapInfo; + using PairDMI = DenseMapInfo>; + return const_cast *>(this)->Hash = + detail::combineHashValue(PairDMI ::getHashValue({From, To}), + InstSetDMI::getHashValue(ExclusionSet)); + } + ReachabilityQueryInfo(const Instruction *From, const ToTy *To) : From(From), To(To) {} @@ -3474,9 +3486,7 @@ template struct DenseMapInfo *> { return &TombstoneKey; } static unsigned getHashValue(const ReachabilityQueryInfo *RQI) { - unsigned H = PairDMI ::getHashValue({RQI->From, RQI->To}); - H += InstSetDMI::getHashValue(RQI->ExclusionSet); - return H; + return RQI->Hash ? RQI->Hash : RQI->computeHashValue(); } static bool isEqual(const ReachabilityQueryInfo *LHS, const ReachabilityQueryInfo *RHS) {