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