diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/MemorySSA.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/MemorySSA.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/llvm/lib/Transforms/Utils/MemorySSA.cpp b/llvm/lib/Transforms/Utils/MemorySSA.cpp index e873c9e4c04..90c23e1e144 100644 --- a/llvm/lib/Transforms/Utils/MemorySSA.cpp +++ b/llvm/lib/Transforms/Utils/MemorySSA.cpp @@ -799,19 +799,16 @@ void CachingMemorySSAWalker::invalidateInfo(MemoryAccess *MA) { if (!Q.IsCall) Q.StartingLoc = MemoryLocation::get(I); doCacheRemove(MA, Q, Q.StartingLoc); - return; - } - // If it is not a use, the best we can do right now is destroy the cache. - bool IsCall = false; - - if (auto *MUD = dyn_cast<MemoryUseOrDef>(MA)) { - Instruction *I = MUD->getMemoryInst(); - IsCall = bool(ImmutableCallSite(I)); - } - if (IsCall) + } else { + // If it is not a use, the best we can do right now is destroy the cache. CachedUpwardsClobberingCall.clear(); - else CachedUpwardsClobberingAccess.clear(); + } + +#ifdef XDEBUG + // Run this only when expensive checks are enabled. + verifyRemoved(MA); +#endif } void CachingMemorySSAWalker::doCacheRemove(const MemoryAccess *M, @@ -1081,6 +1078,18 @@ CachingMemorySSAWalker::getClobberingMemoryAccess(const Instruction *I) { return Result; } +// Verify that MA doesn't exist in any of the caches. +void CachingMemorySSAWalker::verifyRemoved(MemoryAccess *MA) { +#ifndef NDEBUG + for (auto &P : CachedUpwardsClobberingAccess) + assert(P.first.first != MA && P.second != MA && + "Found removed MemoryAccess in cache."); + for (auto &P : CachedUpwardsClobberingCall) + assert(P.first != MA && P.second != MA && + "Found removed MemoryAccess in cache."); +#endif // !NDEBUG +} + MemoryAccess * DoNothingMemorySSAWalker::getClobberingMemoryAccess(const Instruction *I) { MemoryAccess *MA = MSSA->getMemoryAccess(I); |