Index: include/llvm/Analysis/MemorySSA.h =================================================================== --- include/llvm/Analysis/MemorySSA.h +++ include/llvm/Analysis/MemorySSA.h @@ -793,6 +793,7 @@ friend class MemorySSAPrinterLegacyPass; friend class MemorySSAUpdater; + void verifyPrevDefInPhis(Function &F) const; void verifyDefUses(Function &F) const; void verifyDomination(Function &F) const; void verifyOrdering(Function &F) const; Index: lib/Analysis/MemorySSA.cpp =================================================================== --- lib/Analysis/MemorySSA.cpp +++ lib/Analysis/MemorySSA.cpp @@ -1850,6 +1850,7 @@ verifyDomination(F); verifyOrdering(F); verifyDominationNumbers(F); + verifyPrevDefInPhis(F); // Previously, the verification used to also verify that the clobberingAccess // cached by MemorySSA is the same as the clobberingAccess found at a later // query to AA. This does not hold true in general due to the current fragility @@ -1862,6 +1863,33 @@ // example, see test4 added in D51960. } +void MemorySSA::verifyPrevDefInPhis(Function &F) const { + for (const BasicBlock &BB : F) { + if (MemoryPhi *Phi = getMemoryAccess(&BB)) { + for (unsigned I = 0, E = Phi->getNumIncomingValues(); I != E; ++I) { + auto *Pred = Phi->getIncomingBlock(I); + auto *IncAcc = Phi->getIncomingValue(I); + while (true) { + if (auto *DefList = getBlockDefs(Pred)) { + auto *LastAcc = &*(--DefList->end()); + assert(LastAcc == IncAcc && "Incorrect incoming access into phi."); + (void)LastAcc; + break; + } + if (auto *DTNode = DT->getNode(Pred)) + if (auto *IDom = DTNode->getIDom()) { + Pred = IDom->getBlock(); + continue; + } + assert(IncAcc == getLiveOnEntryDef() && "Expected LoE inc"); + (void)IncAcc; + break; + } + } + } + } +} + /// Verify that all of the blocks we believe to have valid domination numbers /// actually have valid domination numbers. void MemorySSA::verifyDominationNumbers(const Function &F) const { Index: lib/Analysis/MemorySSAUpdater.cpp =================================================================== --- lib/Analysis/MemorySSAUpdater.cpp +++ lib/Analysis/MemorySSAUpdater.cpp @@ -1031,7 +1031,7 @@ // Now reinsert it into the IR and do whatever fixups needed. if (auto *MD = dyn_cast(What)) - insertDef(MD); + insertDef(MD, true); else insertUse(cast(What));