Index: llvm/include/llvm/Analysis/AssumptionCache.h =================================================================== --- llvm/include/llvm/Analysis/AssumptionCache.h +++ llvm/include/llvm/Analysis/AssumptionCache.h @@ -73,8 +73,8 @@ /// Get the vector of assumptions which affect a value from the cache. SmallVector &getOrInsertAffectedValues(Value *V); - /// Copy affected values in the cache for OV to be affected values for NV. - void copyAffectedValuesInCache(Value *OV, Value *NV); + /// Move affected values in the cache for OV to be affected values for NV. + void transferAffectedValuesInCache(Value *OV, Value *NV); /// Flag tracking whether we have scanned the function yet. /// Index: llvm/lib/Analysis/AssumptionCache.cpp =================================================================== --- llvm/lib/Analysis/AssumptionCache.cpp +++ llvm/lib/Analysis/AssumptionCache.cpp @@ -140,7 +140,7 @@ // 'this' now dangles! } -void AssumptionCache::copyAffectedValuesInCache(Value *OV, Value *NV) { +void AssumptionCache::transferAffectedValuesInCache(Value *OV, Value *NV) { auto &NAVV = getOrInsertAffectedValues(NV); auto AVI = AffectedValues.find(OV); if (AVI == AffectedValues.end()) @@ -149,6 +149,7 @@ for (auto &A : AVI->second) if (std::find(NAVV.begin(), NAVV.end(), A) == NAVV.end()) NAVV.push_back(A); + AffectedValues.erase(OV); } void AssumptionCache::AffectedValueCallbackVH::allUsesReplacedWith(Value *NV) { @@ -157,7 +158,7 @@ // Any assumptions that affected this value now affect the new value. - AC->copyAffectedValuesInCache(getValPtr(), NV); + AC->transferAffectedValuesInCache(getValPtr(), NV); // 'this' now might dangle! If the AffectedValues map was resized to add an // entry for NV then this object might have been destroyed in favor of some // copy in the grown map.