1554dcd8cSDaniel Berlin //===-- MemorySSAUpdater.cpp - Memory SSA Updater--------------------===//
2554dcd8cSDaniel Berlin //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6554dcd8cSDaniel Berlin //
7554dcd8cSDaniel Berlin //===----------------------------------------------------------------===//
8554dcd8cSDaniel Berlin //
9554dcd8cSDaniel Berlin // This file implements the MemorySSAUpdater class.
10554dcd8cSDaniel Berlin //
11554dcd8cSDaniel Berlin //===----------------------------------------------------------------===//
12554dcd8cSDaniel Berlin #include "llvm/Analysis/MemorySSAUpdater.h"
13554dcd8cSDaniel Berlin #include "llvm/ADT/STLExtras.h"
147980099aSAlina Sbirlea #include "llvm/ADT/SetVector.h"
15554dcd8cSDaniel Berlin #include "llvm/ADT/SmallPtrSet.h"
167980099aSAlina Sbirlea #include "llvm/Analysis/IteratedDominanceFrontier.h"
1771c3a551Sserge-sans-paille #include "llvm/Analysis/LoopIterator.h"
186bda14b3SChandler Carruth #include "llvm/Analysis/MemorySSA.h"
1944d86982SSimon Pilgrim #include "llvm/IR/BasicBlock.h"
20554dcd8cSDaniel Berlin #include "llvm/IR/Dominators.h"
21554dcd8cSDaniel Berlin #include "llvm/Support/Debug.h"
22554dcd8cSDaniel Berlin #include <algorithm>
23554dcd8cSDaniel Berlin 
24554dcd8cSDaniel Berlin #define DEBUG_TYPE "memoryssa"
25554dcd8cSDaniel Berlin using namespace llvm;
2656169ed7SGeorge Burgess IV 
27554dcd8cSDaniel Berlin // This is the marker algorithm from "Simple and Efficient Construction of
28554dcd8cSDaniel Berlin // Static Single Assignment Form"
29554dcd8cSDaniel Berlin // The simple, non-marker algorithm places phi nodes at any join
30554dcd8cSDaniel Berlin // Here, we place markers, and only place phi nodes if they end up necessary.
31554dcd8cSDaniel Berlin // They are only necessary if they break a cycle (IE we recursively visit
32554dcd8cSDaniel Berlin // ourselves again), or we discover, while getting the value of the operands,
33554dcd8cSDaniel Berlin // that there are two or more definitions needing to be merged.
34554dcd8cSDaniel Berlin // This still will leave non-minimal form in the case of irreducible control
35554dcd8cSDaniel Berlin // flow, where phi nodes may be in cycles with themselves, but unnecessary.
getPreviousDefRecursive(BasicBlock * BB,DenseMap<BasicBlock *,TrackingVH<MemoryAccess>> & CachedPreviousDef)3688e2bac9SEli Friedman MemoryAccess *MemorySSAUpdater::getPreviousDefRecursive(
3788e2bac9SEli Friedman     BasicBlock *BB,
3888e2bac9SEli Friedman     DenseMap<BasicBlock *, TrackingVH<MemoryAccess>> &CachedPreviousDef) {
3988e2bac9SEli Friedman   // First, do a cache lookup. Without this cache, certain CFG structures
4088e2bac9SEli Friedman   // (like a series of if statements) take exponential time to visit.
4188e2bac9SEli Friedman   auto Cached = CachedPreviousDef.find(BB);
426442b569SAlina Sbirlea   if (Cached != CachedPreviousDef.end())
4388e2bac9SEli Friedman     return Cached->second;
4445f263ddSGeorge Burgess IV 
4567f0c5c0SAlina Sbirlea   // If this method is called from an unreachable block, return LoE.
4667f0c5c0SAlina Sbirlea   if (!MSSA->DT->isReachableFromEntry(BB))
4767f0c5c0SAlina Sbirlea     return MSSA->getLiveOnEntryDef();
4867f0c5c0SAlina Sbirlea 
496442b569SAlina Sbirlea   if (BasicBlock *Pred = BB->getUniquePredecessor()) {
506442b569SAlina Sbirlea     VisitedBlocks.insert(BB);
51554dcd8cSDaniel Berlin     // Single predecessor case, just recurse, we can only have one definition.
5288e2bac9SEli Friedman     MemoryAccess *Result = getPreviousDefFromEnd(Pred, CachedPreviousDef);
5388e2bac9SEli Friedman     CachedPreviousDef.insert({BB, Result});
5488e2bac9SEli Friedman     return Result;
5545f263ddSGeorge Burgess IV   }
5645f263ddSGeorge Burgess IV 
5745f263ddSGeorge Burgess IV   if (VisitedBlocks.count(BB)) {
58554dcd8cSDaniel Berlin     // We hit our node again, meaning we had a cycle, we must insert a phi
59554dcd8cSDaniel Berlin     // node to break it so we have an operand. The only case this will
60554dcd8cSDaniel Berlin     // insert useless phis is if we have irreducible control flow.
6188e2bac9SEli Friedman     MemoryAccess *Result = MSSA->createMemoryPhi(BB);
6288e2bac9SEli Friedman     CachedPreviousDef.insert({BB, Result});
6388e2bac9SEli Friedman     return Result;
6445f263ddSGeorge Burgess IV   }
6545f263ddSGeorge Burgess IV 
6645f263ddSGeorge Burgess IV   if (VisitedBlocks.insert(BB).second) {
67554dcd8cSDaniel Berlin     // Mark us visited so we can detect a cycle
68bf6009c2SAlexandros Lamprineas     SmallVector<TrackingVH<MemoryAccess>, 8> PhiOps;
69554dcd8cSDaniel Berlin 
70554dcd8cSDaniel Berlin     // Recurse to get the values in our predecessors for placement of a
71554dcd8cSDaniel Berlin     // potential phi node. This will insert phi nodes if we cycle in order to
72554dcd8cSDaniel Berlin     // break the cycle and have an operand.
736720ed85SAlina Sbirlea     bool UniqueIncomingAccess = true;
746720ed85SAlina Sbirlea     MemoryAccess *SingleAccess = nullptr;
756720ed85SAlina Sbirlea     for (auto *Pred : predecessors(BB)) {
766720ed85SAlina Sbirlea       if (MSSA->DT->isReachableFromEntry(Pred)) {
776720ed85SAlina Sbirlea         auto *IncomingAccess = getPreviousDefFromEnd(Pred, CachedPreviousDef);
786720ed85SAlina Sbirlea         if (!SingleAccess)
796720ed85SAlina Sbirlea           SingleAccess = IncomingAccess;
806720ed85SAlina Sbirlea         else if (IncomingAccess != SingleAccess)
816720ed85SAlina Sbirlea           UniqueIncomingAccess = false;
826720ed85SAlina Sbirlea         PhiOps.push_back(IncomingAccess);
836720ed85SAlina Sbirlea       } else
840363c3b8SAlina Sbirlea         PhiOps.push_back(MSSA->getLiveOnEntryDef());
856720ed85SAlina Sbirlea     }
86554dcd8cSDaniel Berlin 
87554dcd8cSDaniel Berlin     // Now try to simplify the ops to avoid placing a phi.
88554dcd8cSDaniel Berlin     // This may return null if we never created a phi yet, that's okay
89554dcd8cSDaniel Berlin     MemoryPhi *Phi = dyn_cast_or_null<MemoryPhi>(MSSA->getMemoryAccess(BB));
90554dcd8cSDaniel Berlin 
91554dcd8cSDaniel Berlin     // See if we can avoid the phi by simplifying it.
92554dcd8cSDaniel Berlin     auto *Result = tryRemoveTrivialPhi(Phi, PhiOps);
93554dcd8cSDaniel Berlin     // If we couldn't simplify, we may have to create a phi
946442b569SAlina Sbirlea     if (Result == Phi && UniqueIncomingAccess && SingleAccess) {
956442b569SAlina Sbirlea       // A concrete Phi only exists if we created an empty one to break a cycle.
966442b569SAlina Sbirlea       if (Phi) {
976442b569SAlina Sbirlea         assert(Phi->operands().empty() && "Expected empty Phi");
986442b569SAlina Sbirlea         Phi->replaceAllUsesWith(SingleAccess);
996442b569SAlina Sbirlea         removeMemoryAccess(Phi);
1006442b569SAlina Sbirlea       }
1016720ed85SAlina Sbirlea       Result = SingleAccess;
1026442b569SAlina Sbirlea     } else if (Result == Phi && !(UniqueIncomingAccess && SingleAccess)) {
103554dcd8cSDaniel Berlin       if (!Phi)
104554dcd8cSDaniel Berlin         Phi = MSSA->createMemoryPhi(BB);
105554dcd8cSDaniel Berlin 
106bf6009c2SAlexandros Lamprineas       // See if the existing phi operands match what we need.
107bf6009c2SAlexandros Lamprineas       // Unlike normal SSA, we only allow one phi node per block, so we can't just
108bf6009c2SAlexandros Lamprineas       // create a new one.
109bf6009c2SAlexandros Lamprineas       if (Phi->getNumOperands() != 0) {
110bf6009c2SAlexandros Lamprineas         // FIXME: Figure out whether this is dead code and if so remove it.
111bf6009c2SAlexandros Lamprineas         if (!std::equal(Phi->op_begin(), Phi->op_end(), PhiOps.begin())) {
112554dcd8cSDaniel Berlin           // These will have been filled in by the recursive read we did above.
11375709329SFangrui Song           llvm::copy(PhiOps, Phi->op_begin());
114554dcd8cSDaniel Berlin           std::copy(pred_begin(BB), pred_end(BB), Phi->block_begin());
115bf6009c2SAlexandros Lamprineas         }
116554dcd8cSDaniel Berlin       } else {
117554dcd8cSDaniel Berlin         unsigned i = 0;
118554dcd8cSDaniel Berlin         for (auto *Pred : predecessors(BB))
119bf6009c2SAlexandros Lamprineas           Phi->addIncoming(&*PhiOps[i++], Pred);
12097f34e88SDaniel Berlin         InsertedPHIs.push_back(Phi);
121554dcd8cSDaniel Berlin       }
122554dcd8cSDaniel Berlin       Result = Phi;
123554dcd8cSDaniel Berlin     }
12497f34e88SDaniel Berlin 
125554dcd8cSDaniel Berlin     // Set ourselves up for the next variable by resetting visited state.
126554dcd8cSDaniel Berlin     VisitedBlocks.erase(BB);
12788e2bac9SEli Friedman     CachedPreviousDef.insert({BB, Result});
128554dcd8cSDaniel Berlin     return Result;
129554dcd8cSDaniel Berlin   }
130554dcd8cSDaniel Berlin   llvm_unreachable("Should have hit one of the three cases above");
131554dcd8cSDaniel Berlin }
132554dcd8cSDaniel Berlin 
133554dcd8cSDaniel Berlin // This starts at the memory access, and goes backwards in the block to find the
134554dcd8cSDaniel Berlin // previous definition. If a definition is not found the block of the access,
135554dcd8cSDaniel Berlin // it continues globally, creating phi nodes to ensure we have a single
136554dcd8cSDaniel Berlin // definition.
getPreviousDef(MemoryAccess * MA)137554dcd8cSDaniel Berlin MemoryAccess *MemorySSAUpdater::getPreviousDef(MemoryAccess *MA) {
13888e2bac9SEli Friedman   if (auto *LocalResult = getPreviousDefInBlock(MA))
13988e2bac9SEli Friedman     return LocalResult;
14088e2bac9SEli Friedman   DenseMap<BasicBlock *, TrackingVH<MemoryAccess>> CachedPreviousDef;
14188e2bac9SEli Friedman   return getPreviousDefRecursive(MA->getBlock(), CachedPreviousDef);
142554dcd8cSDaniel Berlin }
143554dcd8cSDaniel Berlin 
144554dcd8cSDaniel Berlin // This starts at the memory access, and goes backwards in the block to the find
145554dcd8cSDaniel Berlin // the previous definition. If the definition is not found in the block of the
146554dcd8cSDaniel Berlin // access, it returns nullptr.
getPreviousDefInBlock(MemoryAccess * MA)147554dcd8cSDaniel Berlin MemoryAccess *MemorySSAUpdater::getPreviousDefInBlock(MemoryAccess *MA) {
148554dcd8cSDaniel Berlin   auto *Defs = MSSA->getWritableBlockDefs(MA->getBlock());
149554dcd8cSDaniel Berlin 
150554dcd8cSDaniel Berlin   // It's possible there are no defs, or we got handed the first def to start.
151554dcd8cSDaniel Berlin   if (Defs) {
152554dcd8cSDaniel Berlin     // If this is a def, we can just use the def iterators.
153554dcd8cSDaniel Berlin     if (!isa<MemoryUse>(MA)) {
154554dcd8cSDaniel Berlin       auto Iter = MA->getReverseDefsIterator();
155554dcd8cSDaniel Berlin       ++Iter;
156554dcd8cSDaniel Berlin       if (Iter != Defs->rend())
157554dcd8cSDaniel Berlin         return &*Iter;
158554dcd8cSDaniel Berlin     } else {
159554dcd8cSDaniel Berlin       // Otherwise, have to walk the all access iterator.
16033e58723SAlina Sbirlea       auto End = MSSA->getWritableBlockAccesses(MA->getBlock())->rend();
16133e58723SAlina Sbirlea       for (auto &U : make_range(++MA->getReverseIterator(), End))
16233e58723SAlina Sbirlea         if (!isa<MemoryUse>(U))
16333e58723SAlina Sbirlea           return cast<MemoryAccess>(&U);
16433e58723SAlina Sbirlea       // Note that if MA comes before Defs->begin(), we won't hit a def.
16533e58723SAlina Sbirlea       return nullptr;
166554dcd8cSDaniel Berlin     }
167554dcd8cSDaniel Berlin   }
168554dcd8cSDaniel Berlin   return nullptr;
169554dcd8cSDaniel Berlin }
170554dcd8cSDaniel Berlin 
171554dcd8cSDaniel Berlin // This starts at the end of block
getPreviousDefFromEnd(BasicBlock * BB,DenseMap<BasicBlock *,TrackingVH<MemoryAccess>> & CachedPreviousDef)17288e2bac9SEli Friedman MemoryAccess *MemorySSAUpdater::getPreviousDefFromEnd(
17388e2bac9SEli Friedman     BasicBlock *BB,
17488e2bac9SEli Friedman     DenseMap<BasicBlock *, TrackingVH<MemoryAccess>> &CachedPreviousDef) {
175554dcd8cSDaniel Berlin   auto *Defs = MSSA->getWritableBlockDefs(BB);
176554dcd8cSDaniel Berlin 
177f9f073a8SAlina Sbirlea   if (Defs) {
178f9f073a8SAlina Sbirlea     CachedPreviousDef.insert({BB, &*Defs->rbegin()});
179554dcd8cSDaniel Berlin     return &*Defs->rbegin();
180f9f073a8SAlina Sbirlea   }
181554dcd8cSDaniel Berlin 
18288e2bac9SEli Friedman   return getPreviousDefRecursive(BB, CachedPreviousDef);
183554dcd8cSDaniel Berlin }
184554dcd8cSDaniel Berlin // Recurse over a set of phi uses to eliminate the trivial ones
recursePhi(MemoryAccess * Phi)185554dcd8cSDaniel Berlin MemoryAccess *MemorySSAUpdater::recursePhi(MemoryAccess *Phi) {
186554dcd8cSDaniel Berlin   if (!Phi)
187554dcd8cSDaniel Berlin     return nullptr;
188554dcd8cSDaniel Berlin   TrackingVH<MemoryAccess> Res(Phi);
189554dcd8cSDaniel Berlin   SmallVector<TrackingVH<Value>, 8> Uses;
190554dcd8cSDaniel Berlin   std::copy(Phi->user_begin(), Phi->user_end(), std::back_inserter(Uses));
1912863721fSAlina Sbirlea   for (auto &U : Uses)
1922863721fSAlina Sbirlea     if (MemoryPhi *UsePhi = dyn_cast<MemoryPhi>(&*U))
1932863721fSAlina Sbirlea       tryRemoveTrivialPhi(UsePhi);
194554dcd8cSDaniel Berlin   return Res;
195554dcd8cSDaniel Berlin }
196554dcd8cSDaniel Berlin 
197554dcd8cSDaniel Berlin // Eliminate trivial phis
198554dcd8cSDaniel Berlin // Phis are trivial if they are defined either by themselves, or all the same
199554dcd8cSDaniel Berlin // argument.
200554dcd8cSDaniel Berlin // IE phi(a, a) or b = phi(a, b) or c = phi(a, a, c)
201554dcd8cSDaniel Berlin // We recursively try to remove them.
tryRemoveTrivialPhi(MemoryPhi * Phi)2022863721fSAlina Sbirlea MemoryAccess *MemorySSAUpdater::tryRemoveTrivialPhi(MemoryPhi *Phi) {
2032863721fSAlina Sbirlea   assert(Phi && "Can only remove concrete Phi.");
2042863721fSAlina Sbirlea   auto OperRange = Phi->operands();
2052863721fSAlina Sbirlea   return tryRemoveTrivialPhi(Phi, OperRange);
2062863721fSAlina Sbirlea }
207554dcd8cSDaniel Berlin template <class RangeType>
tryRemoveTrivialPhi(MemoryPhi * Phi,RangeType & Operands)208554dcd8cSDaniel Berlin MemoryAccess *MemorySSAUpdater::tryRemoveTrivialPhi(MemoryPhi *Phi,
209554dcd8cSDaniel Berlin                                                     RangeType &Operands) {
21043af17beSZhaoshi Zheng   // Bail out on non-opt Phis.
21143af17beSZhaoshi Zheng   if (NonOptPhis.count(Phi))
21243af17beSZhaoshi Zheng     return Phi;
21343af17beSZhaoshi Zheng 
214554dcd8cSDaniel Berlin   // Detect equal or self arguments
215554dcd8cSDaniel Berlin   MemoryAccess *Same = nullptr;
216554dcd8cSDaniel Berlin   for (auto &Op : Operands) {
217554dcd8cSDaniel Berlin     // If the same or self, good so far
218554dcd8cSDaniel Berlin     if (Op == Phi || Op == Same)
219554dcd8cSDaniel Berlin       continue;
220554dcd8cSDaniel Berlin     // not the same, return the phi since it's not eliminatable by us
221554dcd8cSDaniel Berlin     if (Same)
222554dcd8cSDaniel Berlin       return Phi;
223bf6009c2SAlexandros Lamprineas     Same = cast<MemoryAccess>(&*Op);
224554dcd8cSDaniel Berlin   }
225554dcd8cSDaniel Berlin   // Never found a non-self reference, the phi is undef
226554dcd8cSDaniel Berlin   if (Same == nullptr)
227554dcd8cSDaniel Berlin     return MSSA->getLiveOnEntryDef();
228554dcd8cSDaniel Berlin   if (Phi) {
229554dcd8cSDaniel Berlin     Phi->replaceAllUsesWith(Same);
230554dcd8cSDaniel Berlin     removeMemoryAccess(Phi);
231554dcd8cSDaniel Berlin   }
232554dcd8cSDaniel Berlin 
233554dcd8cSDaniel Berlin   // We should only end up recursing in case we replaced something, in which
234554dcd8cSDaniel Berlin   // case, we may have made other Phis trivial.
235554dcd8cSDaniel Berlin   return recursePhi(Same);
236554dcd8cSDaniel Berlin }
237554dcd8cSDaniel Berlin 
insertUse(MemoryUse * MU,bool RenameUses)2381a3fdaf6SAlina Sbirlea void MemorySSAUpdater::insertUse(MemoryUse *MU, bool RenameUses) {
239e7afbea8SWhitney Tsang   VisitedBlocks.clear();
240554dcd8cSDaniel Berlin   InsertedPHIs.clear();
241554dcd8cSDaniel Berlin   MU->setDefiningAccess(getPreviousDef(MU));
2426442b569SAlina Sbirlea 
2431a3fdaf6SAlina Sbirlea   // In cases without unreachable blocks, because uses do not create new
2441a3fdaf6SAlina Sbirlea   // may-defs, there are only two cases:
245554dcd8cSDaniel Berlin   // 1. There was a def already below us, and therefore, we should not have
246554dcd8cSDaniel Berlin   // created a phi node because it was already needed for the def.
247554dcd8cSDaniel Berlin   //
248554dcd8cSDaniel Berlin   // 2. There is no def below us, and therefore, there is no extra renaming work
249554dcd8cSDaniel Berlin   // to do.
2501a3fdaf6SAlina Sbirlea 
2511a3fdaf6SAlina Sbirlea   // In cases with unreachable blocks, where the unnecessary Phis were
2521a3fdaf6SAlina Sbirlea   // optimized out, adding the Use may re-insert those Phis. Hence, when
2531a3fdaf6SAlina Sbirlea   // inserting Uses outside of the MSSA creation process, and new Phis were
2541a3fdaf6SAlina Sbirlea   // added, rename all uses if we are asked.
2551a3fdaf6SAlina Sbirlea 
2561a3fdaf6SAlina Sbirlea   if (!RenameUses && !InsertedPHIs.empty()) {
2571a3fdaf6SAlina Sbirlea     auto *Defs = MSSA->getBlockDefs(MU->getBlock());
2581a3fdaf6SAlina Sbirlea     (void)Defs;
2591a3fdaf6SAlina Sbirlea     assert((!Defs || (++Defs->begin() == Defs->end())) &&
2601a3fdaf6SAlina Sbirlea            "Block may have only a Phi or no defs");
2611a3fdaf6SAlina Sbirlea   }
2621a3fdaf6SAlina Sbirlea 
2631a3fdaf6SAlina Sbirlea   if (RenameUses && InsertedPHIs.size()) {
2641a3fdaf6SAlina Sbirlea     SmallPtrSet<BasicBlock *, 16> Visited;
2651a3fdaf6SAlina Sbirlea     BasicBlock *StartBlock = MU->getBlock();
2661a3fdaf6SAlina Sbirlea 
2671a3fdaf6SAlina Sbirlea     if (auto *Defs = MSSA->getWritableBlockDefs(StartBlock)) {
2681a3fdaf6SAlina Sbirlea       MemoryAccess *FirstDef = &*Defs->begin();
2691a3fdaf6SAlina Sbirlea       // Convert to incoming value if it's a memorydef. A phi *is* already an
2701a3fdaf6SAlina Sbirlea       // incoming value.
2711a3fdaf6SAlina Sbirlea       if (auto *MD = dyn_cast<MemoryDef>(FirstDef))
2721a3fdaf6SAlina Sbirlea         FirstDef = MD->getDefiningAccess();
2731a3fdaf6SAlina Sbirlea 
2741a3fdaf6SAlina Sbirlea       MSSA->renamePass(MU->getBlock(), FirstDef, Visited);
275228ffac6SAlina Sbirlea     }
2761a3fdaf6SAlina Sbirlea     // We just inserted a phi into this block, so the incoming value will
2771a3fdaf6SAlina Sbirlea     // become the phi anyway, so it does not matter what we pass.
2781a3fdaf6SAlina Sbirlea     for (auto &MP : InsertedPHIs)
2791a3fdaf6SAlina Sbirlea       if (MemoryPhi *Phi = cast_or_null<MemoryPhi>(MP))
2801a3fdaf6SAlina Sbirlea         MSSA->renamePass(Phi->getBlock(), nullptr, Visited);
2811a3fdaf6SAlina Sbirlea   }
2821a3fdaf6SAlina Sbirlea }
283554dcd8cSDaniel Berlin 
284554dcd8cSDaniel Berlin // Set every incoming edge {BB, MP->getBlock()} of MemoryPhi MP to NewDef.
setMemoryPhiValueForBlock(MemoryPhi * MP,const BasicBlock * BB,MemoryAccess * NewDef)28556169ed7SGeorge Burgess IV static void setMemoryPhiValueForBlock(MemoryPhi *MP, const BasicBlock *BB,
286554dcd8cSDaniel Berlin                                       MemoryAccess *NewDef) {
287554dcd8cSDaniel Berlin   // Replace any operand with us an incoming block with the new defining
288554dcd8cSDaniel Berlin   // access.
289554dcd8cSDaniel Berlin   int i = MP->getBasicBlockIndex(BB);
290554dcd8cSDaniel Berlin   assert(i != -1 && "Should have found the basic block in the phi");
291554dcd8cSDaniel Berlin   // We can't just compare i against getNumOperands since one is signed and the
292554dcd8cSDaniel Berlin   // other not. So use it to index into the block iterator.
2937ca14f60SKazu Hirata   for (const BasicBlock *BlockBB : llvm::drop_begin(MP->blocks(), i)) {
2947ca14f60SKazu Hirata     if (BlockBB != BB)
295554dcd8cSDaniel Berlin       break;
296554dcd8cSDaniel Berlin     MP->setIncomingValue(i, NewDef);
297554dcd8cSDaniel Berlin     ++i;
298554dcd8cSDaniel Berlin   }
299554dcd8cSDaniel Berlin }
300554dcd8cSDaniel Berlin 
301554dcd8cSDaniel Berlin // A brief description of the algorithm:
302554dcd8cSDaniel Berlin // First, we compute what should define the new def, using the SSA
303554dcd8cSDaniel Berlin // construction algorithm.
304554dcd8cSDaniel Berlin // Then, we update the defs below us (and any new phi nodes) in the graph to
305554dcd8cSDaniel Berlin // point to the correct new defs, to ensure we only have one variable, and no
306554dcd8cSDaniel Berlin // disconnected stores.
insertDef(MemoryDef * MD,bool RenameUses)307554dcd8cSDaniel Berlin void MemorySSAUpdater::insertDef(MemoryDef *MD, bool RenameUses) {
3084fbde1efSArtur Pilipenko   // Don't bother updating dead code.
3094fbde1efSArtur Pilipenko   if (!MSSA->DT->isReachableFromEntry(MD->getBlock())) {
3104fbde1efSArtur Pilipenko     MD->setDefiningAccess(MSSA->getLiveOnEntryDef());
3114fbde1efSArtur Pilipenko     return;
3124fbde1efSArtur Pilipenko   }
3134fbde1efSArtur Pilipenko 
314e7afbea8SWhitney Tsang   VisitedBlocks.clear();
315554dcd8cSDaniel Berlin   InsertedPHIs.clear();
316554dcd8cSDaniel Berlin 
317554dcd8cSDaniel Berlin   // See if we had a local def, and if not, go hunting.
31888e2bac9SEli Friedman   MemoryAccess *DefBefore = getPreviousDef(MD);
319ae40dfc1SAlina Sbirlea   bool DefBeforeSameBlock = false;
320ae40dfc1SAlina Sbirlea   if (DefBefore->getBlock() == MD->getBlock() &&
321ae40dfc1SAlina Sbirlea       !(isa<MemoryPhi>(DefBefore) &&
32260434989SKazu Hirata         llvm::is_contained(InsertedPHIs, DefBefore)))
323ae40dfc1SAlina Sbirlea     DefBeforeSameBlock = true;
324554dcd8cSDaniel Berlin 
325554dcd8cSDaniel Berlin   // There is a def before us, which means we can replace any store/phi uses
326554dcd8cSDaniel Berlin   // of that thing with us, since we are in the way of whatever was there
327554dcd8cSDaniel Berlin   // before.
328554dcd8cSDaniel Berlin   // We now define that def's memorydefs and memoryphis
329554dcd8cSDaniel Berlin   if (DefBeforeSameBlock) {
330081e990dSRoman Lebedev     DefBefore->replaceUsesWithIf(MD, [MD](Use &U) {
33196762b37SAlexandros Lamprineas       // Leave the MemoryUses alone.
33296762b37SAlexandros Lamprineas       // Also make sure we skip ourselves to avoid self references.
333081e990dSRoman Lebedev       User *Usr = U.getUser();
334081e990dSRoman Lebedev       return !isa<MemoryUse>(Usr) && Usr != MD;
335fcfa7c5fSAlina Sbirlea       // Defs are automatically unoptimized when the user is set to MD below,
336fcfa7c5fSAlina Sbirlea       // because the isOptimized() call will fail to find the same ID.
337081e990dSRoman Lebedev     });
338554dcd8cSDaniel Berlin   }
339554dcd8cSDaniel Berlin 
340554dcd8cSDaniel Berlin   // and that def is now our defining access.
341554dcd8cSDaniel Berlin   MD->setDefiningAccess(DefBefore);
342554dcd8cSDaniel Berlin 
343f854ce84SAlexandros Lamprineas   SmallVector<WeakVH, 8> FixupList(InsertedPHIs.begin(), InsertedPHIs.end());
3442c5e6646SAlina Sbirlea 
345344a3d0bSAlina Sbirlea   SmallSet<WeakVH, 8> ExistingPhis;
346344a3d0bSAlina Sbirlea 
3476720ed85SAlina Sbirlea   // Remember the index where we may insert new phis.
3486720ed85SAlina Sbirlea   unsigned NewPhiIndex = InsertedPHIs.size();
349554dcd8cSDaniel Berlin   if (!DefBeforeSameBlock) {
350554dcd8cSDaniel Berlin     // If there was a local def before us, we must have the same effect it
351554dcd8cSDaniel Berlin     // did. Because every may-def is the same, any phis/etc we would create, it
352554dcd8cSDaniel Berlin     // would also have created.  If there was no local def before us, we
353554dcd8cSDaniel Berlin     // performed a global update, and have to search all successors and make
354554dcd8cSDaniel Berlin     // sure we update the first def in each of them (following all paths until
355554dcd8cSDaniel Berlin     // we hit the first def along each path). This may also insert phi nodes.
356554dcd8cSDaniel Berlin     // TODO: There are other cases we can skip this work, such as when we have a
357554dcd8cSDaniel Berlin     // single successor, and only used a straight line of single pred blocks
358554dcd8cSDaniel Berlin     // backwards to find the def.  To make that work, we'd have to track whether
359554dcd8cSDaniel Berlin     // getDefRecursive only ever used the single predecessor case.  These types
360554dcd8cSDaniel Berlin     // of paths also only exist in between CFG simplifications.
361fcfa7c5fSAlina Sbirlea 
362fcfa7c5fSAlina Sbirlea     // If this is the first def in the block and this insert is in an arbitrary
363fcfa7c5fSAlina Sbirlea     // place, compute IDF and place phis.
36424ae5ce5SAlina Sbirlea     SmallPtrSet<BasicBlock *, 2> DefiningBlocks;
36524ae5ce5SAlina Sbirlea 
366f6bff8d1SAlina Sbirlea     // If this is the last Def in the block, we may need additional Phis.
367f6bff8d1SAlina Sbirlea     // Compute IDF in all cases, as renaming needs to be done even when MD is
368f6bff8d1SAlina Sbirlea     // not the last access, because it can introduce a new access past which a
369f6bff8d1SAlina Sbirlea     // previous access was optimized; that access needs to be reoptimized.
3702c5e6646SAlina Sbirlea     DefiningBlocks.insert(MD->getBlock());
3714e9082efSAlina Sbirlea     for (const auto &VH : InsertedPHIs)
3724e9082efSAlina Sbirlea       if (const auto *RealPHI = cast_or_null<MemoryPhi>(VH))
3734e9082efSAlina Sbirlea         DefiningBlocks.insert(RealPHI->getBlock());
3746720ed85SAlina Sbirlea     ForwardIDFCalculator IDFs(*MSSA->DT);
3756720ed85SAlina Sbirlea     SmallVector<BasicBlock *, 32> IDFBlocks;
376fcfa7c5fSAlina Sbirlea     IDFs.setDefiningBlocks(DefiningBlocks);
377fcfa7c5fSAlina Sbirlea     IDFs.calculate(IDFBlocks);
378fcfa7c5fSAlina Sbirlea     SmallVector<AssertingVH<MemoryPhi>, 4> NewInsertedPHIs;
3791c528e8fSAlina Sbirlea     for (auto *BBIDF : IDFBlocks) {
3801c528e8fSAlina Sbirlea       auto *MPhi = MSSA->getMemoryAccess(BBIDF);
3811c528e8fSAlina Sbirlea       if (!MPhi) {
3821c528e8fSAlina Sbirlea         MPhi = MSSA->createMemoryPhi(BBIDF);
383e589067eSAlina Sbirlea         NewInsertedPHIs.push_back(MPhi);
384344a3d0bSAlina Sbirlea       } else {
385344a3d0bSAlina Sbirlea         ExistingPhis.insert(MPhi);
3861c528e8fSAlina Sbirlea       }
38724ae5ce5SAlina Sbirlea       // Add the phis created into the IDF blocks to NonOptPhis, so they are not
38824ae5ce5SAlina Sbirlea       // optimized out as trivial by the call to getPreviousDefFromEnd below.
38924ae5ce5SAlina Sbirlea       // Once they are complete, all these Phis are added to the FixupList, and
39024ae5ce5SAlina Sbirlea       // removed from NonOptPhis inside fixupDefs(). Existing Phis in IDF may
39124ae5ce5SAlina Sbirlea       // need fixing as well, and potentially be trivial before this insertion,
39224ae5ce5SAlina Sbirlea       // hence add all IDF Phis. See PR43044.
393e589067eSAlina Sbirlea       NonOptPhis.insert(MPhi);
394e589067eSAlina Sbirlea     }
395fcfa7c5fSAlina Sbirlea     for (auto &MPhi : NewInsertedPHIs) {
396fcfa7c5fSAlina Sbirlea       auto *BBIDF = MPhi->getBlock();
397fcfa7c5fSAlina Sbirlea       for (auto *Pred : predecessors(BBIDF)) {
398fcfa7c5fSAlina Sbirlea         DenseMap<BasicBlock *, TrackingVH<MemoryAccess>> CachedPreviousDef;
39924ae5ce5SAlina Sbirlea         MPhi->addIncoming(getPreviousDefFromEnd(Pred, CachedPreviousDef), Pred);
400fcfa7c5fSAlina Sbirlea       }
401fcfa7c5fSAlina Sbirlea     }
402fcfa7c5fSAlina Sbirlea 
40324ae5ce5SAlina Sbirlea     // Re-take the index where we're adding the new phis, because the above call
40424ae5ce5SAlina Sbirlea     // to getPreviousDefFromEnd, may have inserted into InsertedPHIs.
4056720ed85SAlina Sbirlea     NewPhiIndex = InsertedPHIs.size();
406fcfa7c5fSAlina Sbirlea     for (auto &MPhi : NewInsertedPHIs) {
407fcfa7c5fSAlina Sbirlea       InsertedPHIs.push_back(&*MPhi);
408fcfa7c5fSAlina Sbirlea       FixupList.push_back(&*MPhi);
409fcfa7c5fSAlina Sbirlea     }
41024ae5ce5SAlina Sbirlea 
4116720ed85SAlina Sbirlea     FixupList.push_back(MD);
4126720ed85SAlina Sbirlea   }
4136720ed85SAlina Sbirlea 
414fcfa7c5fSAlina Sbirlea   // Remember the index where we stopped inserting new phis above, since the
415fcfa7c5fSAlina Sbirlea   // fixupDefs call in the loop below may insert more, that are already minimal.
416fcfa7c5fSAlina Sbirlea   unsigned NewPhiIndexEnd = InsertedPHIs.size();
417fcfa7c5fSAlina Sbirlea 
418554dcd8cSDaniel Berlin   while (!FixupList.empty()) {
419554dcd8cSDaniel Berlin     unsigned StartingPHISize = InsertedPHIs.size();
420554dcd8cSDaniel Berlin     fixupDefs(FixupList);
421554dcd8cSDaniel Berlin     FixupList.clear();
422554dcd8cSDaniel Berlin     // Put any new phis on the fixup list, and process them
423f854ce84SAlexandros Lamprineas     FixupList.append(InsertedPHIs.begin() + StartingPHISize, InsertedPHIs.end());
424554dcd8cSDaniel Berlin   }
425fcfa7c5fSAlina Sbirlea 
426fcfa7c5fSAlina Sbirlea   // Optimize potentially non-minimal phis added in this method.
427151ab484SAlina Sbirlea   unsigned NewPhiSize = NewPhiIndexEnd - NewPhiIndex;
428151ab484SAlina Sbirlea   if (NewPhiSize)
429151ab484SAlina Sbirlea     tryRemoveTrivialPhis(ArrayRef<WeakVH>(&InsertedPHIs[NewPhiIndex], NewPhiSize));
430fcfa7c5fSAlina Sbirlea 
4314fbde1efSArtur Pilipenko   // Now that all fixups are done, rename all uses if we are asked. The defs are
4324fbde1efSArtur Pilipenko   // guaranteed to be in reachable code due to the check at the method entry.
433554dcd8cSDaniel Berlin   BasicBlock *StartBlock = MD->getBlock();
4344fbde1efSArtur Pilipenko   if (RenameUses) {
435b980bed3SFlorian Hahn     SmallPtrSet<BasicBlock *, 16> Visited;
436554dcd8cSDaniel Berlin     // We are guaranteed there is a def in the block, because we just got it
437554dcd8cSDaniel Berlin     // handed to us in this function.
438554dcd8cSDaniel Berlin     MemoryAccess *FirstDef = &*MSSA->getWritableBlockDefs(StartBlock)->begin();
439554dcd8cSDaniel Berlin     // Convert to incoming value if it's a memorydef. A phi *is* already an
440554dcd8cSDaniel Berlin     // incoming value.
441554dcd8cSDaniel Berlin     if (auto *MD = dyn_cast<MemoryDef>(FirstDef))
442554dcd8cSDaniel Berlin       FirstDef = MD->getDefiningAccess();
443554dcd8cSDaniel Berlin 
444554dcd8cSDaniel Berlin     MSSA->renamePass(MD->getBlock(), FirstDef, Visited);
445554dcd8cSDaniel Berlin     // We just inserted a phi into this block, so the incoming value will become
446554dcd8cSDaniel Berlin     // the phi anyway, so it does not matter what we pass.
447f854ce84SAlexandros Lamprineas     for (auto &MP : InsertedPHIs) {
448f854ce84SAlexandros Lamprineas       MemoryPhi *Phi = dyn_cast_or_null<MemoryPhi>(MP);
449f854ce84SAlexandros Lamprineas       if (Phi)
450f854ce84SAlexandros Lamprineas         MSSA->renamePass(Phi->getBlock(), nullptr, Visited);
451f854ce84SAlexandros Lamprineas     }
452344a3d0bSAlina Sbirlea     // Existing Phi blocks may need renaming too, if an access was previously
453344a3d0bSAlina Sbirlea     // optimized and the inserted Defs "covers" the Optimized value.
454*601b3a13SKazu Hirata     for (const auto &MP : ExistingPhis) {
455344a3d0bSAlina Sbirlea       MemoryPhi *Phi = dyn_cast_or_null<MemoryPhi>(MP);
456344a3d0bSAlina Sbirlea       if (Phi)
457344a3d0bSAlina Sbirlea         MSSA->renamePass(Phi->getBlock(), nullptr, Visited);
458344a3d0bSAlina Sbirlea     }
459554dcd8cSDaniel Berlin   }
460554dcd8cSDaniel Berlin }
461554dcd8cSDaniel Berlin 
fixupDefs(const SmallVectorImpl<WeakVH> & Vars)462f854ce84SAlexandros Lamprineas void MemorySSAUpdater::fixupDefs(const SmallVectorImpl<WeakVH> &Vars) {
463554dcd8cSDaniel Berlin   SmallPtrSet<const BasicBlock *, 8> Seen;
464554dcd8cSDaniel Berlin   SmallVector<const BasicBlock *, 16> Worklist;
465*601b3a13SKazu Hirata   for (const auto &Var : Vars) {
466f854ce84SAlexandros Lamprineas     MemoryAccess *NewDef = dyn_cast_or_null<MemoryAccess>(Var);
467f854ce84SAlexandros Lamprineas     if (!NewDef)
468f854ce84SAlexandros Lamprineas       continue;
469554dcd8cSDaniel Berlin     // First, see if there is a local def after the operand.
470554dcd8cSDaniel Berlin     auto *Defs = MSSA->getWritableBlockDefs(NewDef->getBlock());
471554dcd8cSDaniel Berlin     auto DefIter = NewDef->getDefsIterator();
472554dcd8cSDaniel Berlin 
47343af17beSZhaoshi Zheng     // The temporary Phi is being fixed, unmark it for not to optimize.
474e7cdb7edSGeorge Burgess IV     if (MemoryPhi *Phi = dyn_cast<MemoryPhi>(NewDef))
47543af17beSZhaoshi Zheng       NonOptPhis.erase(Phi);
47643af17beSZhaoshi Zheng 
477554dcd8cSDaniel Berlin     // If there is a local def after us, we only have to rename that.
478554dcd8cSDaniel Berlin     if (++DefIter != Defs->end()) {
479554dcd8cSDaniel Berlin       cast<MemoryDef>(DefIter)->setDefiningAccess(NewDef);
480554dcd8cSDaniel Berlin       continue;
481554dcd8cSDaniel Berlin     }
482554dcd8cSDaniel Berlin 
483554dcd8cSDaniel Berlin     // Otherwise, we need to search down through the CFG.
484554dcd8cSDaniel Berlin     // For each of our successors, handle it directly if their is a phi, or
485554dcd8cSDaniel Berlin     // place on the fixup worklist.
486554dcd8cSDaniel Berlin     for (const auto *S : successors(NewDef->getBlock())) {
487554dcd8cSDaniel Berlin       if (auto *MP = MSSA->getMemoryAccess(S))
488554dcd8cSDaniel Berlin         setMemoryPhiValueForBlock(MP, NewDef->getBlock(), NewDef);
489554dcd8cSDaniel Berlin       else
490554dcd8cSDaniel Berlin         Worklist.push_back(S);
491554dcd8cSDaniel Berlin     }
492554dcd8cSDaniel Berlin 
493554dcd8cSDaniel Berlin     while (!Worklist.empty()) {
49484b07c9bSKazu Hirata       const BasicBlock *FixupBlock = Worklist.pop_back_val();
495554dcd8cSDaniel Berlin 
496554dcd8cSDaniel Berlin       // Get the first def in the block that isn't a phi node.
497554dcd8cSDaniel Berlin       if (auto *Defs = MSSA->getWritableBlockDefs(FixupBlock)) {
498554dcd8cSDaniel Berlin         auto *FirstDef = &*Defs->begin();
499554dcd8cSDaniel Berlin         // The loop above and below should have taken care of phi nodes
500554dcd8cSDaniel Berlin         assert(!isa<MemoryPhi>(FirstDef) &&
501554dcd8cSDaniel Berlin                "Should have already handled phi nodes!");
502554dcd8cSDaniel Berlin         // We are now this def's defining access, make sure we actually dominate
503554dcd8cSDaniel Berlin         // it
504554dcd8cSDaniel Berlin         assert(MSSA->dominates(NewDef, FirstDef) &&
505554dcd8cSDaniel Berlin                "Should have dominated the new access");
506554dcd8cSDaniel Berlin 
507554dcd8cSDaniel Berlin         // This may insert new phi nodes, because we are not guaranteed the
508554dcd8cSDaniel Berlin         // block we are processing has a single pred, and depending where the
509554dcd8cSDaniel Berlin         // store was inserted, it may require phi nodes below it.
510554dcd8cSDaniel Berlin         cast<MemoryDef>(FirstDef)->setDefiningAccess(getPreviousDef(FirstDef));
511554dcd8cSDaniel Berlin         return;
512554dcd8cSDaniel Berlin       }
513554dcd8cSDaniel Berlin       // We didn't find a def, so we must continue.
514554dcd8cSDaniel Berlin       for (const auto *S : successors(FixupBlock)) {
515554dcd8cSDaniel Berlin         // If there is a phi node, handle it.
516554dcd8cSDaniel Berlin         // Otherwise, put the block on the worklist
517554dcd8cSDaniel Berlin         if (auto *MP = MSSA->getMemoryAccess(S))
518554dcd8cSDaniel Berlin           setMemoryPhiValueForBlock(MP, FixupBlock, NewDef);
519554dcd8cSDaniel Berlin         else {
520554dcd8cSDaniel Berlin           // If we cycle, we should have ended up at a phi node that we already
521554dcd8cSDaniel Berlin           // processed.  FIXME: Double check this
522554dcd8cSDaniel Berlin           if (!Seen.insert(S).second)
523554dcd8cSDaniel Berlin             continue;
524554dcd8cSDaniel Berlin           Worklist.push_back(S);
525554dcd8cSDaniel Berlin         }
526554dcd8cSDaniel Berlin       }
527554dcd8cSDaniel Berlin     }
528554dcd8cSDaniel Berlin   }
529554dcd8cSDaniel Berlin }
530554dcd8cSDaniel Berlin 
removeEdge(BasicBlock * From,BasicBlock * To)5317980099aSAlina Sbirlea void MemorySSAUpdater::removeEdge(BasicBlock *From, BasicBlock *To) {
5327980099aSAlina Sbirlea   if (MemoryPhi *MPhi = MSSA->getMemoryAccess(To)) {
5337980099aSAlina Sbirlea     MPhi->unorderedDeleteIncomingBlock(From);
5342863721fSAlina Sbirlea     tryRemoveTrivialPhi(MPhi);
5357980099aSAlina Sbirlea   }
5367980099aSAlina Sbirlea }
5377980099aSAlina Sbirlea 
removeDuplicatePhiEdgesBetween(const BasicBlock * From,const BasicBlock * To)538f31eba64SAlina Sbirlea void MemorySSAUpdater::removeDuplicatePhiEdgesBetween(const BasicBlock *From,
539f31eba64SAlina Sbirlea                                                       const BasicBlock *To) {
5407980099aSAlina Sbirlea   if (MemoryPhi *MPhi = MSSA->getMemoryAccess(To)) {
5417980099aSAlina Sbirlea     bool Found = false;
5427980099aSAlina Sbirlea     MPhi->unorderedDeleteIncomingIf([&](const MemoryAccess *, BasicBlock *B) {
5437980099aSAlina Sbirlea       if (From != B)
5447980099aSAlina Sbirlea         return false;
5457980099aSAlina Sbirlea       if (Found)
5467980099aSAlina Sbirlea         return true;
5477980099aSAlina Sbirlea       Found = true;
5487980099aSAlina Sbirlea       return false;
5497980099aSAlina Sbirlea     });
5502863721fSAlina Sbirlea     tryRemoveTrivialPhi(MPhi);
5517980099aSAlina Sbirlea   }
5527980099aSAlina Sbirlea }
5537980099aSAlina Sbirlea 
55463844c11SAlina Sbirlea /// If all arguments of a MemoryPHI are defined by the same incoming
55563844c11SAlina Sbirlea /// argument, return that argument.
onlySingleValue(MemoryPhi * MP)55663844c11SAlina Sbirlea static MemoryAccess *onlySingleValue(MemoryPhi *MP) {
55763844c11SAlina Sbirlea   MemoryAccess *MA = nullptr;
55863844c11SAlina Sbirlea 
55963844c11SAlina Sbirlea   for (auto &Arg : MP->operands()) {
56063844c11SAlina Sbirlea     if (!MA)
56163844c11SAlina Sbirlea       MA = cast<MemoryAccess>(Arg);
56263844c11SAlina Sbirlea     else if (MA != Arg)
56363844c11SAlina Sbirlea       return nullptr;
56463844c11SAlina Sbirlea   }
56563844c11SAlina Sbirlea   return MA;
56663844c11SAlina Sbirlea }
56763844c11SAlina Sbirlea 
getNewDefiningAccessForClone(MemoryAccess * MA,const ValueToValueMapTy & VMap,PhiToDefMap & MPhiMap,bool CloneWasSimplified,MemorySSA * MSSA)5684bc625caSAlina Sbirlea static MemoryAccess *getNewDefiningAccessForClone(MemoryAccess *MA,
5697980099aSAlina Sbirlea                                                   const ValueToValueMapTy &VMap,
5707a0098aaSAlina Sbirlea                                                   PhiToDefMap &MPhiMap,
5714bc625caSAlina Sbirlea                                                   bool CloneWasSimplified,
5724bc625caSAlina Sbirlea                                                   MemorySSA *MSSA) {
5737980099aSAlina Sbirlea   MemoryAccess *InsnDefining = MA;
5744bc625caSAlina Sbirlea   if (MemoryDef *DefMUD = dyn_cast<MemoryDef>(InsnDefining)) {
5757980099aSAlina Sbirlea     if (!MSSA->isLiveOnEntryDef(DefMUD)) {
5767980099aSAlina Sbirlea       Instruction *DefMUDI = DefMUD->getMemoryInst();
5777980099aSAlina Sbirlea       assert(DefMUDI && "Found MemoryUseOrDef with no Instruction.");
5787980099aSAlina Sbirlea       if (Instruction *NewDefMUDI =
5794bc625caSAlina Sbirlea               cast_or_null<Instruction>(VMap.lookup(DefMUDI))) {
5807980099aSAlina Sbirlea         InsnDefining = MSSA->getMemoryAccess(NewDefMUDI);
5814bc625caSAlina Sbirlea         if (!CloneWasSimplified)
5824bc625caSAlina Sbirlea           assert(InsnDefining && "Defining instruction cannot be nullptr.");
5834bc625caSAlina Sbirlea         else if (!InsnDefining || isa<MemoryUse>(InsnDefining)) {
5844bc625caSAlina Sbirlea           // The clone was simplified, it's no longer a MemoryDef, look up.
5854bc625caSAlina Sbirlea           auto DefIt = DefMUD->getDefsIterator();
5864bc625caSAlina Sbirlea           // Since simplified clones only occur in single block cloning, a
5874bc625caSAlina Sbirlea           // previous definition must exist, otherwise NewDefMUDI would not
5884bc625caSAlina Sbirlea           // have been found in VMap.
5894bc625caSAlina Sbirlea           assert(DefIt != MSSA->getBlockDefs(DefMUD->getBlock())->begin() &&
5904bc625caSAlina Sbirlea                  "Previous def must exist");
5914bc625caSAlina Sbirlea           InsnDefining = getNewDefiningAccessForClone(
5924bc625caSAlina Sbirlea               &*(--DefIt), VMap, MPhiMap, CloneWasSimplified, MSSA);
5934bc625caSAlina Sbirlea         }
5944bc625caSAlina Sbirlea       }
5957980099aSAlina Sbirlea     }
5967980099aSAlina Sbirlea   } else {
5977980099aSAlina Sbirlea     MemoryPhi *DefPhi = cast<MemoryPhi>(InsnDefining);
5987980099aSAlina Sbirlea     if (MemoryAccess *NewDefPhi = MPhiMap.lookup(DefPhi))
5997980099aSAlina Sbirlea       InsnDefining = NewDefPhi;
6007980099aSAlina Sbirlea   }
6017980099aSAlina Sbirlea   assert(InsnDefining && "Defining instruction cannot be nullptr.");
6027980099aSAlina Sbirlea   return InsnDefining;
6034bc625caSAlina Sbirlea }
6047980099aSAlina Sbirlea 
cloneUsesAndDefs(BasicBlock * BB,BasicBlock * NewBB,const ValueToValueMapTy & VMap,PhiToDefMap & MPhiMap,bool CloneWasSimplified)6054bc625caSAlina Sbirlea void MemorySSAUpdater::cloneUsesAndDefs(BasicBlock *BB, BasicBlock *NewBB,
6064bc625caSAlina Sbirlea                                         const ValueToValueMapTy &VMap,
6074bc625caSAlina Sbirlea                                         PhiToDefMap &MPhiMap,
6084bc625caSAlina Sbirlea                                         bool CloneWasSimplified) {
6097980099aSAlina Sbirlea   const MemorySSA::AccessList *Acc = MSSA->getBlockAccesses(BB);
6107980099aSAlina Sbirlea   if (!Acc)
6117980099aSAlina Sbirlea     return;
6127980099aSAlina Sbirlea   for (const MemoryAccess &MA : *Acc) {
6137980099aSAlina Sbirlea     if (const MemoryUseOrDef *MUD = dyn_cast<MemoryUseOrDef>(&MA)) {
6147980099aSAlina Sbirlea       Instruction *Insn = MUD->getMemoryInst();
6157980099aSAlina Sbirlea       // Entry does not exist if the clone of the block did not clone all
6167980099aSAlina Sbirlea       // instructions. This occurs in LoopRotate when cloning instructions
6177980099aSAlina Sbirlea       // from the old header to the old preheader. The cloned instruction may
6187980099aSAlina Sbirlea       // also be a simplified Value, not an Instruction (see LoopRotate).
6197a0098aaSAlina Sbirlea       // Also in LoopRotate, even when it's an instruction, due to it being
6207a0098aaSAlina Sbirlea       // simplified, it may be a Use rather than a Def, so we cannot use MUD as
6217a0098aaSAlina Sbirlea       // template. Calls coming from updateForClonedBlockIntoPred, ensure this.
6227980099aSAlina Sbirlea       if (Instruction *NewInsn =
6237980099aSAlina Sbirlea               dyn_cast_or_null<Instruction>(VMap.lookup(Insn))) {
6247980099aSAlina Sbirlea         MemoryAccess *NewUseOrDef = MSSA->createDefinedAccess(
6254bc625caSAlina Sbirlea             NewInsn,
6264bc625caSAlina Sbirlea             getNewDefiningAccessForClone(MUD->getDefiningAccess(), VMap,
6274bc625caSAlina Sbirlea                                          MPhiMap, CloneWasSimplified, MSSA),
6284bc625caSAlina Sbirlea             /*Template=*/CloneWasSimplified ? nullptr : MUD,
6294bc625caSAlina Sbirlea             /*CreationMustSucceed=*/CloneWasSimplified ? false : true);
6304bc625caSAlina Sbirlea         if (NewUseOrDef)
6317980099aSAlina Sbirlea           MSSA->insertIntoListsForBlock(NewUseOrDef, NewBB, MemorySSA::End);
6327980099aSAlina Sbirlea       }
6337980099aSAlina Sbirlea     }
6347980099aSAlina Sbirlea   }
6357980099aSAlina Sbirlea }
6367980099aSAlina Sbirlea 
updatePhisWhenInsertingUniqueBackedgeBlock(BasicBlock * Header,BasicBlock * Preheader,BasicBlock * BEBlock)637f31eba64SAlina Sbirlea void MemorySSAUpdater::updatePhisWhenInsertingUniqueBackedgeBlock(
638f31eba64SAlina Sbirlea     BasicBlock *Header, BasicBlock *Preheader, BasicBlock *BEBlock) {
639f31eba64SAlina Sbirlea   auto *MPhi = MSSA->getMemoryAccess(Header);
640f31eba64SAlina Sbirlea   if (!MPhi)
641f31eba64SAlina Sbirlea     return;
642f31eba64SAlina Sbirlea 
643f31eba64SAlina Sbirlea   // Create phi node in the backedge block and populate it with the same
644f31eba64SAlina Sbirlea   // incoming values as MPhi. Skip incoming values coming from Preheader.
645f31eba64SAlina Sbirlea   auto *NewMPhi = MSSA->createMemoryPhi(BEBlock);
646f31eba64SAlina Sbirlea   bool HasUniqueIncomingValue = true;
647f31eba64SAlina Sbirlea   MemoryAccess *UniqueValue = nullptr;
648f31eba64SAlina Sbirlea   for (unsigned I = 0, E = MPhi->getNumIncomingValues(); I != E; ++I) {
649f31eba64SAlina Sbirlea     BasicBlock *IBB = MPhi->getIncomingBlock(I);
650f31eba64SAlina Sbirlea     MemoryAccess *IV = MPhi->getIncomingValue(I);
651f31eba64SAlina Sbirlea     if (IBB != Preheader) {
652f31eba64SAlina Sbirlea       NewMPhi->addIncoming(IV, IBB);
653f31eba64SAlina Sbirlea       if (HasUniqueIncomingValue) {
654f31eba64SAlina Sbirlea         if (!UniqueValue)
655f31eba64SAlina Sbirlea           UniqueValue = IV;
656f31eba64SAlina Sbirlea         else if (UniqueValue != IV)
657f31eba64SAlina Sbirlea           HasUniqueIncomingValue = false;
658f31eba64SAlina Sbirlea       }
659f31eba64SAlina Sbirlea     }
660f31eba64SAlina Sbirlea   }
661f31eba64SAlina Sbirlea 
662f31eba64SAlina Sbirlea   // Update incoming edges into MPhi. Remove all but the incoming edge from
663f31eba64SAlina Sbirlea   // Preheader. Add an edge from NewMPhi
664f31eba64SAlina Sbirlea   auto *AccFromPreheader = MPhi->getIncomingValueForBlock(Preheader);
665f31eba64SAlina Sbirlea   MPhi->setIncomingValue(0, AccFromPreheader);
666f31eba64SAlina Sbirlea   MPhi->setIncomingBlock(0, Preheader);
667f31eba64SAlina Sbirlea   for (unsigned I = MPhi->getNumIncomingValues() - 1; I >= 1; --I)
668f31eba64SAlina Sbirlea     MPhi->unorderedDeleteIncoming(I);
669f31eba64SAlina Sbirlea   MPhi->addIncoming(NewMPhi, BEBlock);
670f31eba64SAlina Sbirlea 
671f31eba64SAlina Sbirlea   // If NewMPhi is a trivial phi, remove it. Its use in the header MPhi will be
672f31eba64SAlina Sbirlea   // replaced with the unique value.
673ae40dfc1SAlina Sbirlea   tryRemoveTrivialPhi(NewMPhi);
674f31eba64SAlina Sbirlea }
675f31eba64SAlina Sbirlea 
updateForClonedLoop(const LoopBlocksRPO & LoopBlocks,ArrayRef<BasicBlock * > ExitBlocks,const ValueToValueMapTy & VMap,bool IgnoreIncomingWithNoClones)6767980099aSAlina Sbirlea void MemorySSAUpdater::updateForClonedLoop(const LoopBlocksRPO &LoopBlocks,
6777980099aSAlina Sbirlea                                            ArrayRef<BasicBlock *> ExitBlocks,
6787980099aSAlina Sbirlea                                            const ValueToValueMapTy &VMap,
6797980099aSAlina Sbirlea                                            bool IgnoreIncomingWithNoClones) {
6807980099aSAlina Sbirlea   PhiToDefMap MPhiMap;
6817980099aSAlina Sbirlea 
6827980099aSAlina Sbirlea   auto FixPhiIncomingValues = [&](MemoryPhi *Phi, MemoryPhi *NewPhi) {
6837980099aSAlina Sbirlea     assert(Phi && NewPhi && "Invalid Phi nodes.");
6847980099aSAlina Sbirlea     BasicBlock *NewPhiBB = NewPhi->getBlock();
6857980099aSAlina Sbirlea     SmallPtrSet<BasicBlock *, 4> NewPhiBBPreds(pred_begin(NewPhiBB),
6867980099aSAlina Sbirlea                                                pred_end(NewPhiBB));
6877980099aSAlina Sbirlea     for (unsigned It = 0, E = Phi->getNumIncomingValues(); It < E; ++It) {
6887980099aSAlina Sbirlea       MemoryAccess *IncomingAccess = Phi->getIncomingValue(It);
6897980099aSAlina Sbirlea       BasicBlock *IncBB = Phi->getIncomingBlock(It);
6907980099aSAlina Sbirlea 
6917980099aSAlina Sbirlea       if (BasicBlock *NewIncBB = cast_or_null<BasicBlock>(VMap.lookup(IncBB)))
6927980099aSAlina Sbirlea         IncBB = NewIncBB;
6937980099aSAlina Sbirlea       else if (IgnoreIncomingWithNoClones)
6947980099aSAlina Sbirlea         continue;
6957980099aSAlina Sbirlea 
6967980099aSAlina Sbirlea       // Now we have IncBB, and will need to add incoming from it to NewPhi.
6977980099aSAlina Sbirlea 
6987980099aSAlina Sbirlea       // If IncBB is not a predecessor of NewPhiBB, then do not add it.
6997980099aSAlina Sbirlea       // NewPhiBB was cloned without that edge.
7007980099aSAlina Sbirlea       if (!NewPhiBBPreds.count(IncBB))
7017980099aSAlina Sbirlea         continue;
7027980099aSAlina Sbirlea 
7037980099aSAlina Sbirlea       // Determine incoming value and add it as incoming from IncBB.
7047980099aSAlina Sbirlea       if (MemoryUseOrDef *IncMUD = dyn_cast<MemoryUseOrDef>(IncomingAccess)) {
7057980099aSAlina Sbirlea         if (!MSSA->isLiveOnEntryDef(IncMUD)) {
7067980099aSAlina Sbirlea           Instruction *IncI = IncMUD->getMemoryInst();
7077980099aSAlina Sbirlea           assert(IncI && "Found MemoryUseOrDef with no Instruction.");
7087980099aSAlina Sbirlea           if (Instruction *NewIncI =
7097980099aSAlina Sbirlea                   cast_or_null<Instruction>(VMap.lookup(IncI))) {
7107980099aSAlina Sbirlea             IncMUD = MSSA->getMemoryAccess(NewIncI);
7117980099aSAlina Sbirlea             assert(IncMUD &&
7127980099aSAlina Sbirlea                    "MemoryUseOrDef cannot be null, all preds processed.");
7137980099aSAlina Sbirlea           }
7147980099aSAlina Sbirlea         }
7157980099aSAlina Sbirlea         NewPhi->addIncoming(IncMUD, IncBB);
7167980099aSAlina Sbirlea       } else {
7177980099aSAlina Sbirlea         MemoryPhi *IncPhi = cast<MemoryPhi>(IncomingAccess);
7187980099aSAlina Sbirlea         if (MemoryAccess *NewDefPhi = MPhiMap.lookup(IncPhi))
7197980099aSAlina Sbirlea           NewPhi->addIncoming(NewDefPhi, IncBB);
7207980099aSAlina Sbirlea         else
7217980099aSAlina Sbirlea           NewPhi->addIncoming(IncPhi, IncBB);
7227980099aSAlina Sbirlea       }
7237980099aSAlina Sbirlea     }
724c292fba4SAlina Sbirlea     if (auto *SingleAccess = onlySingleValue(NewPhi)) {
725c292fba4SAlina Sbirlea       MPhiMap[Phi] = SingleAccess;
72663844c11SAlina Sbirlea       removeMemoryAccess(NewPhi);
72763844c11SAlina Sbirlea     }
7287980099aSAlina Sbirlea   };
7297980099aSAlina Sbirlea 
7307980099aSAlina Sbirlea   auto ProcessBlock = [&](BasicBlock *BB) {
7317980099aSAlina Sbirlea     BasicBlock *NewBlock = cast_or_null<BasicBlock>(VMap.lookup(BB));
7327980099aSAlina Sbirlea     if (!NewBlock)
7337980099aSAlina Sbirlea       return;
7347980099aSAlina Sbirlea 
7357980099aSAlina Sbirlea     assert(!MSSA->getWritableBlockAccesses(NewBlock) &&
7367980099aSAlina Sbirlea            "Cloned block should have no accesses");
7377980099aSAlina Sbirlea 
7387980099aSAlina Sbirlea     // Add MemoryPhi.
7397980099aSAlina Sbirlea     if (MemoryPhi *MPhi = MSSA->getMemoryAccess(BB)) {
7407980099aSAlina Sbirlea       MemoryPhi *NewPhi = MSSA->createMemoryPhi(NewBlock);
7417980099aSAlina Sbirlea       MPhiMap[MPhi] = NewPhi;
7427980099aSAlina Sbirlea     }
7437980099aSAlina Sbirlea     // Update Uses and Defs.
7447980099aSAlina Sbirlea     cloneUsesAndDefs(BB, NewBlock, VMap, MPhiMap);
7457980099aSAlina Sbirlea   };
7467980099aSAlina Sbirlea 
747*601b3a13SKazu Hirata   for (auto *BB : llvm::concat<BasicBlock *const>(LoopBlocks, ExitBlocks))
7487980099aSAlina Sbirlea     ProcessBlock(BB);
7497980099aSAlina Sbirlea 
750*601b3a13SKazu Hirata   for (auto *BB : llvm::concat<BasicBlock *const>(LoopBlocks, ExitBlocks))
7517980099aSAlina Sbirlea     if (MemoryPhi *MPhi = MSSA->getMemoryAccess(BB))
7527980099aSAlina Sbirlea       if (MemoryAccess *NewPhi = MPhiMap.lookup(MPhi))
7537980099aSAlina Sbirlea         FixPhiIncomingValues(MPhi, cast<MemoryPhi>(NewPhi));
7547980099aSAlina Sbirlea }
7557980099aSAlina Sbirlea 
updateForClonedBlockIntoPred(BasicBlock * BB,BasicBlock * P1,const ValueToValueMapTy & VM)7567980099aSAlina Sbirlea void MemorySSAUpdater::updateForClonedBlockIntoPred(
7577980099aSAlina Sbirlea     BasicBlock *BB, BasicBlock *P1, const ValueToValueMapTy &VM) {
7587980099aSAlina Sbirlea   // All defs/phis from outside BB that are used in BB, are valid uses in P1.
7597980099aSAlina Sbirlea   // Since those defs/phis must have dominated BB, and also dominate P1.
7607980099aSAlina Sbirlea   // Defs from BB being used in BB will be replaced with the cloned defs from
7617980099aSAlina Sbirlea   // VM. The uses of BB's Phi (if it exists) in BB will be replaced by the
7627980099aSAlina Sbirlea   // incoming def into the Phi from P1.
7637a0098aaSAlina Sbirlea   // Instructions cloned into the predecessor are in practice sometimes
7647a0098aaSAlina Sbirlea   // simplified, so disable the use of the template, and create an access from
7657a0098aaSAlina Sbirlea   // scratch.
7667980099aSAlina Sbirlea   PhiToDefMap MPhiMap;
7677980099aSAlina Sbirlea   if (MemoryPhi *MPhi = MSSA->getMemoryAccess(BB))
7687980099aSAlina Sbirlea     MPhiMap[MPhi] = MPhi->getIncomingValueForBlock(P1);
7697a0098aaSAlina Sbirlea   cloneUsesAndDefs(BB, P1, VM, MPhiMap, /*CloneWasSimplified=*/true);
7707980099aSAlina Sbirlea }
7717980099aSAlina Sbirlea 
7727980099aSAlina Sbirlea template <typename Iter>
privateUpdateExitBlocksForClonedLoop(ArrayRef<BasicBlock * > ExitBlocks,Iter ValuesBegin,Iter ValuesEnd,DominatorTree & DT)7737980099aSAlina Sbirlea void MemorySSAUpdater::privateUpdateExitBlocksForClonedLoop(
7747980099aSAlina Sbirlea     ArrayRef<BasicBlock *> ExitBlocks, Iter ValuesBegin, Iter ValuesEnd,
7757980099aSAlina Sbirlea     DominatorTree &DT) {
7767980099aSAlina Sbirlea   SmallVector<CFGUpdate, 4> Updates;
7777980099aSAlina Sbirlea   // Update/insert phis in all successors of exit blocks.
7787980099aSAlina Sbirlea   for (auto *Exit : ExitBlocks)
7797980099aSAlina Sbirlea     for (const ValueToValueMapTy *VMap : make_range(ValuesBegin, ValuesEnd))
7807980099aSAlina Sbirlea       if (BasicBlock *NewExit = cast_or_null<BasicBlock>(VMap->lookup(Exit))) {
7817980099aSAlina Sbirlea         BasicBlock *ExitSucc = NewExit->getTerminator()->getSuccessor(0);
7827980099aSAlina Sbirlea         Updates.push_back({DT.Insert, NewExit, ExitSucc});
7837980099aSAlina Sbirlea       }
7847980099aSAlina Sbirlea   applyInsertUpdates(Updates, DT);
7857980099aSAlina Sbirlea }
7867980099aSAlina Sbirlea 
updateExitBlocksForClonedLoop(ArrayRef<BasicBlock * > ExitBlocks,const ValueToValueMapTy & VMap,DominatorTree & DT)7877980099aSAlina Sbirlea void MemorySSAUpdater::updateExitBlocksForClonedLoop(
7887980099aSAlina Sbirlea     ArrayRef<BasicBlock *> ExitBlocks, const ValueToValueMapTy &VMap,
7897980099aSAlina Sbirlea     DominatorTree &DT) {
7907980099aSAlina Sbirlea   const ValueToValueMapTy *const Arr[] = {&VMap};
7917980099aSAlina Sbirlea   privateUpdateExitBlocksForClonedLoop(ExitBlocks, std::begin(Arr),
7927980099aSAlina Sbirlea                                        std::end(Arr), DT);
7937980099aSAlina Sbirlea }
7947980099aSAlina Sbirlea 
updateExitBlocksForClonedLoop(ArrayRef<BasicBlock * > ExitBlocks,ArrayRef<std::unique_ptr<ValueToValueMapTy>> VMaps,DominatorTree & DT)7957980099aSAlina Sbirlea void MemorySSAUpdater::updateExitBlocksForClonedLoop(
7967980099aSAlina Sbirlea     ArrayRef<BasicBlock *> ExitBlocks,
7977980099aSAlina Sbirlea     ArrayRef<std::unique_ptr<ValueToValueMapTy>> VMaps, DominatorTree &DT) {
7987980099aSAlina Sbirlea   auto GetPtr = [&](const std::unique_ptr<ValueToValueMapTy> &I) {
7997980099aSAlina Sbirlea     return I.get();
8007980099aSAlina Sbirlea   };
8017980099aSAlina Sbirlea   using MappedIteratorType =
8027980099aSAlina Sbirlea       mapped_iterator<const std::unique_ptr<ValueToValueMapTy> *,
8037980099aSAlina Sbirlea                       decltype(GetPtr)>;
8047980099aSAlina Sbirlea   auto MapBegin = MappedIteratorType(VMaps.begin(), GetPtr);
8057980099aSAlina Sbirlea   auto MapEnd = MappedIteratorType(VMaps.end(), GetPtr);
8067980099aSAlina Sbirlea   privateUpdateExitBlocksForClonedLoop(ExitBlocks, MapBegin, MapEnd, DT);
8077980099aSAlina Sbirlea }
8087980099aSAlina Sbirlea 
applyUpdates(ArrayRef<CFGUpdate> Updates,DominatorTree & DT,bool UpdateDT)8097980099aSAlina Sbirlea void MemorySSAUpdater::applyUpdates(ArrayRef<CFGUpdate> Updates,
81063aeaf75SAlina Sbirlea                                     DominatorTree &DT, bool UpdateDT) {
811688450c7SAlina Sbirlea   SmallVector<CFGUpdate, 4> DeleteUpdates;
812f55ad397SAlina Sbirlea   SmallVector<CFGUpdate, 4> RevDeleteUpdates;
8137980099aSAlina Sbirlea   SmallVector<CFGUpdate, 4> InsertUpdates;
814*601b3a13SKazu Hirata   for (const auto &Update : Updates) {
8157980099aSAlina Sbirlea     if (Update.getKind() == DT.Insert)
8167980099aSAlina Sbirlea       InsertUpdates.push_back({DT.Insert, Update.getFrom(), Update.getTo()});
817f55ad397SAlina Sbirlea     else {
818688450c7SAlina Sbirlea       DeleteUpdates.push_back({DT.Delete, Update.getFrom(), Update.getTo()});
819f55ad397SAlina Sbirlea       RevDeleteUpdates.push_back({DT.Insert, Update.getFrom(), Update.getTo()});
820f55ad397SAlina Sbirlea     }
8217980099aSAlina Sbirlea   }
8227980099aSAlina Sbirlea 
823688450c7SAlina Sbirlea   if (!DeleteUpdates.empty()) {
824a10409feSAlina Sbirlea     if (!InsertUpdates.empty()) {
82563aeaf75SAlina Sbirlea       if (!UpdateDT) {
826f55ad397SAlina Sbirlea         SmallVector<CFGUpdate, 0> Empty;
827f55ad397SAlina Sbirlea         // Deletes are reversed applied, because this CFGView is pretending the
828f55ad397SAlina Sbirlea         // deletes did not happen yet, hence the edges still exist.
829f55ad397SAlina Sbirlea         DT.applyUpdates(Empty, RevDeleteUpdates);
83063aeaf75SAlina Sbirlea       } else {
83163aeaf75SAlina Sbirlea         // Apply all updates, with the RevDeleteUpdates as PostCFGView.
83263aeaf75SAlina Sbirlea         DT.applyUpdates(Updates, RevDeleteUpdates);
83363aeaf75SAlina Sbirlea       }
834f55ad397SAlina Sbirlea 
835f55ad397SAlina Sbirlea       // Note: the MSSA update below doesn't distinguish between a GD with
836f55ad397SAlina Sbirlea       // (RevDelete,false) and (Delete, true), but this matters for the DT
837f55ad397SAlina Sbirlea       // updates above; for "children" purposes they are equivalent; but the
838f55ad397SAlina Sbirlea       // updates themselves convey the desired update, used inside DT only.
839f55ad397SAlina Sbirlea       GraphDiff<BasicBlock *> GD(RevDeleteUpdates);
840f55ad397SAlina Sbirlea       applyInsertUpdates(InsertUpdates, DT, &GD);
841a10409feSAlina Sbirlea       // Update DT to redelete edges; this matches the real CFG so we can
842a10409feSAlina Sbirlea       // perform the standard update without a postview of the CFG.
843f55ad397SAlina Sbirlea       DT.applyUpdates(DeleteUpdates);
8447980099aSAlina Sbirlea     } else {
84563aeaf75SAlina Sbirlea       if (UpdateDT)
846a10409feSAlina Sbirlea         DT.applyUpdates(DeleteUpdates);
847a10409feSAlina Sbirlea     }
848a10409feSAlina Sbirlea   } else {
849a10409feSAlina Sbirlea     if (UpdateDT)
85063aeaf75SAlina Sbirlea       DT.applyUpdates(Updates);
8517980099aSAlina Sbirlea     GraphDiff<BasicBlock *> GD;
8527980099aSAlina Sbirlea     applyInsertUpdates(InsertUpdates, DT, &GD);
8537980099aSAlina Sbirlea   }
8547980099aSAlina Sbirlea 
8557980099aSAlina Sbirlea   // Update for deleted edges
856688450c7SAlina Sbirlea   for (auto &Update : DeleteUpdates)
8577980099aSAlina Sbirlea     removeEdge(Update.getFrom(), Update.getTo());
8587980099aSAlina Sbirlea }
8597980099aSAlina Sbirlea 
applyInsertUpdates(ArrayRef<CFGUpdate> Updates,DominatorTree & DT)8607980099aSAlina Sbirlea void MemorySSAUpdater::applyInsertUpdates(ArrayRef<CFGUpdate> Updates,
8617980099aSAlina Sbirlea                                           DominatorTree &DT) {
8627980099aSAlina Sbirlea   GraphDiff<BasicBlock *> GD;
8637980099aSAlina Sbirlea   applyInsertUpdates(Updates, DT, &GD);
8647980099aSAlina Sbirlea }
8657980099aSAlina Sbirlea 
applyInsertUpdates(ArrayRef<CFGUpdate> Updates,DominatorTree & DT,const GraphDiff<BasicBlock * > * GD)8667980099aSAlina Sbirlea void MemorySSAUpdater::applyInsertUpdates(ArrayRef<CFGUpdate> Updates,
8677980099aSAlina Sbirlea                                           DominatorTree &DT,
8687980099aSAlina Sbirlea                                           const GraphDiff<BasicBlock *> *GD) {
8697980099aSAlina Sbirlea   // Get recursive last Def, assuming well formed MSSA and updated DT.
8707980099aSAlina Sbirlea   auto GetLastDef = [&](BasicBlock *BB) -> MemoryAccess * {
8717980099aSAlina Sbirlea     while (true) {
8727980099aSAlina Sbirlea       MemorySSA::DefsList *Defs = MSSA->getWritableBlockDefs(BB);
8737980099aSAlina Sbirlea       // Return last Def or Phi in BB, if it exists.
8747980099aSAlina Sbirlea       if (Defs)
8757980099aSAlina Sbirlea         return &*(--Defs->end());
8767980099aSAlina Sbirlea 
8777980099aSAlina Sbirlea       // Check number of predecessors, we only care if there's more than one.
8787980099aSAlina Sbirlea       unsigned Count = 0;
8797980099aSAlina Sbirlea       BasicBlock *Pred = nullptr;
880f1d4db4fSAlina Sbirlea       for (auto *Pi : GD->template getChildren</*InverseEdge=*/true>(BB)) {
881f1d4db4fSAlina Sbirlea         Pred = Pi;
8827980099aSAlina Sbirlea         Count++;
8837980099aSAlina Sbirlea         if (Count == 2)
8847980099aSAlina Sbirlea           break;
8857980099aSAlina Sbirlea       }
8867980099aSAlina Sbirlea 
8877980099aSAlina Sbirlea       // If BB has multiple predecessors, get last definition from IDom.
8887980099aSAlina Sbirlea       if (Count != 1) {
8897980099aSAlina Sbirlea         // [SimpleLoopUnswitch] If BB is a dead block, about to be deleted, its
8907980099aSAlina Sbirlea         // DT is invalidated. Return LoE as its last def. This will be added to
8917980099aSAlina Sbirlea         // MemoryPhi node, and later deleted when the block is deleted.
8927980099aSAlina Sbirlea         if (!DT.getNode(BB))
8937980099aSAlina Sbirlea           return MSSA->getLiveOnEntryDef();
8947980099aSAlina Sbirlea         if (auto *IDom = DT.getNode(BB)->getIDom())
8957980099aSAlina Sbirlea           if (IDom->getBlock() != BB) {
8967980099aSAlina Sbirlea             BB = IDom->getBlock();
8977980099aSAlina Sbirlea             continue;
8987980099aSAlina Sbirlea           }
8997980099aSAlina Sbirlea         return MSSA->getLiveOnEntryDef();
9007980099aSAlina Sbirlea       } else {
9017980099aSAlina Sbirlea         // Single predecessor, BB cannot be dead. GetLastDef of Pred.
9027980099aSAlina Sbirlea         assert(Count == 1 && Pred && "Single predecessor expected.");
903890090f7SAlina Sbirlea         // BB can be unreachable though, return LoE if that is the case.
904890090f7SAlina Sbirlea         if (!DT.getNode(BB))
905890090f7SAlina Sbirlea           return MSSA->getLiveOnEntryDef();
9067980099aSAlina Sbirlea         BB = Pred;
9077980099aSAlina Sbirlea       }
9087980099aSAlina Sbirlea     };
9097980099aSAlina Sbirlea     llvm_unreachable("Unable to get last definition.");
9107980099aSAlina Sbirlea   };
9117980099aSAlina Sbirlea 
9127980099aSAlina Sbirlea   // Get nearest IDom given a set of blocks.
9137980099aSAlina Sbirlea   // TODO: this can be optimized by starting the search at the node with the
9147980099aSAlina Sbirlea   // lowest level (highest in the tree).
9157980099aSAlina Sbirlea   auto FindNearestCommonDominator =
9167980099aSAlina Sbirlea       [&](const SmallSetVector<BasicBlock *, 2> &BBSet) -> BasicBlock * {
9177980099aSAlina Sbirlea     BasicBlock *PrevIDom = *BBSet.begin();
9187980099aSAlina Sbirlea     for (auto *BB : BBSet)
9197980099aSAlina Sbirlea       PrevIDom = DT.findNearestCommonDominator(PrevIDom, BB);
9207980099aSAlina Sbirlea     return PrevIDom;
9217980099aSAlina Sbirlea   };
9227980099aSAlina Sbirlea 
9237980099aSAlina Sbirlea   // Get all blocks that dominate PrevIDom, stop when reaching CurrIDom. Do not
9247980099aSAlina Sbirlea   // include CurrIDom.
9257980099aSAlina Sbirlea   auto GetNoLongerDomBlocks =
9267980099aSAlina Sbirlea       [&](BasicBlock *PrevIDom, BasicBlock *CurrIDom,
9277980099aSAlina Sbirlea           SmallVectorImpl<BasicBlock *> &BlocksPrevDom) {
9287980099aSAlina Sbirlea         if (PrevIDom == CurrIDom)
9297980099aSAlina Sbirlea           return;
9307980099aSAlina Sbirlea         BlocksPrevDom.push_back(PrevIDom);
9317980099aSAlina Sbirlea         BasicBlock *NextIDom = PrevIDom;
9327980099aSAlina Sbirlea         while (BasicBlock *UpIDom =
9337980099aSAlina Sbirlea                    DT.getNode(NextIDom)->getIDom()->getBlock()) {
9347980099aSAlina Sbirlea           if (UpIDom == CurrIDom)
9357980099aSAlina Sbirlea             break;
9367980099aSAlina Sbirlea           BlocksPrevDom.push_back(UpIDom);
9377980099aSAlina Sbirlea           NextIDom = UpIDom;
9387980099aSAlina Sbirlea         }
9397980099aSAlina Sbirlea       };
9407980099aSAlina Sbirlea 
9417980099aSAlina Sbirlea   // Map a BB to its predecessors: added + previously existing. To get a
9427980099aSAlina Sbirlea   // deterministic order, store predecessors as SetVectors. The order in each
94302a2bb2fSHiroshi Inoue   // will be defined by the order in Updates (fixed) and the order given by
9447980099aSAlina Sbirlea   // children<> (also fixed). Since we further iterate over these ordered sets,
9457980099aSAlina Sbirlea   // we lose the information of multiple edges possibly existing between two
9467980099aSAlina Sbirlea   // blocks, so we'll keep and EdgeCount map for that.
9477980099aSAlina Sbirlea   // An alternate implementation could keep unordered set for the predecessors,
9487980099aSAlina Sbirlea   // traverse either Updates or children<> each time to get  the deterministic
9497980099aSAlina Sbirlea   // order, and drop the usage of EdgeCount. This alternate approach would still
9507980099aSAlina Sbirlea   // require querying the maps for each predecessor, and children<> call has
9517980099aSAlina Sbirlea   // additional computation inside for creating the snapshot-graph predecessors.
9527980099aSAlina Sbirlea   // As such, we favor using a little additional storage and less compute time.
9537980099aSAlina Sbirlea   // This decision can be revisited if we find the alternative more favorable.
9547980099aSAlina Sbirlea 
9557980099aSAlina Sbirlea   struct PredInfo {
9567980099aSAlina Sbirlea     SmallSetVector<BasicBlock *, 2> Added;
9577980099aSAlina Sbirlea     SmallSetVector<BasicBlock *, 2> Prev;
9587980099aSAlina Sbirlea   };
9597980099aSAlina Sbirlea   SmallDenseMap<BasicBlock *, PredInfo> PredMap;
9607980099aSAlina Sbirlea 
961*601b3a13SKazu Hirata   for (const auto &Edge : Updates) {
9627980099aSAlina Sbirlea     BasicBlock *BB = Edge.getTo();
9637980099aSAlina Sbirlea     auto &AddedBlockSet = PredMap[BB].Added;
9647980099aSAlina Sbirlea     AddedBlockSet.insert(Edge.getFrom());
9657980099aSAlina Sbirlea   }
9667980099aSAlina Sbirlea 
9677980099aSAlina Sbirlea   // Store all existing predecessor for each BB, at least one must exist.
9687980099aSAlina Sbirlea   SmallDenseMap<std::pair<BasicBlock *, BasicBlock *>, int> EdgeCountMap;
9697980099aSAlina Sbirlea   SmallPtrSet<BasicBlock *, 2> NewBlocks;
9707980099aSAlina Sbirlea   for (auto &BBPredPair : PredMap) {
9717980099aSAlina Sbirlea     auto *BB = BBPredPair.first;
9727980099aSAlina Sbirlea     const auto &AddedBlockSet = BBPredPair.second.Added;
9737980099aSAlina Sbirlea     auto &PrevBlockSet = BBPredPair.second.Prev;
974f1d4db4fSAlina Sbirlea     for (auto *Pi : GD->template getChildren</*InverseEdge=*/true>(BB)) {
9757980099aSAlina Sbirlea       if (!AddedBlockSet.count(Pi))
9767980099aSAlina Sbirlea         PrevBlockSet.insert(Pi);
9777980099aSAlina Sbirlea       EdgeCountMap[{Pi, BB}]++;
9787980099aSAlina Sbirlea     }
9797980099aSAlina Sbirlea 
9807980099aSAlina Sbirlea     if (PrevBlockSet.empty()) {
9817980099aSAlina Sbirlea       assert(pred_size(BB) == AddedBlockSet.size() && "Duplicate edges added.");
9827980099aSAlina Sbirlea       LLVM_DEBUG(
9837980099aSAlina Sbirlea           dbgs()
9847980099aSAlina Sbirlea           << "Adding a predecessor to a block with no predecessors. "
9857980099aSAlina Sbirlea              "This must be an edge added to a new, likely cloned, block. "
9867980099aSAlina Sbirlea              "Its memory accesses must be already correct, assuming completed "
9877980099aSAlina Sbirlea              "via the updateExitBlocksForClonedLoop API. "
9887980099aSAlina Sbirlea              "Assert a single such edge is added so no phi addition or "
9897980099aSAlina Sbirlea              "additional processing is required.\n");
9907980099aSAlina Sbirlea       assert(AddedBlockSet.size() == 1 &&
9917980099aSAlina Sbirlea              "Can only handle adding one predecessor to a new block.");
9927980099aSAlina Sbirlea       // Need to remove new blocks from PredMap. Remove below to not invalidate
9937980099aSAlina Sbirlea       // iterator here.
9947980099aSAlina Sbirlea       NewBlocks.insert(BB);
9957980099aSAlina Sbirlea     }
9967980099aSAlina Sbirlea   }
9977980099aSAlina Sbirlea   // Nothing to process for new/cloned blocks.
9987980099aSAlina Sbirlea   for (auto *BB : NewBlocks)
9997980099aSAlina Sbirlea     PredMap.erase(BB);
10007980099aSAlina Sbirlea 
10017980099aSAlina Sbirlea   SmallVector<BasicBlock *, 16> BlocksWithDefsToReplace;
1002cb4ed8a7SAlina Sbirlea   SmallVector<WeakVH, 8> InsertedPhis;
10037980099aSAlina Sbirlea 
10047980099aSAlina Sbirlea   // First create MemoryPhis in all blocks that don't have one. Create in the
10057980099aSAlina Sbirlea   // order found in Updates, not in PredMap, to get deterministic numbering.
1006*601b3a13SKazu Hirata   for (const auto &Edge : Updates) {
10077980099aSAlina Sbirlea     BasicBlock *BB = Edge.getTo();
10087980099aSAlina Sbirlea     if (PredMap.count(BB) && !MSSA->getMemoryAccess(BB))
1009cb4ed8a7SAlina Sbirlea       InsertedPhis.push_back(MSSA->createMemoryPhi(BB));
10107980099aSAlina Sbirlea   }
10117980099aSAlina Sbirlea 
10127980099aSAlina Sbirlea   // Now we'll fill in the MemoryPhis with the right incoming values.
10137980099aSAlina Sbirlea   for (auto &BBPredPair : PredMap) {
10147980099aSAlina Sbirlea     auto *BB = BBPredPair.first;
10157980099aSAlina Sbirlea     const auto &PrevBlockSet = BBPredPair.second.Prev;
10167980099aSAlina Sbirlea     const auto &AddedBlockSet = BBPredPair.second.Added;
10177980099aSAlina Sbirlea     assert(!PrevBlockSet.empty() &&
10187980099aSAlina Sbirlea            "At least one previous predecessor must exist.");
10197980099aSAlina Sbirlea 
10207980099aSAlina Sbirlea     // TODO: if this becomes a bottleneck, we can save on GetLastDef calls by
10217980099aSAlina Sbirlea     // keeping this map before the loop. We can reuse already populated entries
10227980099aSAlina Sbirlea     // if an edge is added from the same predecessor to two different blocks,
10237980099aSAlina Sbirlea     // and this does happen in rotate. Note that the map needs to be updated
10247980099aSAlina Sbirlea     // when deleting non-necessary phis below, if the phi is in the map by
10257980099aSAlina Sbirlea     // replacing the value with DefP1.
10267980099aSAlina Sbirlea     SmallDenseMap<BasicBlock *, MemoryAccess *> LastDefAddedPred;
10277980099aSAlina Sbirlea     for (auto *AddedPred : AddedBlockSet) {
10287980099aSAlina Sbirlea       auto *DefPn = GetLastDef(AddedPred);
10297980099aSAlina Sbirlea       assert(DefPn != nullptr && "Unable to find last definition.");
10307980099aSAlina Sbirlea       LastDefAddedPred[AddedPred] = DefPn;
10317980099aSAlina Sbirlea     }
10327980099aSAlina Sbirlea 
10337980099aSAlina Sbirlea     MemoryPhi *NewPhi = MSSA->getMemoryAccess(BB);
10347980099aSAlina Sbirlea     // If Phi is not empty, add an incoming edge from each added pred. Must
10357980099aSAlina Sbirlea     // still compute blocks with defs to replace for this block below.
10367980099aSAlina Sbirlea     if (NewPhi->getNumOperands()) {
10377980099aSAlina Sbirlea       for (auto *Pred : AddedBlockSet) {
10387980099aSAlina Sbirlea         auto *LastDefForPred = LastDefAddedPred[Pred];
10397980099aSAlina Sbirlea         for (int I = 0, E = EdgeCountMap[{Pred, BB}]; I < E; ++I)
10407980099aSAlina Sbirlea           NewPhi->addIncoming(LastDefForPred, Pred);
10417980099aSAlina Sbirlea       }
10427980099aSAlina Sbirlea     } else {
10437980099aSAlina Sbirlea       // Pick any existing predecessor and get its definition. All other
10447980099aSAlina Sbirlea       // existing predecessors should have the same one, since no phi existed.
10457980099aSAlina Sbirlea       auto *P1 = *PrevBlockSet.begin();
10467980099aSAlina Sbirlea       MemoryAccess *DefP1 = GetLastDef(P1);
10477980099aSAlina Sbirlea 
10487980099aSAlina Sbirlea       // Check DefP1 against all Defs in LastDefPredPair. If all the same,
10497980099aSAlina Sbirlea       // nothing to add.
10507980099aSAlina Sbirlea       bool InsertPhi = false;
10517980099aSAlina Sbirlea       for (auto LastDefPredPair : LastDefAddedPred)
10527980099aSAlina Sbirlea         if (DefP1 != LastDefPredPair.second) {
10537980099aSAlina Sbirlea           InsertPhi = true;
10547980099aSAlina Sbirlea           break;
10557980099aSAlina Sbirlea         }
10567980099aSAlina Sbirlea       if (!InsertPhi) {
10577980099aSAlina Sbirlea         // Since NewPhi may be used in other newly added Phis, replace all uses
10587980099aSAlina Sbirlea         // of NewPhi with the definition coming from all predecessors (DefP1),
10597980099aSAlina Sbirlea         // before deleting it.
10607980099aSAlina Sbirlea         NewPhi->replaceAllUsesWith(DefP1);
10617980099aSAlina Sbirlea         removeMemoryAccess(NewPhi);
10627980099aSAlina Sbirlea         continue;
10637980099aSAlina Sbirlea       }
10647980099aSAlina Sbirlea 
10657980099aSAlina Sbirlea       // Update Phi with new values for new predecessors and old value for all
10667980099aSAlina Sbirlea       // other predecessors. Since AddedBlockSet and PrevBlockSet are ordered
10677980099aSAlina Sbirlea       // sets, the order of entries in NewPhi is deterministic.
10687980099aSAlina Sbirlea       for (auto *Pred : AddedBlockSet) {
10697980099aSAlina Sbirlea         auto *LastDefForPred = LastDefAddedPred[Pred];
10707980099aSAlina Sbirlea         for (int I = 0, E = EdgeCountMap[{Pred, BB}]; I < E; ++I)
10717980099aSAlina Sbirlea           NewPhi->addIncoming(LastDefForPred, Pred);
10727980099aSAlina Sbirlea       }
10737980099aSAlina Sbirlea       for (auto *Pred : PrevBlockSet)
10747980099aSAlina Sbirlea         for (int I = 0, E = EdgeCountMap[{Pred, BB}]; I < E; ++I)
10757980099aSAlina Sbirlea           NewPhi->addIncoming(DefP1, Pred);
10767980099aSAlina Sbirlea     }
10777980099aSAlina Sbirlea 
10787980099aSAlina Sbirlea     // Get all blocks that used to dominate BB and no longer do after adding
10797980099aSAlina Sbirlea     // AddedBlockSet, where PrevBlockSet are the previously known predecessors.
10807980099aSAlina Sbirlea     assert(DT.getNode(BB)->getIDom() && "BB does not have valid idom");
10817980099aSAlina Sbirlea     BasicBlock *PrevIDom = FindNearestCommonDominator(PrevBlockSet);
10827980099aSAlina Sbirlea     assert(PrevIDom && "Previous IDom should exists");
10837980099aSAlina Sbirlea     BasicBlock *NewIDom = DT.getNode(BB)->getIDom()->getBlock();
10847980099aSAlina Sbirlea     assert(NewIDom && "BB should have a new valid idom");
10857980099aSAlina Sbirlea     assert(DT.dominates(NewIDom, PrevIDom) &&
10867980099aSAlina Sbirlea            "New idom should dominate old idom");
10877980099aSAlina Sbirlea     GetNoLongerDomBlocks(PrevIDom, NewIDom, BlocksWithDefsToReplace);
10887980099aSAlina Sbirlea   }
10897980099aSAlina Sbirlea 
1090109d2ea1SAlina Sbirlea   tryRemoveTrivialPhis(InsertedPhis);
1091109d2ea1SAlina Sbirlea   // Create the set of blocks that now have a definition. We'll use this to
1092109d2ea1SAlina Sbirlea   // compute IDF and add Phis there next.
1093109d2ea1SAlina Sbirlea   SmallVector<BasicBlock *, 8> BlocksToProcess;
1094109d2ea1SAlina Sbirlea   for (auto &VH : InsertedPhis)
1095109d2ea1SAlina Sbirlea     if (auto *MPhi = cast_or_null<MemoryPhi>(VH))
1096109d2ea1SAlina Sbirlea       BlocksToProcess.push_back(MPhi->getBlock());
1097109d2ea1SAlina Sbirlea 
10987980099aSAlina Sbirlea   // Compute IDF and add Phis in all IDF blocks that do not have one.
10997980099aSAlina Sbirlea   SmallVector<BasicBlock *, 32> IDFBlocks;
11007980099aSAlina Sbirlea   if (!BlocksToProcess.empty()) {
1101238b8e62SAlina Sbirlea     ForwardIDFCalculator IDFs(DT, GD);
11027980099aSAlina Sbirlea     SmallPtrSet<BasicBlock *, 16> DefiningBlocks(BlocksToProcess.begin(),
11037980099aSAlina Sbirlea                                                  BlocksToProcess.end());
11047980099aSAlina Sbirlea     IDFs.setDefiningBlocks(DefiningBlocks);
11057980099aSAlina Sbirlea     IDFs.calculate(IDFBlocks);
110605f77803SAlina Sbirlea 
110705f77803SAlina Sbirlea     SmallSetVector<MemoryPhi *, 4> PhisToFill;
110805f77803SAlina Sbirlea     // First create all needed Phis.
110905f77803SAlina Sbirlea     for (auto *BBIDF : IDFBlocks)
111005f77803SAlina Sbirlea       if (!MSSA->getMemoryAccess(BBIDF)) {
111105f77803SAlina Sbirlea         auto *IDFPhi = MSSA->createMemoryPhi(BBIDF);
111205f77803SAlina Sbirlea         InsertedPhis.push_back(IDFPhi);
111305f77803SAlina Sbirlea         PhisToFill.insert(IDFPhi);
111405f77803SAlina Sbirlea       }
111505f77803SAlina Sbirlea     // Then update or insert their correct incoming values.
11167980099aSAlina Sbirlea     for (auto *BBIDF : IDFBlocks) {
111705f77803SAlina Sbirlea       auto *IDFPhi = MSSA->getMemoryAccess(BBIDF);
111805f77803SAlina Sbirlea       assert(IDFPhi && "Phi must exist");
111905f77803SAlina Sbirlea       if (!PhisToFill.count(IDFPhi)) {
11207980099aSAlina Sbirlea         // Update existing Phi.
11217980099aSAlina Sbirlea         // FIXME: some updates may be redundant, try to optimize and skip some.
11227980099aSAlina Sbirlea         for (unsigned I = 0, E = IDFPhi->getNumIncomingValues(); I < E; ++I)
11237980099aSAlina Sbirlea           IDFPhi->setIncomingValue(I, GetLastDef(IDFPhi->getIncomingBlock(I)));
11247980099aSAlina Sbirlea       } else {
1125f1d4db4fSAlina Sbirlea         for (auto *Pi : GD->template getChildren</*InverseEdge=*/true>(BBIDF))
11267980099aSAlina Sbirlea           IDFPhi->addIncoming(GetLastDef(Pi), Pi);
11277980099aSAlina Sbirlea       }
11287980099aSAlina Sbirlea     }
11297980099aSAlina Sbirlea   }
11307980099aSAlina Sbirlea 
11317980099aSAlina Sbirlea   // Now for all defs in BlocksWithDefsToReplace, if there are uses they no
11327980099aSAlina Sbirlea   // longer dominate, replace those with the closest dominating def.
11337980099aSAlina Sbirlea   // This will also update optimized accesses, as they're also uses.
11347980099aSAlina Sbirlea   for (auto *BlockWithDefsToReplace : BlocksWithDefsToReplace) {
11357980099aSAlina Sbirlea     if (auto DefsList = MSSA->getWritableBlockDefs(BlockWithDefsToReplace)) {
11367980099aSAlina Sbirlea       for (auto &DefToReplaceUses : *DefsList) {
11377980099aSAlina Sbirlea         BasicBlock *DominatingBlock = DefToReplaceUses.getBlock();
113887e53a0aSKazu Hirata         for (Use &U : llvm::make_early_inc_range(DefToReplaceUses.uses())) {
1139b635964aSSimon Pilgrim           MemoryAccess *Usr = cast<MemoryAccess>(U.getUser());
11407980099aSAlina Sbirlea           if (MemoryPhi *UsrPhi = dyn_cast<MemoryPhi>(Usr)) {
11417980099aSAlina Sbirlea             BasicBlock *DominatedBlock = UsrPhi->getIncomingBlock(U);
11427980099aSAlina Sbirlea             if (!DT.dominates(DominatingBlock, DominatedBlock))
11437980099aSAlina Sbirlea               U.set(GetLastDef(DominatedBlock));
11447980099aSAlina Sbirlea           } else {
11457980099aSAlina Sbirlea             BasicBlock *DominatedBlock = Usr->getBlock();
11467980099aSAlina Sbirlea             if (!DT.dominates(DominatingBlock, DominatedBlock)) {
11477980099aSAlina Sbirlea               if (auto *DomBlPhi = MSSA->getMemoryAccess(DominatedBlock))
11487980099aSAlina Sbirlea                 U.set(DomBlPhi);
11497980099aSAlina Sbirlea               else {
11507980099aSAlina Sbirlea                 auto *IDom = DT.getNode(DominatedBlock)->getIDom();
11517980099aSAlina Sbirlea                 assert(IDom && "Block must have a valid IDom.");
11527980099aSAlina Sbirlea                 U.set(GetLastDef(IDom->getBlock()));
11537980099aSAlina Sbirlea               }
11547980099aSAlina Sbirlea               cast<MemoryUseOrDef>(Usr)->resetOptimized();
11557980099aSAlina Sbirlea             }
11567980099aSAlina Sbirlea           }
11577980099aSAlina Sbirlea         }
11587980099aSAlina Sbirlea       }
11597980099aSAlina Sbirlea     }
11607980099aSAlina Sbirlea   }
1161cb4ed8a7SAlina Sbirlea   tryRemoveTrivialPhis(InsertedPhis);
11627980099aSAlina Sbirlea }
11637980099aSAlina Sbirlea 
1164554dcd8cSDaniel Berlin // Move What before Where in the MemorySSA IR.
1165554dcd8cSDaniel Berlin template <class WhereType>
moveTo(MemoryUseOrDef * What,BasicBlock * BB,WhereType Where)1166554dcd8cSDaniel Berlin void MemorySSAUpdater::moveTo(MemoryUseOrDef *What, BasicBlock *BB,
1167554dcd8cSDaniel Berlin                               WhereType Where) {
116843af17beSZhaoshi Zheng   // Mark MemoryPhi users of What not to be optimized.
116943af17beSZhaoshi Zheng   for (auto *U : What->users())
1170e7cdb7edSGeorge Burgess IV     if (MemoryPhi *PhiUser = dyn_cast<MemoryPhi>(U))
117143af17beSZhaoshi Zheng       NonOptPhis.insert(PhiUser);
117243af17beSZhaoshi Zheng 
1173554dcd8cSDaniel Berlin   // Replace all our users with our defining access.
1174554dcd8cSDaniel Berlin   What->replaceAllUsesWith(What->getDefiningAccess());
1175554dcd8cSDaniel Berlin 
1176554dcd8cSDaniel Berlin   // Let MemorySSA take care of moving it around in the lists.
1177554dcd8cSDaniel Berlin   MSSA->moveTo(What, BB, Where);
1178554dcd8cSDaniel Berlin 
1179554dcd8cSDaniel Berlin   // Now reinsert it into the IR and do whatever fixups needed.
1180554dcd8cSDaniel Berlin   if (auto *MD = dyn_cast<MemoryDef>(What))
11811a3fdaf6SAlina Sbirlea     insertDef(MD, /*RenameUses=*/true);
1182554dcd8cSDaniel Berlin   else
11831a3fdaf6SAlina Sbirlea     insertUse(cast<MemoryUse>(What), /*RenameUses=*/true);
118443af17beSZhaoshi Zheng 
118543af17beSZhaoshi Zheng   // Clear dangling pointers. We added all MemoryPhi users, but not all
118643af17beSZhaoshi Zheng   // of them are removed by fixupDefs().
118743af17beSZhaoshi Zheng   NonOptPhis.clear();
1188554dcd8cSDaniel Berlin }
1189554dcd8cSDaniel Berlin 
1190554dcd8cSDaniel Berlin // Move What before Where in the MemorySSA IR.
moveBefore(MemoryUseOrDef * What,MemoryUseOrDef * Where)1191554dcd8cSDaniel Berlin void MemorySSAUpdater::moveBefore(MemoryUseOrDef *What, MemoryUseOrDef *Where) {
1192554dcd8cSDaniel Berlin   moveTo(What, Where->getBlock(), Where->getIterator());
1193554dcd8cSDaniel Berlin }
1194554dcd8cSDaniel Berlin 
1195554dcd8cSDaniel Berlin // Move What after Where in the MemorySSA IR.
moveAfter(MemoryUseOrDef * What,MemoryUseOrDef * Where)1196554dcd8cSDaniel Berlin void MemorySSAUpdater::moveAfter(MemoryUseOrDef *What, MemoryUseOrDef *Where) {
1197554dcd8cSDaniel Berlin   moveTo(What, Where->getBlock(), ++Where->getIterator());
1198554dcd8cSDaniel Berlin }
1199554dcd8cSDaniel Berlin 
moveToPlace(MemoryUseOrDef * What,BasicBlock * BB,MemorySSA::InsertionPlace Where)1200554dcd8cSDaniel Berlin void MemorySSAUpdater::moveToPlace(MemoryUseOrDef *What, BasicBlock *BB,
1201554dcd8cSDaniel Berlin                                    MemorySSA::InsertionPlace Where) {
12025c5cf899SAlina Sbirlea   if (Where != MemorySSA::InsertionPlace::BeforeTerminator)
1203554dcd8cSDaniel Berlin     return moveTo(What, BB, Where);
12045c5cf899SAlina Sbirlea 
12055c5cf899SAlina Sbirlea   if (auto *Where = MSSA->getMemoryAccess(BB->getTerminator()))
12065c5cf899SAlina Sbirlea     return moveBefore(What, Where);
12075c5cf899SAlina Sbirlea   else
12085c5cf899SAlina Sbirlea     return moveTo(What, BB, MemorySSA::InsertionPlace::End);
1209554dcd8cSDaniel Berlin }
1210554dcd8cSDaniel Berlin 
12110f53355eSAlina Sbirlea // All accesses in To used to be in From. Move to end and update access lists.
moveAllAccesses(BasicBlock * From,BasicBlock * To,Instruction * Start)12120f53355eSAlina Sbirlea void MemorySSAUpdater::moveAllAccesses(BasicBlock *From, BasicBlock *To,
12130f53355eSAlina Sbirlea                                        Instruction *Start) {
12140f53355eSAlina Sbirlea 
12150f53355eSAlina Sbirlea   MemorySSA::AccessList *Accs = MSSA->getWritableBlockAccesses(From);
12160f53355eSAlina Sbirlea   if (!Accs)
12170f53355eSAlina Sbirlea     return;
12180f53355eSAlina Sbirlea 
12197faa14a9SAlina Sbirlea   assert(Start->getParent() == To && "Incorrect Start instruction");
12200f53355eSAlina Sbirlea   MemoryAccess *FirstInNew = nullptr;
12210f53355eSAlina Sbirlea   for (Instruction &I : make_range(Start->getIterator(), To->end()))
12220f53355eSAlina Sbirlea     if ((FirstInNew = MSSA->getMemoryAccess(&I)))
12230f53355eSAlina Sbirlea       break;
12247faa14a9SAlina Sbirlea   if (FirstInNew) {
12250f53355eSAlina Sbirlea     auto *MUD = cast<MemoryUseOrDef>(FirstInNew);
12260f53355eSAlina Sbirlea     do {
12270f53355eSAlina Sbirlea       auto NextIt = ++MUD->getIterator();
12280f53355eSAlina Sbirlea       MemoryUseOrDef *NextMUD = (!Accs || NextIt == Accs->end())
12290f53355eSAlina Sbirlea                                     ? nullptr
12300f53355eSAlina Sbirlea                                     : cast<MemoryUseOrDef>(&*NextIt);
12310f53355eSAlina Sbirlea       MSSA->moveTo(MUD, To, MemorySSA::End);
12327faa14a9SAlina Sbirlea       // Moving MUD from Accs in the moveTo above, may delete Accs, so we need
12337faa14a9SAlina Sbirlea       // to retrieve it again.
12340f53355eSAlina Sbirlea       Accs = MSSA->getWritableBlockAccesses(From);
12350f53355eSAlina Sbirlea       MUD = NextMUD;
12360f53355eSAlina Sbirlea     } while (MUD);
12370f53355eSAlina Sbirlea   }
12380f53355eSAlina Sbirlea 
12397faa14a9SAlina Sbirlea   // If all accesses were moved and only a trivial Phi remains, we try to remove
12407faa14a9SAlina Sbirlea   // that Phi. This is needed when From is going to be deleted.
12417faa14a9SAlina Sbirlea   auto *Defs = MSSA->getWritableBlockDefs(From);
12427faa14a9SAlina Sbirlea   if (Defs && !Defs->empty())
12437faa14a9SAlina Sbirlea     if (auto *Phi = dyn_cast<MemoryPhi>(&*Defs->begin()))
12447faa14a9SAlina Sbirlea       tryRemoveTrivialPhi(Phi);
12457faa14a9SAlina Sbirlea }
12467faa14a9SAlina Sbirlea 
moveAllAfterSpliceBlocks(BasicBlock * From,BasicBlock * To,Instruction * Start)12470f53355eSAlina Sbirlea void MemorySSAUpdater::moveAllAfterSpliceBlocks(BasicBlock *From,
12480f53355eSAlina Sbirlea                                                 BasicBlock *To,
12490f53355eSAlina Sbirlea                                                 Instruction *Start) {
12500f53355eSAlina Sbirlea   assert(MSSA->getBlockAccesses(To) == nullptr &&
12510f53355eSAlina Sbirlea          "To block is expected to be free of MemoryAccesses.");
12520f53355eSAlina Sbirlea   moveAllAccesses(From, To, Start);
12530f53355eSAlina Sbirlea   for (BasicBlock *Succ : successors(To))
12540f53355eSAlina Sbirlea     if (MemoryPhi *MPhi = MSSA->getMemoryAccess(Succ))
12550f53355eSAlina Sbirlea       MPhi->setIncomingBlock(MPhi->getBasicBlockIndex(From), To);
12560f53355eSAlina Sbirlea }
12570f53355eSAlina Sbirlea 
moveAllAfterMergeBlocks(BasicBlock * From,BasicBlock * To,Instruction * Start)12580f53355eSAlina Sbirlea void MemorySSAUpdater::moveAllAfterMergeBlocks(BasicBlock *From, BasicBlock *To,
12590f53355eSAlina Sbirlea                                                Instruction *Start) {
12607faa14a9SAlina Sbirlea   assert(From->getUniquePredecessor() == To &&
12610f53355eSAlina Sbirlea          "From block is expected to have a single predecessor (To).");
12620f53355eSAlina Sbirlea   moveAllAccesses(From, To, Start);
12630f53355eSAlina Sbirlea   for (BasicBlock *Succ : successors(From))
12640f53355eSAlina Sbirlea     if (MemoryPhi *MPhi = MSSA->getMemoryAccess(Succ))
12650f53355eSAlina Sbirlea       MPhi->setIncomingBlock(MPhi->getBasicBlockIndex(From), To);
12660f53355eSAlina Sbirlea }
12670f53355eSAlina Sbirlea 
wireOldPredecessorsToNewImmediatePredecessor(BasicBlock * Old,BasicBlock * New,ArrayRef<BasicBlock * > Preds,bool IdenticalEdgesWereMerged)126820c29625SAlina Sbirlea void MemorySSAUpdater::wireOldPredecessorsToNewImmediatePredecessor(
1269f98c2c5eSAlina Sbirlea     BasicBlock *Old, BasicBlock *New, ArrayRef<BasicBlock *> Preds,
1270f98c2c5eSAlina Sbirlea     bool IdenticalEdgesWereMerged) {
127120c29625SAlina Sbirlea   assert(!MSSA->getWritableBlockAccesses(New) &&
127220c29625SAlina Sbirlea          "Access list should be null for a new block.");
127320c29625SAlina Sbirlea   MemoryPhi *Phi = MSSA->getMemoryAccess(Old);
127420c29625SAlina Sbirlea   if (!Phi)
127520c29625SAlina Sbirlea     return;
12764de31bbaSVedant Kumar   if (Old->hasNPredecessors(1)) {
127720c29625SAlina Sbirlea     assert(pred_size(New) == Preds.size() &&
127820c29625SAlina Sbirlea            "Should have moved all predecessors.");
127920c29625SAlina Sbirlea     MSSA->moveTo(Phi, New, MemorySSA::Beginning);
128020c29625SAlina Sbirlea   } else {
128120c29625SAlina Sbirlea     assert(!Preds.empty() && "Must be moving at least one predecessor to the "
128220c29625SAlina Sbirlea                              "new immediate predecessor.");
128320c29625SAlina Sbirlea     MemoryPhi *NewPhi = MSSA->createMemoryPhi(New);
128420c29625SAlina Sbirlea     SmallPtrSet<BasicBlock *, 16> PredsSet(Preds.begin(), Preds.end());
1285f98c2c5eSAlina Sbirlea     // Currently only support the case of removing a single incoming edge when
1286f98c2c5eSAlina Sbirlea     // identical edges were not merged.
1287f98c2c5eSAlina Sbirlea     if (!IdenticalEdgesWereMerged)
1288f98c2c5eSAlina Sbirlea       assert(PredsSet.size() == Preds.size() &&
1289f98c2c5eSAlina Sbirlea              "If identical edges were not merged, we cannot have duplicate "
1290f98c2c5eSAlina Sbirlea              "blocks in the predecessors");
129120c29625SAlina Sbirlea     Phi->unorderedDeleteIncomingIf([&](MemoryAccess *MA, BasicBlock *B) {
129220c29625SAlina Sbirlea       if (PredsSet.count(B)) {
129320c29625SAlina Sbirlea         NewPhi->addIncoming(MA, B);
1294f98c2c5eSAlina Sbirlea         if (!IdenticalEdgesWereMerged)
1295f98c2c5eSAlina Sbirlea           PredsSet.erase(B);
129620c29625SAlina Sbirlea         return true;
129720c29625SAlina Sbirlea       }
129820c29625SAlina Sbirlea       return false;
129920c29625SAlina Sbirlea     });
130020c29625SAlina Sbirlea     Phi->addIncoming(NewPhi, New);
13012863721fSAlina Sbirlea     tryRemoveTrivialPhi(NewPhi);
130220c29625SAlina Sbirlea   }
130320c29625SAlina Sbirlea }
130420c29625SAlina Sbirlea 
removeMemoryAccess(MemoryAccess * MA,bool OptimizePhis)1305240a90a5SAlina Sbirlea void MemorySSAUpdater::removeMemoryAccess(MemoryAccess *MA, bool OptimizePhis) {
1306554dcd8cSDaniel Berlin   assert(!MSSA->isLiveOnEntryDef(MA) &&
1307554dcd8cSDaniel Berlin          "Trying to remove the live on entry def");
1308554dcd8cSDaniel Berlin   // We can only delete phi nodes if they have no uses, or we can replace all
1309554dcd8cSDaniel Berlin   // uses with a single definition.
1310554dcd8cSDaniel Berlin   MemoryAccess *NewDefTarget = nullptr;
1311554dcd8cSDaniel Berlin   if (MemoryPhi *MP = dyn_cast<MemoryPhi>(MA)) {
1312554dcd8cSDaniel Berlin     // Note that it is sufficient to know that all edges of the phi node have
1313554dcd8cSDaniel Berlin     // the same argument.  If they do, by the definition of dominance frontiers
1314554dcd8cSDaniel Berlin     // (which we used to place this phi), that argument must dominate this phi,
1315554dcd8cSDaniel Berlin     // and thus, must dominate the phi's uses, and so we will not hit the assert
1316554dcd8cSDaniel Berlin     // below.
1317554dcd8cSDaniel Berlin     NewDefTarget = onlySingleValue(MP);
1318554dcd8cSDaniel Berlin     assert((NewDefTarget || MP->use_empty()) &&
1319554dcd8cSDaniel Berlin            "We can't delete this memory phi");
1320554dcd8cSDaniel Berlin   } else {
1321554dcd8cSDaniel Berlin     NewDefTarget = cast<MemoryUseOrDef>(MA)->getDefiningAccess();
1322554dcd8cSDaniel Berlin   }
1323554dcd8cSDaniel Berlin 
1324240a90a5SAlina Sbirlea   SmallSetVector<MemoryPhi *, 4> PhisToCheck;
1325240a90a5SAlina Sbirlea 
1326554dcd8cSDaniel Berlin   // Re-point the uses at our defining access
1327554dcd8cSDaniel Berlin   if (!isa<MemoryUse>(MA) && !MA->use_empty()) {
1328554dcd8cSDaniel Berlin     // Reset optimized on users of this store, and reset the uses.
1329554dcd8cSDaniel Berlin     // A few notes:
1330554dcd8cSDaniel Berlin     // 1. This is a slightly modified version of RAUW to avoid walking the
1331554dcd8cSDaniel Berlin     // uses twice here.
1332554dcd8cSDaniel Berlin     // 2. If we wanted to be complete, we would have to reset the optimized
1333554dcd8cSDaniel Berlin     // flags on users of phi nodes if doing the below makes a phi node have all
1334554dcd8cSDaniel Berlin     // the same arguments. Instead, we prefer users to removeMemoryAccess those
1335554dcd8cSDaniel Berlin     // phi nodes, because doing it here would be N^3.
1336554dcd8cSDaniel Berlin     if (MA->hasValueHandle())
1337554dcd8cSDaniel Berlin       ValueHandleBase::ValueIsRAUWd(MA, NewDefTarget);
1338554dcd8cSDaniel Berlin     // Note: We assume MemorySSA is not used in metadata since it's not really
1339554dcd8cSDaniel Berlin     // part of the IR.
1340554dcd8cSDaniel Berlin 
1341344a3d0bSAlina Sbirlea     assert(NewDefTarget != MA && "Going into an infinite loop");
1342554dcd8cSDaniel Berlin     while (!MA->use_empty()) {
1343554dcd8cSDaniel Berlin       Use &U = *MA->use_begin();
1344554dcd8cSDaniel Berlin       if (auto *MUD = dyn_cast<MemoryUseOrDef>(U.getUser()))
1345554dcd8cSDaniel Berlin         MUD->resetOptimized();
1346240a90a5SAlina Sbirlea       if (OptimizePhis)
1347240a90a5SAlina Sbirlea         if (MemoryPhi *MP = dyn_cast<MemoryPhi>(U.getUser()))
1348240a90a5SAlina Sbirlea           PhisToCheck.insert(MP);
1349554dcd8cSDaniel Berlin       U.set(NewDefTarget);
1350554dcd8cSDaniel Berlin     }
1351554dcd8cSDaniel Berlin   }
1352554dcd8cSDaniel Berlin 
1353554dcd8cSDaniel Berlin   // The call below to erase will destroy MA, so we can't change the order we
1354554dcd8cSDaniel Berlin   // are doing things here
1355554dcd8cSDaniel Berlin   MSSA->removeFromLookups(MA);
1356554dcd8cSDaniel Berlin   MSSA->removeFromLists(MA);
1357240a90a5SAlina Sbirlea 
1358240a90a5SAlina Sbirlea   // Optionally optimize Phi uses. This will recursively remove trivial phis.
1359240a90a5SAlina Sbirlea   if (!PhisToCheck.empty()) {
1360240a90a5SAlina Sbirlea     SmallVector<WeakVH, 16> PhisToOptimize{PhisToCheck.begin(),
1361240a90a5SAlina Sbirlea                                            PhisToCheck.end()};
1362240a90a5SAlina Sbirlea     PhisToCheck.clear();
1363240a90a5SAlina Sbirlea 
1364240a90a5SAlina Sbirlea     unsigned PhisSize = PhisToOptimize.size();
1365240a90a5SAlina Sbirlea     while (PhisSize-- > 0)
1366240a90a5SAlina Sbirlea       if (MemoryPhi *MP =
13672863721fSAlina Sbirlea               cast_or_null<MemoryPhi>(PhisToOptimize.pop_back_val()))
13682863721fSAlina Sbirlea         tryRemoveTrivialPhi(MP);
1369240a90a5SAlina Sbirlea   }
1370554dcd8cSDaniel Berlin }
1371554dcd8cSDaniel Berlin 
removeBlocks(const SmallSetVector<BasicBlock *,8> & DeadBlocks)1372da1e80feSAlina Sbirlea void MemorySSAUpdater::removeBlocks(
1373db101864SAlina Sbirlea     const SmallSetVector<BasicBlock *, 8> &DeadBlocks) {
1374da1e80feSAlina Sbirlea   // First delete all uses of BB in MemoryPhis.
1375da1e80feSAlina Sbirlea   for (BasicBlock *BB : DeadBlocks) {
1376edb12a83SChandler Carruth     Instruction *TI = BB->getTerminator();
1377da1e80feSAlina Sbirlea     assert(TI && "Basic block expected to have a terminator instruction");
137896fc1de7SChandler Carruth     for (BasicBlock *Succ : successors(TI))
1379da1e80feSAlina Sbirlea       if (!DeadBlocks.count(Succ))
1380da1e80feSAlina Sbirlea         if (MemoryPhi *MP = MSSA->getMemoryAccess(Succ)) {
1381da1e80feSAlina Sbirlea           MP->unorderedDeleteIncomingBlock(BB);
13822863721fSAlina Sbirlea           tryRemoveTrivialPhi(MP);
1383da1e80feSAlina Sbirlea         }
1384da1e80feSAlina Sbirlea     // Drop all references of all accesses in BB
1385da1e80feSAlina Sbirlea     if (MemorySSA::AccessList *Acc = MSSA->getWritableBlockAccesses(BB))
1386da1e80feSAlina Sbirlea       for (MemoryAccess &MA : *Acc)
1387da1e80feSAlina Sbirlea         MA.dropAllReferences();
1388da1e80feSAlina Sbirlea   }
1389da1e80feSAlina Sbirlea 
1390da1e80feSAlina Sbirlea   // Next, delete all memory accesses in each block
1391da1e80feSAlina Sbirlea   for (BasicBlock *BB : DeadBlocks) {
1392da1e80feSAlina Sbirlea     MemorySSA::AccessList *Acc = MSSA->getWritableBlockAccesses(BB);
1393da1e80feSAlina Sbirlea     if (!Acc)
1394da1e80feSAlina Sbirlea       continue;
1395896d0e1aSKazu Hirata     for (MemoryAccess &MA : llvm::make_early_inc_range(*Acc)) {
1396896d0e1aSKazu Hirata       MSSA->removeFromLookups(&MA);
1397896d0e1aSKazu Hirata       MSSA->removeFromLists(&MA);
1398da1e80feSAlina Sbirlea     }
1399da1e80feSAlina Sbirlea   }
1400da1e80feSAlina Sbirlea }
1401da1e80feSAlina Sbirlea 
tryRemoveTrivialPhis(ArrayRef<WeakVH> UpdatedPHIs)1402151ab484SAlina Sbirlea void MemorySSAUpdater::tryRemoveTrivialPhis(ArrayRef<WeakVH> UpdatedPHIs) {
1403*601b3a13SKazu Hirata   for (const auto &VH : UpdatedPHIs)
14042863721fSAlina Sbirlea     if (auto *MPhi = cast_or_null<MemoryPhi>(VH))
14052863721fSAlina Sbirlea       tryRemoveTrivialPhi(MPhi);
1406151ab484SAlina Sbirlea }
1407151ab484SAlina Sbirlea 
changeToUnreachable(const Instruction * I)1408f31eba64SAlina Sbirlea void MemorySSAUpdater::changeToUnreachable(const Instruction *I) {
1409f31eba64SAlina Sbirlea   const BasicBlock *BB = I->getParent();
1410f31eba64SAlina Sbirlea   // Remove memory accesses in BB for I and all following instructions.
1411f31eba64SAlina Sbirlea   auto BBI = I->getIterator(), BBE = BB->end();
1412f31eba64SAlina Sbirlea   // FIXME: If this becomes too expensive, iterate until the first instruction
1413f31eba64SAlina Sbirlea   // with a memory access, then iterate over MemoryAccesses.
1414f31eba64SAlina Sbirlea   while (BBI != BBE)
1415f31eba64SAlina Sbirlea     removeMemoryAccess(&*(BBI++));
1416f31eba64SAlina Sbirlea   // Update phis in BB's successors to remove BB.
1417f31eba64SAlina Sbirlea   SmallVector<WeakVH, 16> UpdatedPHIs;
1418f31eba64SAlina Sbirlea   for (const BasicBlock *Successor : successors(BB)) {
1419f31eba64SAlina Sbirlea     removeDuplicatePhiEdgesBetween(BB, Successor);
1420f31eba64SAlina Sbirlea     if (MemoryPhi *MPhi = MSSA->getMemoryAccess(Successor)) {
1421f31eba64SAlina Sbirlea       MPhi->unorderedDeleteIncomingBlock(BB);
1422f31eba64SAlina Sbirlea       UpdatedPHIs.push_back(MPhi);
1423f31eba64SAlina Sbirlea     }
1424f31eba64SAlina Sbirlea   }
1425f31eba64SAlina Sbirlea   // Optimize trivial phis.
1426f31eba64SAlina Sbirlea   tryRemoveTrivialPhis(UpdatedPHIs);
1427f31eba64SAlina Sbirlea }
1428f31eba64SAlina Sbirlea 
createMemoryAccessInBB(Instruction * I,MemoryAccess * Definition,const BasicBlock * BB,MemorySSA::InsertionPlace Point)1429554dcd8cSDaniel Berlin MemoryAccess *MemorySSAUpdater::createMemoryAccessInBB(
1430554dcd8cSDaniel Berlin     Instruction *I, MemoryAccess *Definition, const BasicBlock *BB,
1431554dcd8cSDaniel Berlin     MemorySSA::InsertionPlace Point) {
1432554dcd8cSDaniel Berlin   MemoryUseOrDef *NewAccess = MSSA->createDefinedAccess(I, Definition);
1433554dcd8cSDaniel Berlin   MSSA->insertIntoListsForBlock(NewAccess, BB, Point);
1434554dcd8cSDaniel Berlin   return NewAccess;
1435554dcd8cSDaniel Berlin }
1436554dcd8cSDaniel Berlin 
createMemoryAccessBefore(Instruction * I,MemoryAccess * Definition,MemoryUseOrDef * InsertPt)1437554dcd8cSDaniel Berlin MemoryUseOrDef *MemorySSAUpdater::createMemoryAccessBefore(
1438554dcd8cSDaniel Berlin     Instruction *I, MemoryAccess *Definition, MemoryUseOrDef *InsertPt) {
1439554dcd8cSDaniel Berlin   assert(I->getParent() == InsertPt->getBlock() &&
1440554dcd8cSDaniel Berlin          "New and old access must be in the same block");
1441554dcd8cSDaniel Berlin   MemoryUseOrDef *NewAccess = MSSA->createDefinedAccess(I, Definition);
1442554dcd8cSDaniel Berlin   MSSA->insertIntoListsBefore(NewAccess, InsertPt->getBlock(),
1443554dcd8cSDaniel Berlin                               InsertPt->getIterator());
1444554dcd8cSDaniel Berlin   return NewAccess;
1445554dcd8cSDaniel Berlin }
1446554dcd8cSDaniel Berlin 
createMemoryAccessAfter(Instruction * I,MemoryAccess * Definition,MemoryAccess * InsertPt)1447554dcd8cSDaniel Berlin MemoryUseOrDef *MemorySSAUpdater::createMemoryAccessAfter(
1448554dcd8cSDaniel Berlin     Instruction *I, MemoryAccess *Definition, MemoryAccess *InsertPt) {
1449554dcd8cSDaniel Berlin   assert(I->getParent() == InsertPt->getBlock() &&
1450554dcd8cSDaniel Berlin          "New and old access must be in the same block");
1451554dcd8cSDaniel Berlin   MemoryUseOrDef *NewAccess = MSSA->createDefinedAccess(I, Definition);
1452554dcd8cSDaniel Berlin   MSSA->insertIntoListsBefore(NewAccess, InsertPt->getBlock(),
1453554dcd8cSDaniel Berlin                               ++InsertPt->getIterator());
1454554dcd8cSDaniel Berlin   return NewAccess;
1455554dcd8cSDaniel Berlin }
1456