Index: include/llvm/Analysis/MemorySSAUpdater.h =================================================================== --- include/llvm/Analysis/MemorySSAUpdater.h +++ include/llvm/Analysis/MemorySSAUpdater.h @@ -132,7 +132,11 @@ void wireOldPredecessorsToNewImmediatePredecessor(BasicBlock *Old, BasicBlock *New, ArrayRef Preds); - + /// `ToReplace` used to be a predecessor of BB. `ReplaceWith` is the new + /// predecessor. Update Phi in BB to replace incoming block `ToReplace` with + /// `ReplaceWith`. + void replacePhiIncomingBlock(BasicBlock *BB, BasicBlock *ToReplace, + BasicBlock *ReplaceWith); // The below are utility functions. Other than creation of accesses to pass // to insertDef, and removeAccess to remove accesses, you should generally // not attempt to update memoryssa yourself. It is very non-trivial to get Index: lib/Analysis/MemorySSAUpdater.cpp =================================================================== --- lib/Analysis/MemorySSAUpdater.cpp +++ lib/Analysis/MemorySSAUpdater.cpp @@ -392,6 +392,16 @@ } } +void MemorySSAUpdater::replacePhiIncomingBlock(BasicBlock *BB, + BasicBlock *ToReplace, + BasicBlock *ReplaceWith) { + if (MemoryPhi *MPhi = MSSA->getMemoryAccess(BB)) { + unsigned I = MPhi->getBasicBlockIndex(ToReplace); + assert((I >= 0) && "MemoryPhi position out of bounds"); + MPhi->setIncomingBlock(I, ReplaceWith); + } +} + // Move What before Where in the MemorySSA IR. template void MemorySSAUpdater::moveTo(MemoryUseOrDef *What, BasicBlock *BB,