Line data Source code
1 : //===- MemorySSA.cpp - Memory SSA Builder ---------------------------------===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 : //
10 : // This file implements the MemorySSA class.
11 : //
12 : //===----------------------------------------------------------------------===//
13 :
14 : #include "llvm/Analysis/MemorySSA.h"
15 : #include "llvm/ADT/DenseMap.h"
16 : #include "llvm/ADT/DenseMapInfo.h"
17 : #include "llvm/ADT/DenseSet.h"
18 : #include "llvm/ADT/DepthFirstIterator.h"
19 : #include "llvm/ADT/Hashing.h"
20 : #include "llvm/ADT/None.h"
21 : #include "llvm/ADT/Optional.h"
22 : #include "llvm/ADT/STLExtras.h"
23 : #include "llvm/ADT/SmallPtrSet.h"
24 : #include "llvm/ADT/SmallVector.h"
25 : #include "llvm/ADT/iterator.h"
26 : #include "llvm/ADT/iterator_range.h"
27 : #include "llvm/Analysis/AliasAnalysis.h"
28 : #include "llvm/Analysis/IteratedDominanceFrontier.h"
29 : #include "llvm/Analysis/MemoryLocation.h"
30 : #include "llvm/Config/llvm-config.h"
31 : #include "llvm/IR/AssemblyAnnotationWriter.h"
32 : #include "llvm/IR/BasicBlock.h"
33 : #include "llvm/IR/CallSite.h"
34 : #include "llvm/IR/Dominators.h"
35 : #include "llvm/IR/Function.h"
36 : #include "llvm/IR/Instruction.h"
37 : #include "llvm/IR/Instructions.h"
38 : #include "llvm/IR/IntrinsicInst.h"
39 : #include "llvm/IR/Intrinsics.h"
40 : #include "llvm/IR/LLVMContext.h"
41 : #include "llvm/IR/PassManager.h"
42 : #include "llvm/IR/Use.h"
43 : #include "llvm/Pass.h"
44 : #include "llvm/Support/AtomicOrdering.h"
45 : #include "llvm/Support/Casting.h"
46 : #include "llvm/Support/CommandLine.h"
47 : #include "llvm/Support/Compiler.h"
48 : #include "llvm/Support/Debug.h"
49 : #include "llvm/Support/ErrorHandling.h"
50 : #include "llvm/Support/FormattedStream.h"
51 : #include "llvm/Support/raw_ostream.h"
52 : #include <algorithm>
53 : #include <cassert>
54 : #include <iterator>
55 : #include <memory>
56 : #include <utility>
57 :
58 : using namespace llvm;
59 :
60 : #define DEBUG_TYPE "memoryssa"
61 :
62 33336 : INITIALIZE_PASS_BEGIN(MemorySSAWrapperPass, "memoryssa", "Memory SSA", false,
63 : true)
64 33336 : INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
65 33336 : INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
66 283951 : INITIALIZE_PASS_END(MemorySSAWrapperPass, "memoryssa", "Memory SSA", false,
67 : true)
68 :
69 10756 : INITIALIZE_PASS_BEGIN(MemorySSAPrinterLegacyPass, "print-memoryssa",
70 : "Memory SSA Printer", false, false)
71 10756 : INITIALIZE_PASS_DEPENDENCY(MemorySSAWrapperPass)
72 21532 : INITIALIZE_PASS_END(MemorySSAPrinterLegacyPass, "print-memoryssa",
73 : "Memory SSA Printer", false, false)
74 :
75 : static cl::opt<unsigned> MaxCheckLimit(
76 : "memssa-check-limit", cl::Hidden, cl::init(100),
77 : cl::desc("The maximum number of stores/phis MemorySSA"
78 : "will consider trying to walk past (default = 100)"));
79 :
80 : // Always verify MemorySSA if expensive checking is enabled.
81 : #ifdef EXPENSIVE_CHECKS
82 : bool llvm::VerifyMemorySSA = true;
83 : #else
84 : bool llvm::VerifyMemorySSA = false;
85 : #endif
86 : static cl::opt<bool, true>
87 : VerifyMemorySSAX("verify-memoryssa", cl::location(VerifyMemorySSA),
88 : cl::Hidden, cl::desc("Enable verification of MemorySSA."));
89 :
90 : namespace llvm {
91 :
92 : /// An assembly annotator class to print Memory SSA information in
93 : /// comments.
94 88 : class MemorySSAAnnotatedWriter : public AssemblyAnnotationWriter {
95 : friend class MemorySSA;
96 :
97 : const MemorySSA *MSSA;
98 :
99 : public:
100 88 : MemorySSAAnnotatedWriter(const MemorySSA *M) : MSSA(M) {}
101 :
102 240 : void emitBasicBlockStartAnnot(const BasicBlock *BB,
103 : formatted_raw_ostream &OS) override {
104 240 : if (MemoryAccess *MA = MSSA->getMemoryAccess(BB))
105 146 : OS << "; " << *MA << "\n";
106 240 : }
107 :
108 781 : void emitInstructionAnnot(const Instruction *I,
109 : formatted_raw_ostream &OS) override {
110 781 : if (MemoryAccess *MA = MSSA->getMemoryAccess(I))
111 798 : OS << "; " << *MA << "\n";
112 781 : }
113 : };
114 :
115 : } // end namespace llvm
116 :
117 : namespace {
118 :
119 : /// Our current alias analysis API differentiates heavily between calls and
120 : /// non-calls, and functions called on one usually assert on the other.
121 : /// This class encapsulates the distinction to simplify other code that wants
122 : /// "Memory affecting instructions and related data" to use as a key.
123 : /// For example, this class is used as a densemap key in the use optimizer.
124 : class MemoryLocOrCall {
125 : public:
126 : bool IsCall = false;
127 :
128 : MemoryLocOrCall(MemoryUseOrDef *MUD)
129 690059 : : MemoryLocOrCall(MUD->getMemoryInst()) {}
130 : MemoryLocOrCall(const MemoryUseOrDef *MUD)
131 1 : : MemoryLocOrCall(MUD->getMemoryInst()) {}
132 :
133 690060 : MemoryLocOrCall(Instruction *Inst) {
134 690060 : if (ImmutableCallSite(Inst)) {
135 3033 : IsCall = true;
136 3033 : CS = ImmutableCallSite(Inst);
137 : } else {
138 : IsCall = false;
139 : // There is no such thing as a memorylocation for a fence inst, and it is
140 : // unique in that regard.
141 687027 : if (!isa<FenceInst>(Inst))
142 687027 : Loc = MemoryLocation::get(Inst);
143 : }
144 690060 : }
145 :
146 948983 : explicit MemoryLocOrCall(const MemoryLocation &Loc) : Loc(Loc) {}
147 :
148 0 : ImmutableCallSite getCS() const {
149 : assert(IsCall);
150 0 : return CS;
151 : }
152 :
153 : MemoryLocation getLoc() const {
154 : assert(!IsCall);
155 4565308 : return Loc;
156 : }
157 :
158 6800749 : bool operator==(const MemoryLocOrCall &Other) const {
159 6800749 : if (IsCall != Other.IsCall)
160 : return false;
161 :
162 6780806 : if (!IsCall)
163 : return Loc == Other.Loc;
164 :
165 328 : if (CS.getCalledValue() != Other.CS.getCalledValue())
166 : return false;
167 :
168 620 : return CS.arg_size() == Other.CS.arg_size() &&
169 310 : std::equal(CS.arg_begin(), CS.arg_end(), Other.CS.arg_begin());
170 : }
171 :
172 : private:
173 : union {
174 : ImmutableCallSite CS;
175 : MemoryLocation Loc;
176 : };
177 : };
178 :
179 : } // end anonymous namespace
180 :
181 : namespace llvm {
182 :
183 : template <> struct DenseMapInfo<MemoryLocOrCall> {
184 : static inline MemoryLocOrCall getEmptyKey() {
185 : return MemoryLocOrCall(DenseMapInfo<MemoryLocation>::getEmptyKey());
186 : }
187 :
188 : static inline MemoryLocOrCall getTombstoneKey() {
189 : return MemoryLocOrCall(DenseMapInfo<MemoryLocation>::getTombstoneKey());
190 : }
191 :
192 914363 : static unsigned getHashValue(const MemoryLocOrCall &MLOC) {
193 914363 : if (!MLOC.IsCall)
194 910258 : return hash_combine(
195 910258 : MLOC.IsCall,
196 910258 : DenseMapInfo<MemoryLocation>::getHashValue(MLOC.getLoc()));
197 :
198 : hash_code hash =
199 8210 : hash_combine(MLOC.IsCall, DenseMapInfo<const Value *>::getHashValue(
200 4105 : MLOC.getCS().getCalledValue()));
201 :
202 9072 : for (const Value *Arg : MLOC.getCS().args())
203 4967 : hash = hash_combine(hash, DenseMapInfo<const Value *>::getHashValue(Arg));
204 4105 : return hash;
205 : }
206 :
207 : static bool isEqual(const MemoryLocOrCall &LHS, const MemoryLocOrCall &RHS) {
208 6358786 : return LHS == RHS;
209 : }
210 : };
211 :
212 : } // end namespace llvm
213 :
214 : /// This does one-way checks to see if Use could theoretically be hoisted above
215 : /// MayClobber. This will not check the other way around.
216 : ///
217 : /// This assumes that, for the purposes of MemorySSA, Use comes directly after
218 : /// MayClobber, with no potentially clobbering operations in between them.
219 : /// (Where potentially clobbering ops are memory barriers, aliased stores, etc.)
220 : static bool areLoadsReorderable(const LoadInst *Use,
221 : const LoadInst *MayClobber) {
222 : bool VolatileUse = Use->isVolatile();
223 : bool VolatileClobber = MayClobber->isVolatile();
224 : // Volatile operations may never be reordered with other volatile operations.
225 2114 : if (VolatileUse && VolatileClobber)
226 : return false;
227 : // Otherwise, volatile doesn't matter here. From the language reference:
228 : // 'optimizers may change the order of volatile operations relative to
229 : // non-volatile operations.'"
230 :
231 : // If a load is seq_cst, it cannot be moved above other loads. If its ordering
232 : // is weaker, it can be moved above other loads. We just need to be sure that
233 : // MayClobber isn't an acquire load, because loads can't be moved above
234 : // acquire loads.
235 : //
236 : // Note that this explicitly *does* allow the free reordering of monotonic (or
237 : // weaker) loads of the same address.
238 : bool SeqCstUse = Use->getOrdering() == AtomicOrdering::SequentiallyConsistent;
239 : bool MayClobberIsAcquire = isAtLeastOrStrongerThan(MayClobber->getOrdering(),
240 : AtomicOrdering::Acquire);
241 2114 : return !(SeqCstUse || MayClobberIsAcquire);
242 : }
243 :
244 : namespace {
245 :
246 : struct ClobberAlias {
247 : bool IsClobber;
248 : Optional<AliasResult> AR;
249 : };
250 :
251 : } // end anonymous namespace
252 :
253 : // Return a pair of {IsClobber (bool), AR (AliasResult)}. It relies on AR being
254 : // ignored if IsClobber = false.
255 3422568 : static ClobberAlias instructionClobbersQuery(const MemoryDef *MD,
256 : const MemoryLocation &UseLoc,
257 : const Instruction *UseInst,
258 : AliasAnalysis &AA) {
259 3422568 : Instruction *DefInst = MD->getMemoryInst();
260 : assert(DefInst && "Defining instruction not actually an instruction");
261 : ImmutableCallSite UseCS(UseInst);
262 : Optional<AliasResult> AR;
263 :
264 : if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(DefInst)) {
265 : // These intrinsics will show up as affecting memory, but they are just
266 : // markers, mostly.
267 : //
268 : // FIXME: We probably don't actually want MemorySSA to model these at all
269 : // (including creating MemoryAccesses for them): we just end up inventing
270 : // clobbers where they don't really exist at all. Please see D43269 for
271 : // context.
272 193758 : switch (II->getIntrinsicID()) {
273 : case Intrinsic::lifetime_start:
274 80311 : if (UseCS)
275 165 : return {false, NoAlias};
276 80146 : AR = AA.alias(MemoryLocation(II->getArgOperand(1)), UseLoc);
277 80146 : return {AR != NoAlias, AR};
278 105846 : case Intrinsic::lifetime_end:
279 : case Intrinsic::invariant_start:
280 : case Intrinsic::invariant_end:
281 : case Intrinsic::assume:
282 105846 : return {false, NoAlias};
283 : default:
284 : break;
285 : }
286 : }
287 :
288 3236411 : if (UseCS) {
289 11965 : ModRefInfo I = AA.getModRefInfo(DefInst, UseCS);
290 11965 : AR = isMustSet(I) ? MustAlias : MayAlias;
291 11965 : return {isModOrRefSet(I), AR};
292 : }
293 :
294 : if (auto *DefLoad = dyn_cast<LoadInst>(DefInst))
295 : if (auto *UseLoad = dyn_cast<LoadInst>(UseInst))
296 2114 : return {!areLoadsReorderable(UseLoad, DefLoad), MayAlias};
297 :
298 3222332 : ModRefInfo I = AA.getModRefInfo(DefInst, UseLoc);
299 3222332 : AR = isMustSet(I) ? MustAlias : MayAlias;
300 3222332 : return {isModSet(I), AR};
301 : }
302 :
303 1836111 : static ClobberAlias instructionClobbersQuery(MemoryDef *MD,
304 : const MemoryUseOrDef *MU,
305 : const MemoryLocOrCall &UseMLOC,
306 : AliasAnalysis &AA) {
307 : // FIXME: This is a temporary hack to allow a single instructionClobbersQuery
308 : // to exist while MemoryLocOrCall is pushed through places.
309 1836111 : if (UseMLOC.IsCall)
310 8587 : return instructionClobbersQuery(MD, MemoryLocation(), MU->getMemoryInst(),
311 8587 : AA);
312 1827524 : return instructionClobbersQuery(MD, UseMLOC.getLoc(), MU->getMemoryInst(),
313 1827524 : AA);
314 : }
315 :
316 : // Return true when MD may alias MU, return false otherwise.
317 1 : bool MemorySSAUtil::defClobbersUseOrDef(MemoryDef *MD, const MemoryUseOrDef *MU,
318 : AliasAnalysis &AA) {
319 1 : return instructionClobbersQuery(MD, MU, MemoryLocOrCall(MU), AA).IsClobber;
320 : }
321 :
322 : namespace {
323 :
324 : struct UpwardsMemoryQuery {
325 : // True if our original query started off as a call
326 : bool IsCall = false;
327 : // The pointer location we started the query with. This will be empty if
328 : // IsCall is true.
329 : MemoryLocation StartingLoc;
330 : // This is the instruction we were querying about.
331 : const Instruction *Inst = nullptr;
332 : // The MemoryAccess we actually got called with, used to test local domination
333 : const MemoryAccess *OriginalAccess = nullptr;
334 : Optional<AliasResult> AR = MayAlias;
335 :
336 2 : UpwardsMemoryQuery() = default;
337 :
338 164381 : UpwardsMemoryQuery(const Instruction *Inst, const MemoryAccess *Access)
339 493143 : : IsCall(ImmutableCallSite(Inst)), Inst(Inst), OriginalAccess(Access) {
340 164381 : if (!IsCall)
341 163933 : StartingLoc = MemoryLocation::get(Inst);
342 164381 : }
343 : };
344 :
345 : } // end anonymous namespace
346 :
347 1827526 : static bool lifetimeEndsAt(MemoryDef *MD, const MemoryLocation &Loc,
348 : AliasAnalysis &AA) {
349 1827526 : Instruction *Inst = MD->getMemoryInst();
350 : if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst)) {
351 97399 : switch (II->getIntrinsicID()) {
352 : case Intrinsic::lifetime_end:
353 85884 : return AA.isMustAlias(MemoryLocation(II->getArgOperand(1)), Loc);
354 : default:
355 : return false;
356 : }
357 : }
358 : return false;
359 : }
360 :
361 856221 : static bool isUseTriviallyOptimizableToLiveOnEntry(AliasAnalysis &AA,
362 : const Instruction *I) {
363 : // If the memory can't be changed, then loads of the memory can't be
364 : // clobbered.
365 2553615 : return isa<LoadInst>(I) && (I->getMetadata(LLVMContext::MD_invariant_load) ||
366 : AA.pointsToConstantMemory(cast<LoadInst>(I)->
367 856221 : getPointerOperand()));
368 : }
369 :
370 : /// Verifies that `Start` is clobbered by `ClobberAt`, and that nothing
371 : /// inbetween `Start` and `ClobberAt` can clobbers `Start`.
372 : ///
373 : /// This is meant to be as simple and self-contained as possible. Because it
374 : /// uses no cache, etc., it can be relatively expensive.
375 : ///
376 : /// \param Start The MemoryAccess that we want to walk from.
377 : /// \param ClobberAt A clobber for Start.
378 : /// \param StartLoc The MemoryLocation for Start.
379 : /// \param MSSA The MemorySSA instance that Start and ClobberAt belong to.
380 : /// \param Query The UpwardsMemoryQuery we used for our search.
381 : /// \param AA The AliasAnalysis we used for our search.
382 : /// \param AllowImpreciseClobber Always false, unless we do relaxed verify.
383 : static void
384 0 : checkClobberSanity(const MemoryAccess *Start, MemoryAccess *ClobberAt,
385 : const MemoryLocation &StartLoc, const MemorySSA &MSSA,
386 : const UpwardsMemoryQuery &Query, AliasAnalysis &AA,
387 : bool AllowImpreciseClobber = false) {
388 : assert(MSSA.dominates(ClobberAt, Start) && "Clobber doesn't dominate start?");
389 :
390 0 : if (MSSA.isLiveOnEntryDef(Start)) {
391 : assert(MSSA.isLiveOnEntryDef(ClobberAt) &&
392 : "liveOnEntry must clobber itself");
393 0 : return;
394 : }
395 :
396 : bool FoundClobber = false;
397 : DenseSet<ConstMemoryAccessPair> VisitedPhis;
398 : SmallVector<ConstMemoryAccessPair, 8> Worklist;
399 0 : Worklist.emplace_back(Start, StartLoc);
400 : // Walk all paths from Start to ClobberAt, while looking for clobbers. If one
401 : // is found, complain.
402 0 : while (!Worklist.empty()) {
403 : auto MAP = Worklist.pop_back_val();
404 : // All we care about is that nothing from Start to ClobberAt clobbers Start.
405 : // We learn nothing from revisiting nodes.
406 0 : if (!VisitedPhis.insert(MAP).second)
407 0 : continue;
408 :
409 0 : for (const auto *MA : def_chain(MAP.first)) {
410 0 : if (MA == ClobberAt) {
411 : if (const auto *MD = dyn_cast<MemoryDef>(MA)) {
412 : // instructionClobbersQuery isn't essentially free, so don't use `|=`,
413 : // since it won't let us short-circuit.
414 : //
415 : // Also, note that this can't be hoisted out of the `Worklist` loop,
416 : // since MD may only act as a clobber for 1 of N MemoryLocations.
417 0 : FoundClobber = FoundClobber || MSSA.isLiveOnEntryDef(MD);
418 : if (!FoundClobber) {
419 : ClobberAlias CA =
420 0 : instructionClobbersQuery(MD, MAP.second, Query.Inst, AA);
421 0 : if (CA.IsClobber) {
422 : FoundClobber = true;
423 : // Not used: CA.AR;
424 : }
425 : }
426 : }
427 : break;
428 : }
429 :
430 : // We should never hit liveOnEntry, unless it's the clobber.
431 : assert(!MSSA.isLiveOnEntryDef(MA) && "Hit liveOnEntry before clobber?");
432 :
433 : if (const auto *MD = dyn_cast<MemoryDef>(MA)) {
434 : // If Start is a Def, skip self.
435 : if (MD == Start)
436 : continue;
437 :
438 : assert(!instructionClobbersQuery(MD, MAP.second, Query.Inst, AA)
439 : .IsClobber &&
440 : "Found clobber before reaching ClobberAt!");
441 : continue;
442 : }
443 :
444 : if (const auto *MU = dyn_cast<MemoryUse>(MA)) {
445 : (void)MU;
446 : assert (MU == Start &&
447 : "Can only find use in def chain if Start is a use");
448 : continue;
449 : }
450 :
451 : assert(isa<MemoryPhi>(MA));
452 0 : Worklist.append(
453 : upward_defs_begin({const_cast<MemoryAccess *>(MA), MAP.second}),
454 : upward_defs_end());
455 : }
456 : }
457 :
458 : // If the verify is done following an optimization, it's possible that
459 : // ClobberAt was a conservative clobbering, that we can now infer is not a
460 : // true clobbering access. Don't fail the verify if that's the case.
461 : // We do have accesses that claim they're optimized, but could be optimized
462 : // further. Updating all these can be expensive, so allow it for now (FIXME).
463 0 : if (AllowImpreciseClobber)
464 : return;
465 :
466 : // If ClobberAt is a MemoryPhi, we can assume something above it acted as a
467 : // clobber. Otherwise, `ClobberAt` should've acted as a clobber at some point.
468 : assert((isa<MemoryPhi>(ClobberAt) || FoundClobber) &&
469 : "ClobberAt never acted as a clobber");
470 : }
471 :
472 : namespace {
473 :
474 : /// Our algorithm for walking (and trying to optimize) clobbers, all wrapped up
475 : /// in one class.
476 : class ClobberWalker {
477 : /// Save a few bytes by using unsigned instead of size_t.
478 : using ListIndex = unsigned;
479 :
480 : /// Represents a span of contiguous MemoryDefs, potentially ending in a
481 : /// MemoryPhi.
482 5376 : struct DefPath {
483 : MemoryLocation Loc;
484 : // Note that, because we always walk in reverse, Last will always dominate
485 : // First. Also note that First and Last are inclusive.
486 : MemoryAccess *First;
487 : MemoryAccess *Last;
488 : Optional<ListIndex> Previous;
489 :
490 : DefPath(const MemoryLocation &Loc, MemoryAccess *First, MemoryAccess *Last,
491 : Optional<ListIndex> Previous)
492 164371 : : Loc(Loc), First(First), Last(Last), Previous(Previous) {}
493 :
494 : DefPath(const MemoryLocation &Loc, MemoryAccess *Init,
495 : Optional<ListIndex> Previous)
496 : : DefPath(Loc, Init, Init, Previous) {}
497 : };
498 :
499 : const MemorySSA &MSSA;
500 : AliasAnalysis &AA;
501 : DominatorTree &DT;
502 : UpwardsMemoryQuery *Query;
503 :
504 : // Phi optimization bookkeeping
505 : SmallVector<DefPath, 32> Paths;
506 : DenseSet<ConstMemoryAccessPair> VisitedPhis;
507 :
508 : /// Find the nearest def or phi that `From` can legally be optimized to.
509 0 : const MemoryAccess *getWalkTarget(const MemoryPhi *From) const {
510 : assert(From->getNumOperands() && "Phi with no operands?");
511 :
512 0 : BasicBlock *BB = From->getBlock();
513 0 : MemoryAccess *Result = MSSA.getLiveOnEntryDef();
514 0 : DomTreeNode *Node = DT.getNode(BB);
515 0 : while ((Node = Node->getIDom())) {
516 0 : auto *Defs = MSSA.getBlockDefs(Node->getBlock());
517 0 : if (Defs)
518 : return &*Defs->rbegin();
519 : }
520 : return Result;
521 : }
522 :
523 : /// Result of calling walkToPhiOrClobber.
524 : struct UpwardsWalkResult {
525 : /// The "Result" of the walk. Either a clobber, the last thing we walked, or
526 : /// both. Include alias info when clobber found.
527 : MemoryAccess *Result;
528 : bool IsKnownClobber;
529 : Optional<AliasResult> AR;
530 : };
531 :
532 : /// Walk to the next Phi or Clobber in the def chain starting at Desc.Last.
533 : /// This will update Desc.Last as it walks. It will (optionally) also stop at
534 : /// StopAt.
535 : ///
536 : /// This does not test for whether StopAt is a clobber
537 : UpwardsWalkResult
538 549453 : walkToPhiOrClobber(DefPath &Desc,
539 : const MemoryAccess *StopAt = nullptr) const {
540 : assert(!isa<MemoryUse>(Desc.Last) && "Uses don't exist in my world");
541 :
542 2237207 : for (MemoryAccess *Current : def_chain(Desc.Last)) {
543 1969498 : Desc.Last = Current;
544 1969498 : if (Current == StopAt)
545 103105 : return {Current, false, MayAlias};
546 :
547 : if (auto *MD = dyn_cast<MemoryDef>(Current)) {
548 3197368 : if (MSSA.isLiveOnEntryDef(MD))
549 12227 : return {MD, true, MustAlias};
550 : ClobberAlias CA =
551 1586457 : instructionClobbersQuery(MD, Desc.Loc, Query->Inst, AA);
552 1586457 : if (CA.IsClobber)
553 166412 : return {MD, true, CA.AR};
554 : }
555 : }
556 :
557 : assert(isa<MemoryPhi>(Desc.Last) &&
558 : "Ended at a non-clobber that's not a phi?");
559 267709 : return {Desc.Last, false, MayAlias};
560 : }
561 :
562 267709 : void addSearches(MemoryPhi *Phi, SmallVectorImpl<ListIndex> &PausedSearches,
563 : ListIndex PriorNode) {
564 267709 : auto UpwardDefs = make_range(upward_defs_begin({Phi, Paths[PriorNode].Loc}),
565 267709 : upward_defs_end());
566 610844 : for (const MemoryAccessPair &P : UpwardDefs) {
567 610844 : PausedSearches.push_back(Paths.size());
568 610844 : Paths.emplace_back(P.second, P.first, PriorNode);
569 : }
570 267709 : }
571 :
572 : /// Represents a search that terminated after finding a clobber. This clobber
573 : /// may or may not be present in the path of defs from LastNode..SearchStart,
574 : /// since it may have been retrieved from cache.
575 : struct TerminatedPath {
576 : MemoryAccess *Clobber;
577 : ListIndex LastNode;
578 : };
579 :
580 : /// Get an access that keeps us from optimizing to the given phi.
581 : ///
582 : /// PausedSearches is an array of indices into the Paths array. Its incoming
583 : /// value is the indices of searches that stopped at the last phi optimization
584 : /// target. It's left in an unspecified state.
585 : ///
586 : /// If this returns None, NewPaused is a vector of searches that terminated
587 : /// at StopWhere. Otherwise, NewPaused is left in an unspecified state.
588 : Optional<TerminatedPath>
589 157640 : getBlockingAccess(const MemoryAccess *StopWhere,
590 : SmallVectorImpl<ListIndex> &PausedSearches,
591 : SmallVectorImpl<ListIndex> &NewPaused,
592 : SmallVectorImpl<TerminatedPath> &Terminated) {
593 : assert(!PausedSearches.empty() && "No searches to continue?");
594 :
595 : // BFS vs DFS really doesn't make a difference here, so just do a DFS with
596 : // PausedSearches as our stack.
597 412917 : while (!PausedSearches.empty()) {
598 375668 : ListIndex PathIndex = PausedSearches.pop_back_val();
599 375668 : DefPath &Node = Paths[PathIndex];
600 :
601 : // If we've already visited this path with this MemoryLocation, we don't
602 : // need to do so again.
603 : //
604 : // NOTE: That we just drop these paths on the ground makes caching
605 : // behavior sporadic. e.g. given a diamond:
606 : // A
607 : // B C
608 : // D
609 : //
610 : // ...If we walk D, B, A, C, we'll only cache the result of phi
611 : // optimization for A, B, and D; C will be skipped because it dies here.
612 : // This arguably isn't the worst thing ever, since:
613 : // - We generally query things in a top-down order, so if we got below D
614 : // without needing cache entries for {C, MemLoc}, then chances are
615 : // that those cache entries would end up ultimately unused.
616 : // - We still cache things for A, so C only needs to walk up a bit.
617 : // If this behavior becomes problematic, we can fix without a ton of extra
618 : // work.
619 375668 : if (!VisitedPhis.insert({Node.Last, Node.Loc}).second)
620 168872 : continue;
621 :
622 309901 : UpwardsWalkResult Res = walkToPhiOrClobber(Node, /*StopAt=*/StopWhere);
623 309901 : if (Res.IsKnownClobber) {
624 : assert(Res.Result != StopWhere);
625 : // If this wasn't a cache hit, we hit a clobber when walking. That's a
626 : // failure.
627 120391 : TerminatedPath Term{Res.Result, PathIndex};
628 120391 : if (!MSSA.dominates(Res.Result, StopWhere))
629 120391 : return Term;
630 :
631 : // Otherwise, it's a valid thing to potentially optimize to.
632 0 : Terminated.push_back(Term);
633 0 : continue;
634 : }
635 :
636 189510 : if (Res.Result == StopWhere) {
637 : // We've hit our target. Save this path off for if we want to continue
638 : // walking.
639 103105 : NewPaused.push_back(PathIndex);
640 103105 : continue;
641 : }
642 :
643 : assert(!MSSA.isLiveOnEntryDef(Res.Result) && "liveOnEntry is a clobber");
644 86405 : addSearches(cast<MemoryPhi>(Res.Result), PausedSearches, PathIndex);
645 : }
646 :
647 : return None;
648 : }
649 :
650 : template <typename T, typename Walker>
651 481564 : struct generic_def_path_iterator
652 : : public iterator_facade_base<generic_def_path_iterator<T, Walker>,
653 : std::forward_iterator_tag, T *> {
654 : generic_def_path_iterator() = default;
655 : generic_def_path_iterator(Walker *W, ListIndex N) : W(W), N(N) {}
656 :
657 : T &operator*() const { return curNode(); }
658 :
659 : generic_def_path_iterator &operator++() {
660 : N = curNode().Previous;
661 : return *this;
662 : }
663 :
664 : bool operator==(const generic_def_path_iterator &O) const {
665 0 : if (N.hasValue() != O.N.hasValue())
666 : return false;
667 0 : return !N.hasValue() || *N == *O.N;
668 : }
669 :
670 : private:
671 0 : T &curNode() const { return W->Paths[*N]; }
672 :
673 : Walker *W = nullptr;
674 : Optional<ListIndex> N = None;
675 : };
676 :
677 : using def_path_iterator = generic_def_path_iterator<DefPath, ClobberWalker>;
678 : using const_def_path_iterator =
679 : generic_def_path_iterator<const DefPath, const ClobberWalker>;
680 :
681 : iterator_range<def_path_iterator> def_path(ListIndex From) {
682 : return make_range(def_path_iterator(this, From), def_path_iterator());
683 : }
684 :
685 : iterator_range<const_def_path_iterator> const_def_path(ListIndex From) const {
686 : return make_range(const_def_path_iterator(this, From),
687 : const_def_path_iterator());
688 : }
689 :
690 135197 : struct OptznResult {
691 : /// The path that contains our result.
692 : TerminatedPath PrimaryClobber;
693 : /// The paths that we can legally cache back from, but that aren't
694 : /// necessarily the result of the Phi optimization.
695 : SmallVector<TerminatedPath, 4> OtherClobbers;
696 : };
697 :
698 : ListIndex defPathIndex(const DefPath &N) const {
699 : // The assert looks nicer if we don't need to do &N
700 : const DefPath *NP = &N;
701 : assert(!Paths.empty() && NP >= &Paths.front() && NP <= &Paths.back() &&
702 : "Out of bounds DefPath!");
703 120391 : return NP - &Paths.front();
704 : }
705 :
706 : /// Try to optimize a phi as best as we can. Returns a SmallVector of Paths
707 : /// that act as legal clobbers. Note that this won't return *all* clobbers.
708 : ///
709 : /// Phi optimization algorithm tl;dr:
710 : /// - Find the earliest def/phi, A, we can optimize to
711 : /// - Find if all paths from the starting memory access ultimately reach A
712 : /// - If not, optimization isn't possible.
713 : /// - Otherwise, walk from A to another clobber or phi, A'.
714 : /// - If A' is a def, we're done.
715 : /// - If A' is a phi, try to optimize it.
716 : ///
717 : /// A path is a series of {MemoryAccess, MemoryLocation} pairs. A path
718 : /// terminates when a MemoryAccess that clobbers said MemoryLocation is found.
719 135197 : OptznResult tryOptimizePhi(MemoryPhi *Phi, MemoryAccess *Start,
720 : const MemoryLocation &Loc) {
721 : assert(Paths.empty() && VisitedPhis.empty() &&
722 : "Reset the optimization state.");
723 :
724 135197 : Paths.emplace_back(Loc, Start, Phi, None);
725 : // Stores how many "valid" optimization nodes we had prior to calling
726 : // addSearches/getBlockingAccess. Necessary for caching if we had a blocker.
727 270394 : auto PriorPathsSize = Paths.size();
728 :
729 : SmallVector<ListIndex, 16> PausedSearches;
730 : SmallVector<ListIndex, 8> NewPaused;
731 135197 : SmallVector<TerminatedPath, 4> TerminatedPaths;
732 :
733 135197 : addSearches(Phi, PausedSearches, 0);
734 :
735 : // Moves the TerminatedPath with the "most dominated" Clobber to the end of
736 : // Paths.
737 : auto MoveDominatedPathToEnd = [&](SmallVectorImpl<TerminatedPath> &Paths) {
738 : assert(!Paths.empty() && "Need a path to move");
739 : auto Dom = Paths.begin();
740 : for (auto I = std::next(Dom), E = Paths.end(); I != E; ++I)
741 : if (!MSSA.dominates(I->Clobber, Dom->Clobber))
742 : Dom = I;
743 : auto Last = Paths.end() - 1;
744 : if (Last != Dom)
745 : std::iter_swap(Last, Dom);
746 135197 : };
747 :
748 135197 : MemoryPhi *Current = Phi;
749 : while (true) {
750 : assert(!MSSA.isLiveOnEntryDef(Current) &&
751 : "liveOnEntry wasn't treated as a clobber?");
752 :
753 157640 : const auto *Target = getWalkTarget(Current);
754 : // If a TerminatedPath doesn't dominate Target, then it wasn't a legal
755 : // optimization for the prior phi.
756 : assert(all_of(TerminatedPaths, [&](const TerminatedPath &P) {
757 : return MSSA.dominates(P.Clobber, Target);
758 : }));
759 :
760 : // FIXME: This is broken, because the Blocker may be reported to be
761 : // liveOnEntry, and we'll happily wait for that to disappear (read: never)
762 : // For the moment, this is fine, since we do nothing with blocker info.
763 157640 : if (Optional<TerminatedPath> Blocker = getBlockingAccess(
764 157640 : Target, PausedSearches, NewPaused, TerminatedPaths)) {
765 :
766 : // Find the node we started at. We can't search based on N->Last, since
767 : // we may have gone around a loop with a different MemoryLocation.
768 120391 : auto Iter = find_if(def_path(Blocker->LastNode), [&](const DefPath &N) {
769 0 : return defPathIndex(N) < PriorPathsSize;
770 240782 : });
771 : assert(Iter != def_path_iterator());
772 :
773 : DefPath &CurNode = *Iter;
774 : assert(CurNode.Last == Current);
775 :
776 : // Two things:
777 : // A. We can't reliably cache all of NewPaused back. Consider a case
778 : // where we have two paths in NewPaused; one of which can't optimize
779 : // above this phi, whereas the other can. If we cache the second path
780 : // back, we'll end up with suboptimal cache entries. We can handle
781 : // cases like this a bit better when we either try to find all
782 : // clobbers that block phi optimization, or when our cache starts
783 : // supporting unfinished searches.
784 : // B. We can't reliably cache TerminatedPaths back here without doing
785 : // extra checks; consider a case like:
786 : // T
787 : // / \
788 : // D C
789 : // \ /
790 : // S
791 : // Where T is our target, C is a node with a clobber on it, D is a
792 : // diamond (with a clobber *only* on the left or right node, N), and
793 : // S is our start. Say we walk to D, through the node opposite N
794 : // (read: ignoring the clobber), and see a cache entry in the top
795 : // node of D. That cache entry gets put into TerminatedPaths. We then
796 : // walk up to C (N is later in our worklist), find the clobber, and
797 : // quit. If we append TerminatedPaths to OtherClobbers, we'll cache
798 : // the bottom part of D to the cached clobber, ignoring the clobber
799 : // in N. Again, this problem goes away if we start tracking all
800 : // blockers for a given phi optimization.
801 120391 : TerminatedPath Result{CurNode.Last, defPathIndex(CurNode)};
802 120391 : return {Result, {}};
803 : }
804 :
805 : // If there's nothing left to search, then all paths led to valid clobbers
806 : // that we got from our cache; pick the nearest to the start, and allow
807 : // the rest to be cached back.
808 37249 : if (NewPaused.empty()) {
809 0 : MoveDominatedPathToEnd(TerminatedPaths);
810 0 : TerminatedPath Result = TerminatedPaths.pop_back_val();
811 0 : return {Result, std::move(TerminatedPaths)};
812 : }
813 :
814 : MemoryAccess *DefChainEnd = nullptr;
815 22443 : SmallVector<TerminatedPath, 4> Clobbers;
816 112430 : for (ListIndex Paused : NewPaused) {
817 150362 : UpwardsWalkResult WR = walkToPhiOrClobber(Paths[Paused]);
818 75181 : if (WR.IsKnownClobber)
819 29074 : Clobbers.push_back({WR.Result, Paused});
820 : else
821 : // Micro-opt: If we hit the end of the chain, save it.
822 46107 : DefChainEnd = WR.Result;
823 : }
824 :
825 37249 : if (!TerminatedPaths.empty()) {
826 : // If we couldn't find the dominating phi/liveOnEntry in the above loop,
827 : // do it now.
828 0 : if (!DefChainEnd)
829 0 : for (auto *MA : def_chain(const_cast<MemoryAccess *>(Target)))
830 : DefChainEnd = MA;
831 :
832 : // If any of the terminated paths don't dominate the phi we'll try to
833 : // optimize, we need to figure out what they are and quit.
834 0 : const BasicBlock *ChainBB = DefChainEnd->getBlock();
835 0 : for (const TerminatedPath &TP : TerminatedPaths) {
836 : // Because we know that DefChainEnd is as "high" as we can go, we
837 : // don't need local dominance checks; BB dominance is sufficient.
838 0 : if (DT.dominates(ChainBB, TP.Clobber->getBlock()))
839 0 : Clobbers.push_back(TP);
840 : }
841 : }
842 :
843 : // If we have clobbers in the def chain, find the one closest to Current
844 : // and quit.
845 37249 : if (!Clobbers.empty()) {
846 14806 : MoveDominatedPathToEnd(Clobbers);
847 14806 : TerminatedPath Result = Clobbers.pop_back_val();
848 14806 : return {Result, std::move(Clobbers)};
849 : }
850 :
851 : assert(all_of(NewPaused,
852 : [&](ListIndex I) { return Paths[I].Last == DefChainEnd; }));
853 :
854 : // Because liveOnEntry is a clobber, this must be a phi.
855 : auto *DefChainPhi = cast<MemoryPhi>(DefChainEnd);
856 :
857 44886 : PriorPathsSize = Paths.size();
858 : PausedSearches.clear();
859 68550 : for (ListIndex I : NewPaused)
860 46107 : addSearches(DefChainPhi, PausedSearches, I);
861 : NewPaused.clear();
862 :
863 : Current = DefChainPhi;
864 : }
865 : }
866 :
867 0 : void verifyOptResult(const OptznResult &R) const {
868 : assert(all_of(R.OtherClobbers, [&](const TerminatedPath &P) {
869 : return MSSA.dominates(P.Clobber, R.PrimaryClobber.Clobber);
870 : }));
871 0 : }
872 :
873 : void resetPhiOptznState() {
874 : Paths.clear();
875 : VisitedPhis.clear();
876 : }
877 :
878 : public:
879 : ClobberWalker(const MemorySSA &MSSA, AliasAnalysis &AA, DominatorTree &DT)
880 44551 : : MSSA(MSSA), AA(AA), DT(DT) {}
881 :
882 : /// Finds the nearest clobber for the given query, optimizing phis if
883 : /// possible.
884 164371 : MemoryAccess *findClobber(MemoryAccess *Start, UpwardsMemoryQuery &Q) {
885 164371 : Query = &Q;
886 :
887 : MemoryAccess *Current = Start;
888 : // This walker pretends uses don't exist. If we're handed one, silently grab
889 : // its def. (This has the nice side-effect of ensuring we never cache uses)
890 : if (auto *MU = dyn_cast<MemoryUse>(Start))
891 : Current = MU->getDefiningAccess();
892 :
893 : DefPath FirstDesc(Q.StartingLoc, Current, Current, None);
894 : // Fast path for the overly-common case (no crazy phi optimization
895 : // necessary)
896 164371 : UpwardsWalkResult WalkResult = walkToPhiOrClobber(FirstDesc);
897 : MemoryAccess *Result;
898 164371 : if (WalkResult.IsKnownClobber) {
899 29174 : Result = WalkResult.Result;
900 : Q.AR = WalkResult.AR;
901 : } else {
902 : OptznResult OptRes = tryOptimizePhi(cast<MemoryPhi>(FirstDesc.Last),
903 135197 : Current, Q.StartingLoc);
904 : verifyOptResult(OptRes);
905 : resetPhiOptznState();
906 135197 : Result = OptRes.PrimaryClobber.Clobber;
907 : }
908 :
909 : #ifdef EXPENSIVE_CHECKS
910 : checkClobberSanity(Current, Result, Q.StartingLoc, MSSA, Q, AA);
911 : #endif
912 164371 : return Result;
913 : }
914 :
915 0 : void verify(const MemorySSA *MSSA) { assert(MSSA == &this->MSSA); }
916 : };
917 :
918 : struct RenamePassData {
919 : DomTreeNode *DTN;
920 : DomTreeNode::const_iterator ChildIt;
921 : MemoryAccess *IncomingVal;
922 :
923 : RenamePassData(DomTreeNode *D, DomTreeNode::const_iterator It,
924 : MemoryAccess *M)
925 297798 : : DTN(D), ChildIt(It), IncomingVal(M) {}
926 :
927 : void swap(RenamePassData &RHS) {
928 : std::swap(DTN, RHS.DTN);
929 : std::swap(ChildIt, RHS.ChildIt);
930 : std::swap(IncomingVal, RHS.IncomingVal);
931 : }
932 : };
933 :
934 : } // end anonymous namespace
935 :
936 : namespace llvm {
937 :
938 : /// A MemorySSAWalker that does AA walks to disambiguate accesses. It no
939 : /// longer does caching on its own, but the name has been retained for the
940 : /// moment.
941 : class MemorySSA::CachingWalker final : public MemorySSAWalker {
942 : ClobberWalker Walker;
943 :
944 : MemoryAccess *getClobberingMemoryAccess(MemoryAccess *, UpwardsMemoryQuery &);
945 :
946 : public:
947 : CachingWalker(MemorySSA *, AliasAnalysis *, DominatorTree *);
948 0 : ~CachingWalker() override = default;
949 :
950 : using MemorySSAWalker::getClobberingMemoryAccess;
951 :
952 : MemoryAccess *getClobberingMemoryAccess(MemoryAccess *) override;
953 : MemoryAccess *getClobberingMemoryAccess(MemoryAccess *,
954 : const MemoryLocation &) override;
955 : void invalidateInfo(MemoryAccess *) override;
956 :
957 0 : void verify(const MemorySSA *MSSA) override {
958 : MemorySSAWalker::verify(MSSA);
959 : Walker.verify(MSSA);
960 0 : }
961 : };
962 :
963 : } // end namespace llvm
964 :
965 297798 : void MemorySSA::renameSuccessorPhis(BasicBlock *BB, MemoryAccess *IncomingVal,
966 : bool RenameAllUses) {
967 : // Pass through values to our successors
968 937246 : for (const BasicBlock *S : successors(BB)) {
969 341650 : auto It = PerBlockAccesses.find(S);
970 : // Rename the phi nodes in our successor block
971 654178 : if (It == PerBlockAccesses.end() || !isa<MemoryPhi>(It->second->front()))
972 197369 : continue;
973 : AccessList *Accesses = It->second.get();
974 : auto *Phi = cast<MemoryPhi>(&Accesses->front());
975 144281 : if (RenameAllUses) {
976 2 : int PhiIndex = Phi->getBasicBlockIndex(BB);
977 : assert(PhiIndex != -1 && "Incomplete phi during partial rename");
978 2 : Phi->setIncomingValue(PhiIndex, IncomingVal);
979 : } else
980 144279 : Phi->addIncoming(IncomingVal, BB);
981 : }
982 297798 : }
983 :
984 : /// Rename a single basic block into MemorySSA form.
985 : /// Uses the standard SSA renaming algorithm.
986 : /// \returns The new incoming value.
987 297797 : MemoryAccess *MemorySSA::renameBlock(BasicBlock *BB, MemoryAccess *IncomingVal,
988 : bool RenameAllUses) {
989 297797 : auto It = PerBlockAccesses.find(BB);
990 : // Skip most processing if the list is empty.
991 297798 : if (It != PerBlockAccesses.end()) {
992 : AccessList *Accesses = It->second.get();
993 2035622 : for (MemoryAccess &L : *Accesses) {
994 : if (MemoryUseOrDef *MUD = dyn_cast<MemoryUseOrDef>(&L)) {
995 5 : if (MUD->getDefiningAccess() == nullptr || RenameAllUses)
996 1709162 : MUD->setDefiningAccess(IncomingVal);
997 1709162 : if (isa<MemoryDef>(&L))
998 : IncomingVal = &L;
999 : } else {
1000 : IncomingVal = &L;
1001 : }
1002 : }
1003 : }
1004 297798 : return IncomingVal;
1005 : }
1006 :
1007 : /// This is the standard SSA renaming algorithm.
1008 : ///
1009 : /// We walk the dominator tree in preorder, renaming accesses, and then filling
1010 : /// in phi nodes in our successors.
1011 44552 : void MemorySSA::renamePass(DomTreeNode *Root, MemoryAccess *IncomingVal,
1012 : SmallPtrSetImpl<BasicBlock *> &Visited,
1013 : bool SkipVisited, bool RenameAllUses) {
1014 44552 : SmallVector<RenamePassData, 32> WorkStack;
1015 : // Skip everything if we already renamed this block and we are skipping.
1016 : // Note: You can't sink this into the if, because we need it to occur
1017 : // regardless of whether we skip blocks or not.
1018 44552 : bool AlreadyVisited = !Visited.insert(Root->getBlock()).second;
1019 44552 : if (SkipVisited && AlreadyVisited)
1020 0 : return;
1021 :
1022 44552 : IncomingVal = renameBlock(Root->getBlock(), IncomingVal, RenameAllUses);
1023 44551 : renameSuccessorPhis(Root->getBlock(), IncomingVal, RenameAllUses);
1024 44552 : WorkStack.push_back({Root, Root->begin(), IncomingVal});
1025 :
1026 595596 : while (!WorkStack.empty()) {
1027 551044 : DomTreeNode *Node = WorkStack.back().DTN;
1028 551044 : DomTreeNode::const_iterator ChildIt = WorkStack.back().ChildIt;
1029 551044 : IncomingVal = WorkStack.back().IncomingVal;
1030 :
1031 551044 : if (ChildIt == Node->end()) {
1032 : WorkStack.pop_back();
1033 : } else {
1034 253246 : DomTreeNode *Child = *ChildIt;
1035 : ++WorkStack.back().ChildIt;
1036 253246 : BasicBlock *BB = Child->getBlock();
1037 : // Note: You can't sink this into the if, because we need it to occur
1038 : // regardless of whether we skip blocks or not.
1039 253246 : AlreadyVisited = !Visited.insert(BB).second;
1040 253246 : if (SkipVisited && AlreadyVisited) {
1041 : // We already visited this during our renaming, which can happen when
1042 : // being asked to rename multiple blocks. Figure out the incoming val,
1043 : // which is the last def.
1044 : // Incoming value can only change if there is a block def, and in that
1045 : // case, it's the last block def in the list.
1046 0 : if (auto *BlockDefs = getWritableBlockDefs(BB))
1047 : IncomingVal = &*BlockDefs->rbegin();
1048 : } else
1049 253246 : IncomingVal = renameBlock(BB, IncomingVal, RenameAllUses);
1050 253246 : renameSuccessorPhis(BB, IncomingVal, RenameAllUses);
1051 253246 : WorkStack.push_back({Child, Child->begin(), IncomingVal});
1052 : }
1053 : }
1054 : }
1055 :
1056 : /// This handles unreachable block accesses by deleting phi nodes in
1057 : /// unreachable blocks, and marking all other unreachable MemoryAccess's as
1058 : /// being uses of the live on entry definition.
1059 2467 : void MemorySSA::markUnreachableAsLiveOnEntry(BasicBlock *BB) {
1060 : assert(!DT->isReachableFromEntry(BB) &&
1061 : "Reachable block found while handling unreachable blocks");
1062 :
1063 : // Make sure phi nodes in our reachable successors end up with a
1064 : // LiveOnEntryDef for our incoming edge, even though our block is forward
1065 : // unreachable. We could just disconnect these blocks from the CFG fully,
1066 : // but we do not right now.
1067 6509 : for (const BasicBlock *S : successors(BB)) {
1068 1575 : if (!DT->isReachableFromEntry(S))
1069 1540 : continue;
1070 538 : auto It = PerBlockAccesses.find(S);
1071 : // Rename the phi nodes in our successor block
1072 1012 : if (It == PerBlockAccesses.end() || !isa<MemoryPhi>(It->second->front()))
1073 503 : continue;
1074 : AccessList *Accesses = It->second.get();
1075 : auto *Phi = cast<MemoryPhi>(&Accesses->front());
1076 35 : Phi->addIncoming(LiveOnEntryDef.get(), BB);
1077 : }
1078 :
1079 2467 : auto It = PerBlockAccesses.find(BB);
1080 2467 : if (It == PerBlockAccesses.end())
1081 634 : return;
1082 :
1083 : auto &Accesses = It->second;
1084 6347 : for (auto AI = Accesses->begin(), AE = Accesses->end(); AI != AE;) {
1085 : auto Next = std::next(AI);
1086 : // If we have a phi, just remove it. We are going to replace all
1087 : // users with live on entry.
1088 : if (auto *UseOrDef = dyn_cast<MemoryUseOrDef>(AI))
1089 4514 : UseOrDef->setDefiningAccess(LiveOnEntryDef.get());
1090 : else
1091 : Accesses->erase(AI);
1092 : AI = Next;
1093 : }
1094 : }
1095 :
1096 44551 : MemorySSA::MemorySSA(Function &Func, AliasAnalysis *AA, DominatorTree *DT)
1097 : : AA(AA), DT(DT), F(Func), LiveOnEntryDef(nullptr), Walker(nullptr),
1098 44551 : NextID(0) {
1099 44550 : buildMemorySSA();
1100 44551 : }
1101 :
1102 44551 : MemorySSA::~MemorySSA() {
1103 : // Drop all our references
1104 309550 : for (const auto &Pair : PerBlockAccesses)
1105 2013352 : for (MemoryAccess &MA : *Pair.second)
1106 1748353 : MA.dropAllReferences();
1107 44551 : }
1108 :
1109 320841 : MemorySSA::AccessList *MemorySSA::getOrCreateAccessList(const BasicBlock *BB) {
1110 320841 : auto Res = PerBlockAccesses.insert(std::make_pair(BB, nullptr));
1111 :
1112 320841 : if (Res.second)
1113 : Res.first->second = llvm::make_unique<AccessList>();
1114 320841 : return Res.first->second.get();
1115 : }
1116 :
1117 304118 : MemorySSA::DefsList *MemorySSA::getOrCreateDefsList(const BasicBlock *BB) {
1118 304118 : auto Res = PerBlockDefs.insert(std::make_pair(BB, nullptr));
1119 :
1120 304118 : if (Res.second)
1121 : Res.first->second = llvm::make_unique<DefsList>();
1122 304118 : return Res.first->second.get();
1123 : }
1124 :
1125 : namespace llvm {
1126 :
1127 : /// This class is a batch walker of all MemoryUse's in the program, and points
1128 : /// their defining access at the thing that actually clobbers them. Because it
1129 : /// is a batch walker that touches everything, it does not operate like the
1130 : /// other walkers. This walker is basically performing a top-down SSA renaming
1131 : /// pass, where the version stack is used as the cache. This enables it to be
1132 : /// significantly more time and memory efficient than using the regular walker,
1133 : /// which is walking bottom-up.
1134 : class MemorySSA::OptimizeUses {
1135 : public:
1136 : OptimizeUses(MemorySSA *MSSA, MemorySSAWalker *Walker, AliasAnalysis *AA,
1137 : DominatorTree *DT)
1138 44551 : : MSSA(MSSA), Walker(Walker), AA(AA), DT(DT) {
1139 44551 : Walker = MSSA->getWalker();
1140 : }
1141 :
1142 : void optimizeUses();
1143 :
1144 : private:
1145 : /// This represents where a given memorylocation is in the stack.
1146 435647 : struct MemlocStackInfo {
1147 : // This essentially is keeping track of versions of the stack. Whenever
1148 : // the stack changes due to pushes or pops, these versions increase.
1149 : unsigned long StackEpoch;
1150 : unsigned long PopEpoch;
1151 : // This is the lower bound of places on the stack to check. It is equal to
1152 : // the place the last stack walk ended.
1153 : // Note: Correctness depends on this being initialized to 0, which densemap
1154 : // does
1155 : unsigned long LowerBound;
1156 : const BasicBlock *LowerBoundBlock;
1157 : // This is where the last walk for this memory location ended.
1158 : unsigned long LastKill;
1159 : bool LastKillValid;
1160 : Optional<AliasResult> AR;
1161 : };
1162 :
1163 : void optimizeUsesInBlock(const BasicBlock *, unsigned long &, unsigned long &,
1164 : SmallVectorImpl<MemoryAccess *> &,
1165 : DenseMap<MemoryLocOrCall, MemlocStackInfo> &);
1166 :
1167 : MemorySSA *MSSA;
1168 : MemorySSAWalker *Walker;
1169 : AliasAnalysis *AA;
1170 : DominatorTree *DT;
1171 : };
1172 :
1173 : } // end namespace llvm
1174 :
1175 : /// Optimize the uses in a given block This is basically the SSA renaming
1176 : /// algorithm, with one caveat: We are able to use a single stack for all
1177 : /// MemoryUses. This is because the set of *possible* reaching MemoryDefs is
1178 : /// the same for every MemoryUse. The *actual* clobbering MemoryDef is just
1179 : /// going to be some position in that stack of possible ones.
1180 : ///
1181 : /// We track the stack positions that each MemoryLocation needs
1182 : /// to check, and last ended at. This is because we only want to check the
1183 : /// things that changed since last time. The same MemoryLocation should
1184 : /// get clobbered by the same store (getModRefInfo does not use invariantness or
1185 : /// things like this, and if they start, we can modify MemoryLocOrCall to
1186 : /// include relevant data)
1187 297794 : void MemorySSA::OptimizeUses::optimizeUsesInBlock(
1188 : const BasicBlock *BB, unsigned long &StackEpoch, unsigned long &PopEpoch,
1189 : SmallVectorImpl<MemoryAccess *> &VersionStack,
1190 : DenseMap<MemoryLocOrCall, MemlocStackInfo> &LocStackInfo) {
1191 :
1192 : /// If no accesses, nothing to do.
1193 297794 : MemorySSA::AccessList *Accesses = MSSA->getWritableBlockAccesses(BB);
1194 264023 : if (Accesses == nullptr)
1195 33771 : return;
1196 :
1197 : // Pop everything that doesn't dominate the current block off the stack,
1198 : // increment the PopEpoch to account for this.
1199 : while (true) {
1200 : assert(
1201 : !VersionStack.empty() &&
1202 : "Version stack should have liveOnEntry sentinel dominating everything");
1203 462324 : BasicBlock *BackBlock = VersionStack.back()->getBlock();
1204 462324 : if (DT->dominates(BackBlock, BB))
1205 : break;
1206 875040 : while (VersionStack.back()->getBlock() == BackBlock)
1207 : VersionStack.pop_back();
1208 198301 : ++PopEpoch;
1209 198301 : }
1210 :
1211 2035613 : for (MemoryAccess &MA : *Accesses) {
1212 : auto *MU = dyn_cast<MemoryUse>(&MA);
1213 : if (!MU) {
1214 1079750 : VersionStack.push_back(&MA);
1215 1079750 : ++StackEpoch;
1216 1269837 : continue;
1217 : }
1218 :
1219 691840 : if (isUseTriviallyOptimizableToLiveOnEntry(*AA, MU->getMemoryInst())) {
1220 5343 : MU->setDefiningAccess(MSSA->getLiveOnEntryDef(), true, None);
1221 1781 : continue;
1222 : }
1223 :
1224 : MemoryLocOrCall UseMLOC(MU);
1225 : auto &LocInfo = LocStackInfo[UseMLOC];
1226 : // If the pop epoch changed, it means we've removed stuff from top of
1227 : // stack due to changing blocks. We may have to reset the lower bound or
1228 : // last kill info.
1229 690059 : if (LocInfo.PopEpoch != PopEpoch) {
1230 641966 : LocInfo.PopEpoch = PopEpoch;
1231 641966 : LocInfo.StackEpoch = StackEpoch;
1232 : // If the lower bound was in something that no longer dominates us, we
1233 : // have to reset it.
1234 : // We can't simply track stack size, because the stack may have had
1235 : // pushes/pops in the meantime.
1236 : // XXX: This is non-optimal, but only is slower cases with heavily
1237 : // branching dominator trees. To get the optimal number of queries would
1238 : // be to make lowerbound and lastkill a per-loc stack, and pop it until
1239 : // the top of that stack dominates us. This does not seem worth it ATM.
1240 : // A much cheaper optimization would be to always explore the deepest
1241 : // branch of the dominator tree first. This will guarantee this resets on
1242 : // the smallest set of blocks.
1243 766839 : if (LocInfo.LowerBoundBlock && LocInfo.LowerBoundBlock != BB &&
1244 124873 : !DT->dominates(LocInfo.LowerBoundBlock, BB)) {
1245 : // Reset the lower bound of things to check.
1246 : // TODO: Some day we should be able to reset to last kill, rather than
1247 : // 0.
1248 77613 : LocInfo.LowerBound = 0;
1249 77613 : LocInfo.LowerBoundBlock = VersionStack[0]->getBlock();
1250 77613 : LocInfo.LastKillValid = false;
1251 : }
1252 48093 : } else if (LocInfo.StackEpoch != StackEpoch) {
1253 : // If all that has changed is the StackEpoch, we only have to check the
1254 : // new things on the stack, because we've checked everything before. In
1255 : // this case, the lower bound of things to check remains the same.
1256 47287 : LocInfo.PopEpoch = PopEpoch;
1257 47287 : LocInfo.StackEpoch = StackEpoch;
1258 : }
1259 690059 : if (!LocInfo.LastKillValid) {
1260 628898 : LocInfo.LastKill = VersionStack.size() - 1;
1261 628898 : LocInfo.LastKillValid = true;
1262 : LocInfo.AR = MayAlias;
1263 : }
1264 :
1265 : // At this point, we should have corrected last kill and LowerBound to be
1266 : // in bounds.
1267 : assert(LocInfo.LowerBound < VersionStack.size() &&
1268 : "Lower bound out of range");
1269 : assert(LocInfo.LastKill < VersionStack.size() &&
1270 : "Last kill info out of range");
1271 : // In any case, the new upper bound is the top of the stack.
1272 690059 : unsigned long UpperBound = VersionStack.size() - 1;
1273 :
1274 1380118 : if (UpperBound - LocInfo.LowerBound > MaxCheckLimit) {
1275 : LLVM_DEBUG(dbgs() << "MemorySSA skipping optimization of " << *MU << " ("
1276 : << *(MU->getMemoryInst()) << ")"
1277 : << " because there are "
1278 : << UpperBound - LocInfo.LowerBound
1279 : << " stores to disambiguate\n");
1280 : // Because we did not walk, LastKill is no longer valid, as this may
1281 : // have been a kill.
1282 188306 : LocInfo.LastKillValid = false;
1283 188306 : continue;
1284 : }
1285 : bool FoundClobberResult = false;
1286 2099212 : while (UpperBound > LocInfo.LowerBound) {
1287 3918044 : if (isa<MemoryPhi>(VersionStack[UpperBound])) {
1288 : // For phis, use the walker, see where we ended up, go there
1289 122909 : Instruction *UseInst = MU->getMemoryInst();
1290 122909 : MemoryAccess *Result = Walker->getClobberingMemoryAccess(UseInst);
1291 : // We are guaranteed to find it or something is wrong
1292 260897 : while (VersionStack[UpperBound] != Result) {
1293 : assert(UpperBound != 0);
1294 137988 : --UpperBound;
1295 : }
1296 : FoundClobberResult = true;
1297 361563 : break;
1298 : }
1299 :
1300 : MemoryDef *MD = cast<MemoryDef>(VersionStack[UpperBound]);
1301 : // If the lifetime of the pointer ends at this instruction, it's live on
1302 : // entry.
1303 1836113 : if (!UseMLOC.IsCall && lifetimeEndsAt(MD, UseMLOC.getLoc(), *AA)) {
1304 : // Reset UpperBound to liveOnEntryDef's place in the stack
1305 : UpperBound = 0;
1306 : FoundClobberResult = true;
1307 : LocInfo.AR = MustAlias;
1308 : break;
1309 : }
1310 1836110 : ClobberAlias CA = instructionClobbersQuery(MD, MU, UseMLOC, *AA);
1311 1836110 : if (CA.IsClobber) {
1312 : FoundClobberResult = true;
1313 : LocInfo.AR = CA.AR;
1314 : break;
1315 : }
1316 1597459 : --UpperBound;
1317 : }
1318 :
1319 : // Note: Phis always have AliasResult AR set to MayAlias ATM.
1320 :
1321 : // At the end of this loop, UpperBound is either a clobber, or lower bound
1322 : // PHI walking may cause it to be < LowerBound, and in fact, < LastKill.
1323 140190 : if (FoundClobberResult || UpperBound < LocInfo.LastKill) {
1324 : // We were last killed now by where we got to
1325 1384263 : if (MSSA->isLiveOnEntryDef(VersionStack[UpperBound]))
1326 : LocInfo.AR = None;
1327 814891 : MU->setDefiningAccess(VersionStack[UpperBound], true, LocInfo.AR);
1328 461421 : LocInfo.LastKill = UpperBound;
1329 : } else {
1330 : // Otherwise, we checked all the new ones, and now we know we can get to
1331 : // LastKill.
1332 80621 : MU->setDefiningAccess(VersionStack[LocInfo.LastKill], true, LocInfo.AR);
1333 : }
1334 501753 : LocInfo.LowerBound = VersionStack.size() - 1;
1335 501753 : LocInfo.LowerBoundBlock = BB;
1336 : }
1337 : }
1338 :
1339 : /// Optimize uses to point to their actual clobbering definitions.
1340 44551 : void MemorySSA::OptimizeUses::optimizeUses() {
1341 : SmallVector<MemoryAccess *, 16> VersionStack;
1342 : DenseMap<MemoryLocOrCall, MemlocStackInfo> LocStackInfo;
1343 89102 : VersionStack.push_back(MSSA->getLiveOnEntryDef());
1344 :
1345 44551 : unsigned long StackEpoch = 1;
1346 44551 : unsigned long PopEpoch = 1;
1347 : // We perform a non-recursive top-down dominator tree walk.
1348 386896 : for (const auto *DomNode : depth_first(DT->getRootNode()))
1349 297794 : optimizeUsesInBlock(DomNode->getBlock(), StackEpoch, PopEpoch, VersionStack,
1350 : LocStackInfo);
1351 44551 : }
1352 :
1353 44550 : void MemorySSA::placePHINodes(
1354 : const SmallPtrSetImpl<BasicBlock *> &DefiningBlocks) {
1355 : // Determine where our MemoryPhi's should go
1356 44550 : ForwardIDFCalculator IDFs(*DT);
1357 : IDFs.setDefiningBlocks(DefiningBlocks);
1358 : SmallVector<BasicBlock *, 32> IDFBlocks;
1359 44550 : IDFs.calculate(IDFBlocks);
1360 :
1361 : // Now place MemoryPhi nodes.
1362 106984 : for (auto &BB : IDFBlocks)
1363 62433 : createMemoryPhi(BB);
1364 44551 : }
1365 :
1366 44550 : void MemorySSA::buildMemorySSA() {
1367 : // We create an access to represent "live on entry", for things like
1368 : // arguments or users of globals, where the memory they use is defined before
1369 : // the beginning of the function. We do not actually insert it into the IR.
1370 : // We do not define a live on exit for the immediate uses, and thus our
1371 : // semantics do *not* imply that something with no immediate uses can simply
1372 : // be removed.
1373 44550 : BasicBlock &StartingPoint = F.getEntryBlock();
1374 44550 : LiveOnEntryDef.reset(new MemoryDef(F.getContext(), nullptr, nullptr,
1375 44551 : &StartingPoint, NextID++));
1376 :
1377 : // We maintain lists of memory accesses per-block, trading memory for time. We
1378 : // could just look up the memory access for every possible instruction in the
1379 : // stream.
1380 : SmallPtrSet<BasicBlock *, 32> DefiningBlocks;
1381 : // Go through each block, figure out where defs occur, and chain together all
1382 : // the accesses.
1383 344811 : for (BasicBlock &B : F) {
1384 : bool InsertIntoDef = false;
1385 : AccessList *Accesses = nullptr;
1386 : DefsList *Defs = nullptr;
1387 3673817 : for (Instruction &I : B) {
1388 3373557 : MemoryUseOrDef *MUD = createNewAccess(&I);
1389 3373557 : if (!MUD)
1390 : continue;
1391 :
1392 1713671 : if (!Accesses)
1393 258121 : Accesses = getOrCreateAccessList(&B);
1394 : Accesses->push_back(MUD);
1395 1713671 : if (isa<MemoryDef>(MUD)) {
1396 : InsertIntoDef = true;
1397 1020370 : if (!Defs)
1398 241448 : Defs = getOrCreateDefsList(&B);
1399 : Defs->push_back(*MUD);
1400 : }
1401 : }
1402 300260 : if (InsertIntoDef)
1403 241448 : DefiningBlocks.insert(&B);
1404 : }
1405 44551 : placePHINodes(DefiningBlocks);
1406 :
1407 : // Now do regular SSA renaming on the MemoryDef/MemoryUse. Visited will get
1408 : // filled in with all blocks.
1409 : SmallPtrSet<BasicBlock *, 16> Visited;
1410 44551 : renamePass(DT->getRootNode(), LiveOnEntryDef.get(), Visited);
1411 :
1412 44550 : CachingWalker *Walker = getWalkerImpl();
1413 :
1414 44551 : OptimizeUses(this, Walker, AA, DT).optimizeUses();
1415 :
1416 : // Mark the uses in unreachable blocks as live on entry, so that they go
1417 : // somewhere.
1418 344812 : for (auto &BB : F)
1419 300261 : if (!Visited.count(&BB))
1420 2467 : markUnreachableAsLiveOnEntry(&BB);
1421 44551 : }
1422 :
1423 168012 : MemorySSAWalker *MemorySSA::getWalker() { return getWalkerImpl(); }
1424 :
1425 212562 : MemorySSA::CachingWalker *MemorySSA::getWalkerImpl() {
1426 212562 : if (Walker)
1427 : return Walker.get();
1428 :
1429 44551 : Walker = llvm::make_unique<CachingWalker>(this, AA, DT);
1430 44550 : return Walker.get();
1431 : }
1432 :
1433 : // This is a helper function used by the creation routines. It places NewAccess
1434 : // into the access and defs lists for a given basic block, at the given
1435 : // insertion point.
1436 62720 : void MemorySSA::insertIntoListsForBlock(MemoryAccess *NewAccess,
1437 : const BasicBlock *BB,
1438 : InsertionPlace Point) {
1439 62720 : auto *Accesses = getOrCreateAccessList(BB);
1440 62720 : if (Point == Beginning) {
1441 : // If it's a phi node, it goes first, otherwise, it goes after any phi
1442 : // nodes.
1443 62622 : if (isa<MemoryPhi>(NewAccess)) {
1444 : Accesses->push_front(NewAccess);
1445 62612 : auto *Defs = getOrCreateDefsList(BB);
1446 : Defs->push_front(*NewAccess);
1447 : } else {
1448 : auto AI = find_if_not(
1449 : *Accesses, [](const MemoryAccess &MA) { return isa<MemoryPhi>(MA); });
1450 : Accesses->insert(AI, NewAccess);
1451 10 : if (!isa<MemoryUse>(NewAccess)) {
1452 4 : auto *Defs = getOrCreateDefsList(BB);
1453 : auto DI = find_if_not(
1454 : *Defs, [](const MemoryAccess &MA) { return isa<MemoryPhi>(MA); });
1455 : Defs->insert(DI, *NewAccess);
1456 : }
1457 : }
1458 : } else {
1459 : Accesses->push_back(NewAccess);
1460 98 : if (!isa<MemoryUse>(NewAccess)) {
1461 48 : auto *Defs = getOrCreateDefsList(BB);
1462 : Defs->push_back(*NewAccess);
1463 : }
1464 : }
1465 : BlockNumberingValid.erase(BB);
1466 62720 : }
1467 :
1468 6 : void MemorySSA::insertIntoListsBefore(MemoryAccess *What, const BasicBlock *BB,
1469 : AccessList::iterator InsertPt) {
1470 : auto *Accesses = getWritableBlockAccesses(BB);
1471 : bool WasEnd = InsertPt == Accesses->end();
1472 : Accesses->insert(AccessList::iterator(InsertPt), What);
1473 6 : if (!isa<MemoryUse>(What)) {
1474 6 : auto *Defs = getOrCreateDefsList(BB);
1475 : // If we got asked to insert at the end, we have an easy job, just shove it
1476 : // at the end. If we got asked to insert before an existing def, we also get
1477 : // an iterator. If we got asked to insert before a use, we have to hunt for
1478 : // the next def.
1479 6 : if (WasEnd) {
1480 : Defs->push_back(*What);
1481 3 : } else if (isa<MemoryDef>(InsertPt)) {
1482 : Defs->insert(InsertPt->getDefsIterator(), *What);
1483 : } else {
1484 3 : while (InsertPt != Accesses->end() && !isa<MemoryDef>(InsertPt))
1485 : ++InsertPt;
1486 : // Either we found a def, or we are inserting at the end
1487 1 : if (InsertPt == Accesses->end())
1488 : Defs->push_back(*What);
1489 : else
1490 : Defs->insert(InsertPt->getDefsIterator(), *What);
1491 : }
1492 : }
1493 : BlockNumberingValid.erase(BB);
1494 6 : }
1495 :
1496 70 : void MemorySSA::prepareForMoveTo(MemoryAccess *What, BasicBlock *BB) {
1497 : // Keep it in the lookup tables, remove from the lists
1498 70 : removeFromLists(What, false);
1499 :
1500 : // Note that moving should implicitly invalidate the optimized state of a
1501 : // MemoryUse (and Phis can't be optimized). However, it doesn't do so for a
1502 : // MemoryDef.
1503 : if (auto *MD = dyn_cast<MemoryDef>(What))
1504 : MD->resetOptimized();
1505 : What->setBlock(BB);
1506 70 : }
1507 :
1508 : // Move What before Where in the IR. The end result is that What will belong to
1509 : // the right lists and have the right Block set, but will not otherwise be
1510 : // correct. It will not have the right defining access, and if it is a def,
1511 : // things below it will not properly be updated.
1512 4 : void MemorySSA::moveTo(MemoryUseOrDef *What, BasicBlock *BB,
1513 : AccessList::iterator Where) {
1514 4 : prepareForMoveTo(What, BB);
1515 4 : insertIntoListsBefore(What, BB, Where);
1516 4 : }
1517 :
1518 66 : void MemorySSA::moveTo(MemoryAccess *What, BasicBlock *BB,
1519 : InsertionPlace Point) {
1520 66 : if (isa<MemoryPhi>(What)) {
1521 : assert(Point == Beginning &&
1522 : "Can only move a Phi at the beginning of the block");
1523 : // Update lookup table entry
1524 2 : ValueToMemoryAccess.erase(What->getBlock());
1525 2 : bool Inserted = ValueToMemoryAccess.insert({BB, What}).second;
1526 : (void)Inserted;
1527 : assert(Inserted && "Cannot move a Phi to a block that already has one");
1528 : }
1529 :
1530 66 : prepareForMoveTo(What, BB);
1531 66 : insertIntoListsForBlock(What, BB, Point);
1532 66 : }
1533 :
1534 62610 : MemoryPhi *MemorySSA::createMemoryPhi(BasicBlock *BB) {
1535 : assert(!getMemoryAccess(BB) && "MemoryPhi already exists for this BB");
1536 62610 : MemoryPhi *Phi = new MemoryPhi(BB->getContext(), BB, NextID++);
1537 : // Phi's always are placed at the front of the block.
1538 62610 : insertIntoListsForBlock(Phi, BB, Beginning);
1539 62610 : ValueToMemoryAccess[BB] = Phi;
1540 62610 : return Phi;
1541 : }
1542 :
1543 46 : MemoryUseOrDef *MemorySSA::createDefinedAccess(Instruction *I,
1544 : MemoryAccess *Definition,
1545 : const MemoryUseOrDef *Template) {
1546 : assert(!isa<PHINode>(I) && "Cannot create a defined access for a PHI");
1547 46 : MemoryUseOrDef *NewAccess = createNewAccess(I, Template);
1548 : assert(
1549 : NewAccess != nullptr &&
1550 : "Tried to create a memory access for a non-memory touching instruction");
1551 46 : NewAccess->setDefiningAccess(Definition);
1552 46 : return NewAccess;
1553 : }
1554 :
1555 : // Return true if the instruction has ordering constraints.
1556 : // Note specifically that this only considers stores and loads
1557 : // because others are still considered ModRef by getModRefInfo.
1558 2357429 : static inline bool isOrdered(const Instruction *I) {
1559 : if (auto *SI = dyn_cast<StoreInst>(I)) {
1560 : if (!SI->isUnordered())
1561 0 : return true;
1562 : } else if (auto *LI = dyn_cast<LoadInst>(I)) {
1563 : if (!LI->isUnordered())
1564 4274 : return true;
1565 : }
1566 : return false;
1567 : }
1568 :
1569 : /// Helper function to create new memory accesses
1570 3373603 : MemoryUseOrDef *MemorySSA::createNewAccess(Instruction *I,
1571 : const MemoryUseOrDef *Template) {
1572 : // The assume intrinsic has a control dependency which we model by claiming
1573 : // that it writes arbitrarily. Ignore that fake memory dependency here.
1574 : // FIXME: Replace this special casing with a more accurate modelling of
1575 : // assume's control dependency.
1576 : if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I))
1577 285131 : if (II->getIntrinsicID() == Intrinsic::assume)
1578 : return nullptr;
1579 :
1580 : bool Def, Use;
1581 3373565 : if (Template) {
1582 34 : Def = dyn_cast_or_null<MemoryDef>(Template) != nullptr;
1583 34 : Use = dyn_cast_or_null<MemoryUse>(Template) != nullptr;
1584 : #if !defined(NDEBUG)
1585 : ModRefInfo ModRef = AA->getModRefInfo(I, None);
1586 : bool DefCheck, UseCheck;
1587 : DefCheck = isModSet(ModRef) || isOrdered(I);
1588 : UseCheck = isRefSet(ModRef);
1589 : assert(Def == DefCheck && (Def || Use == UseCheck) && "Invalid template");
1590 : #endif
1591 : } else {
1592 : // Find out what affect this instruction has on memory.
1593 6747062 : ModRefInfo ModRef = AA->getModRefInfo(I, None);
1594 : // The isOrdered check is used to ensure that volatiles end up as defs
1595 : // (atomics end up as ModRef right now anyway). Until we separate the
1596 : // ordering chain from the memory chain, this enables people to see at least
1597 : // some relative ordering to volatiles. Note that getClobberingMemoryAccess
1598 : // will still give an answer that bypasses other volatile loads. TODO:
1599 : // Separate memory aliasing and ordering into two different chains so that
1600 : // we can precisely represent both "what memory will this read/write/is
1601 : // clobbered by" and "what instructions can I move this past".
1602 3373531 : Def = isModSet(ModRef) || isOrdered(I);
1603 : Use = isRefSet(ModRef);
1604 : }
1605 :
1606 : // It's possible for an instruction to not modify memory at all. During
1607 : // construction, we ignore them.
1608 3373565 : if (!Def && !Use)
1609 : return nullptr;
1610 :
1611 : MemoryUseOrDef *MUD;
1612 1713717 : if (Def)
1613 1020403 : MUD = new MemoryDef(I->getContext(), nullptr, I, I->getParent(), NextID++);
1614 : else
1615 693314 : MUD = new MemoryUse(I->getContext(), nullptr, I, I->getParent());
1616 1713717 : ValueToMemoryAccess[I] = MUD;
1617 1713717 : return MUD;
1618 : }
1619 :
1620 : /// Returns true if \p Replacer dominates \p Replacee .
1621 0 : bool MemorySSA::dominatesUse(const MemoryAccess *Replacer,
1622 : const MemoryAccess *Replacee) const {
1623 : if (isa<MemoryUseOrDef>(Replacee))
1624 0 : return DT->dominates(Replacer->getBlock(), Replacee->getBlock());
1625 : const auto *MP = cast<MemoryPhi>(Replacee);
1626 : // For a phi node, the use occurs in the predecessor block of the phi node.
1627 : // Since we may occur multiple times in the phi node, we have to check each
1628 : // operand to ensure Replacer dominates each operand where Replacee occurs.
1629 0 : for (const Use &Arg : MP->operands()) {
1630 0 : if (Arg.get() != Replacee &&
1631 0 : !DT->dominates(Replacer->getBlock(), MP->getIncomingBlock(Arg)))
1632 : return false;
1633 : }
1634 : return true;
1635 : }
1636 :
1637 : /// Properly remove \p MA from all of MemorySSA's lookup tables.
1638 27974 : void MemorySSA::removeFromLookups(MemoryAccess *MA) {
1639 : assert(MA->use_empty() &&
1640 : "Trying to remove memory access that still has uses");
1641 27974 : BlockNumbering.erase(MA);
1642 : if (auto *MUD = dyn_cast<MemoryUseOrDef>(MA))
1643 27838 : MUD->setDefiningAccess(nullptr);
1644 : // Invalidate our walker's cache if necessary
1645 27974 : if (!isa<MemoryUse>(MA))
1646 502 : Walker->invalidateInfo(MA);
1647 :
1648 : Value *MemoryInst;
1649 : if (const auto *MUD = dyn_cast<MemoryUseOrDef>(MA))
1650 27838 : MemoryInst = MUD->getMemoryInst();
1651 : else
1652 136 : MemoryInst = MA->getBlock();
1653 :
1654 27974 : auto VMA = ValueToMemoryAccess.find(MemoryInst);
1655 27974 : if (VMA->second == MA)
1656 : ValueToMemoryAccess.erase(VMA);
1657 27974 : }
1658 :
1659 : /// Properly remove \p MA from all of MemorySSA's lists.
1660 : ///
1661 : /// Because of the way the intrusive list and use lists work, it is important to
1662 : /// do removal in the right order.
1663 : /// ShouldDelete defaults to true, and will cause the memory access to also be
1664 : /// deleted, not just removed.
1665 28044 : void MemorySSA::removeFromLists(MemoryAccess *MA, bool ShouldDelete) {
1666 28044 : BasicBlock *BB = MA->getBlock();
1667 : // The access list owns the reference, so we erase it from the non-owning list
1668 : // first.
1669 28044 : if (!isa<MemoryUse>(MA)) {
1670 529 : auto DefsIt = PerBlockDefs.find(BB);
1671 : std::unique_ptr<DefsList> &Defs = DefsIt->second;
1672 : Defs->remove(*MA);
1673 529 : if (Defs->empty())
1674 : PerBlockDefs.erase(DefsIt);
1675 : }
1676 :
1677 : // The erase call here will delete it. If we don't want it deleted, we call
1678 : // remove instead.
1679 28044 : auto AccessIt = PerBlockAccesses.find(BB);
1680 : std::unique_ptr<AccessList> &Accesses = AccessIt->second;
1681 28044 : if (ShouldDelete)
1682 27974 : Accesses->erase(MA);
1683 : else
1684 : Accesses->remove(MA);
1685 :
1686 28044 : if (Accesses->empty()) {
1687 : PerBlockAccesses.erase(AccessIt);
1688 : BlockNumberingValid.erase(BB);
1689 : }
1690 28044 : }
1691 :
1692 88 : void MemorySSA::print(raw_ostream &OS) const {
1693 : MemorySSAAnnotatedWriter Writer(this);
1694 88 : F.print(OS, &Writer);
1695 88 : }
1696 :
1697 : #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1698 : LLVM_DUMP_METHOD void MemorySSA::dump() const { print(dbgs()); }
1699 : #endif
1700 :
1701 595 : void MemorySSA::verifyMemorySSA() const {
1702 595 : verifyDefUses(F);
1703 595 : verifyDomination(F);
1704 595 : verifyOrdering(F);
1705 595 : verifyDominationNumbers(F);
1706 : Walker->verify(this);
1707 595 : verifyClobberSanity(F);
1708 595 : }
1709 :
1710 : /// Check sanity of the clobbering instruction for access MA.
1711 0 : void MemorySSA::checkClobberSanityAccess(const MemoryAccess *MA) const {
1712 : if (const auto *MUD = dyn_cast<MemoryUseOrDef>(MA)) {
1713 0 : if (!MUD->isOptimized())
1714 0 : return;
1715 0 : auto *I = MUD->getMemoryInst();
1716 0 : auto Loc = MemoryLocation::getOrNone(I);
1717 0 : if (Loc == None)
1718 : return;
1719 : auto *Clobber = MUD->getOptimized();
1720 0 : UpwardsMemoryQuery Q(I, MUD);
1721 0 : checkClobberSanity(MUD, Clobber, *Loc, *this, Q, *AA, true);
1722 : }
1723 : }
1724 :
1725 595 : void MemorySSA::verifyClobberSanity(const Function &F) const {
1726 : #if !defined(NDEBUG) && defined(EXPENSIVE_CHECKS)
1727 : for (const BasicBlock &BB : F) {
1728 : const AccessList *Accesses = getBlockAccesses(&BB);
1729 : if (!Accesses)
1730 : continue;
1731 : for (const MemoryAccess &MA : *Accesses)
1732 : checkClobberSanityAccess(&MA);
1733 : }
1734 : #endif
1735 595 : }
1736 :
1737 : /// Verify that all of the blocks we believe to have valid domination numbers
1738 : /// actually have valid domination numbers.
1739 595 : void MemorySSA::verifyDominationNumbers(const Function &F) const {
1740 : #ifndef NDEBUG
1741 : if (BlockNumberingValid.empty())
1742 : return;
1743 :
1744 : SmallPtrSet<const BasicBlock *, 16> ValidBlocks = BlockNumberingValid;
1745 : for (const BasicBlock &BB : F) {
1746 : if (!ValidBlocks.count(&BB))
1747 : continue;
1748 :
1749 : ValidBlocks.erase(&BB);
1750 :
1751 : const AccessList *Accesses = getBlockAccesses(&BB);
1752 : // It's correct to say an empty block has valid numbering.
1753 : if (!Accesses)
1754 : continue;
1755 :
1756 : // Block numbering starts at 1.
1757 : unsigned long LastNumber = 0;
1758 : for (const MemoryAccess &MA : *Accesses) {
1759 : auto ThisNumberIter = BlockNumbering.find(&MA);
1760 : assert(ThisNumberIter != BlockNumbering.end() &&
1761 : "MemoryAccess has no domination number in a valid block!");
1762 :
1763 : unsigned long ThisNumber = ThisNumberIter->second;
1764 : assert(ThisNumber > LastNumber &&
1765 : "Domination numbers should be strictly increasing!");
1766 : LastNumber = ThisNumber;
1767 : }
1768 : }
1769 :
1770 : assert(ValidBlocks.empty() &&
1771 : "All valid BasicBlocks should exist in F -- dangling pointers?");
1772 : #endif
1773 595 : }
1774 :
1775 : /// Verify that the order and existence of MemoryAccesses matches the
1776 : /// order and existence of memory affecting instructions.
1777 595 : void MemorySSA::verifyOrdering(Function &F) const {
1778 : #ifndef NDEBUG
1779 : // Walk all the blocks, comparing what the lookups think and what the access
1780 : // lists think, as well as the order in the blocks vs the order in the access
1781 : // lists.
1782 : SmallVector<MemoryAccess *, 32> ActualAccesses;
1783 : SmallVector<MemoryAccess *, 32> ActualDefs;
1784 : for (BasicBlock &B : F) {
1785 : const AccessList *AL = getBlockAccesses(&B);
1786 : const auto *DL = getBlockDefs(&B);
1787 : MemoryAccess *Phi = getMemoryAccess(&B);
1788 : if (Phi) {
1789 : ActualAccesses.push_back(Phi);
1790 : ActualDefs.push_back(Phi);
1791 : }
1792 :
1793 : for (Instruction &I : B) {
1794 : MemoryAccess *MA = getMemoryAccess(&I);
1795 : assert((!MA || (AL && (isa<MemoryUse>(MA) || DL))) &&
1796 : "We have memory affecting instructions "
1797 : "in this block but they are not in the "
1798 : "access list or defs list");
1799 : if (MA) {
1800 : ActualAccesses.push_back(MA);
1801 : if (isa<MemoryDef>(MA))
1802 : ActualDefs.push_back(MA);
1803 : }
1804 : }
1805 : // Either we hit the assert, really have no accesses, or we have both
1806 : // accesses and an access list.
1807 : // Same with defs.
1808 : if (!AL && !DL)
1809 : continue;
1810 : assert(AL->size() == ActualAccesses.size() &&
1811 : "We don't have the same number of accesses in the block as on the "
1812 : "access list");
1813 : assert((DL || ActualDefs.size() == 0) &&
1814 : "Either we should have a defs list, or we should have no defs");
1815 : assert((!DL || DL->size() == ActualDefs.size()) &&
1816 : "We don't have the same number of defs in the block as on the "
1817 : "def list");
1818 : auto ALI = AL->begin();
1819 : auto AAI = ActualAccesses.begin();
1820 : while (ALI != AL->end() && AAI != ActualAccesses.end()) {
1821 : assert(&*ALI == *AAI && "Not the same accesses in the same order");
1822 : ++ALI;
1823 : ++AAI;
1824 : }
1825 : ActualAccesses.clear();
1826 : if (DL) {
1827 : auto DLI = DL->begin();
1828 : auto ADI = ActualDefs.begin();
1829 : while (DLI != DL->end() && ADI != ActualDefs.end()) {
1830 : assert(&*DLI == *ADI && "Not the same defs in the same order");
1831 : ++DLI;
1832 : ++ADI;
1833 : }
1834 : }
1835 : ActualDefs.clear();
1836 : }
1837 : #endif
1838 595 : }
1839 :
1840 : /// Verify the domination properties of MemorySSA by checking that each
1841 : /// definition dominates all of its uses.
1842 595 : void MemorySSA::verifyDomination(Function &F) const {
1843 : #ifndef NDEBUG
1844 : for (BasicBlock &B : F) {
1845 : // Phi nodes are attached to basic blocks
1846 : if (MemoryPhi *MP = getMemoryAccess(&B))
1847 : for (const Use &U : MP->uses())
1848 : assert(dominates(MP, U) && "Memory PHI does not dominate it's uses");
1849 :
1850 : for (Instruction &I : B) {
1851 : MemoryAccess *MD = dyn_cast_or_null<MemoryDef>(getMemoryAccess(&I));
1852 : if (!MD)
1853 : continue;
1854 :
1855 : for (const Use &U : MD->uses())
1856 : assert(dominates(MD, U) && "Memory Def does not dominate it's uses");
1857 : }
1858 : }
1859 : #endif
1860 595 : }
1861 :
1862 : /// Verify the def-use lists in MemorySSA, by verifying that \p Use
1863 : /// appears in the use list of \p Def.
1864 0 : void MemorySSA::verifyUseInDefs(MemoryAccess *Def, MemoryAccess *Use) const {
1865 : #ifndef NDEBUG
1866 : // The live on entry use may cause us to get a NULL def here
1867 : if (!Def)
1868 : assert(isLiveOnEntryDef(Use) &&
1869 : "Null def but use not point to live on entry def");
1870 : else
1871 : assert(is_contained(Def->users(), Use) &&
1872 : "Did not find use in def's use list");
1873 : #endif
1874 0 : }
1875 :
1876 : /// Verify the immediate use information, by walking all the memory
1877 : /// accesses and verifying that, for each use, it appears in the
1878 : /// appropriate def's use list
1879 595 : void MemorySSA::verifyDefUses(Function &F) const {
1880 : #ifndef NDEBUG
1881 : for (BasicBlock &B : F) {
1882 : // Phi nodes are attached to basic blocks
1883 : if (MemoryPhi *Phi = getMemoryAccess(&B)) {
1884 : assert(Phi->getNumOperands() == static_cast<unsigned>(std::distance(
1885 : pred_begin(&B), pred_end(&B))) &&
1886 : "Incomplete MemoryPhi Node");
1887 : for (unsigned I = 0, E = Phi->getNumIncomingValues(); I != E; ++I) {
1888 : verifyUseInDefs(Phi->getIncomingValue(I), Phi);
1889 : assert(find(predecessors(&B), Phi->getIncomingBlock(I)) !=
1890 : pred_end(&B) &&
1891 : "Incoming phi block not a block predecessor");
1892 : }
1893 : }
1894 :
1895 : for (Instruction &I : B) {
1896 : if (MemoryUseOrDef *MA = getMemoryAccess(&I)) {
1897 : verifyUseInDefs(MA->getDefiningAccess(), MA);
1898 : }
1899 : }
1900 : }
1901 : #endif
1902 595 : }
1903 :
1904 : /// Perform a local numbering on blocks so that instruction ordering can be
1905 : /// determined in constant time.
1906 : /// TODO: We currently just number in order. If we numbered by N, we could
1907 : /// allow at least N-1 sequences of insertBefore or insertAfter (and at least
1908 : /// log2(N) sequences of mixed before and after) without needing to invalidate
1909 : /// the numbering.
1910 6527 : void MemorySSA::renumberBlock(const BasicBlock *B) const {
1911 : // The pre-increment ensures the numbers really start at 1.
1912 : unsigned long CurrentNumber = 0;
1913 : const AccessList *AL = getBlockAccesses(B);
1914 : assert(AL != nullptr && "Asking to renumber an empty block");
1915 122853 : for (const auto &I : *AL)
1916 116326 : BlockNumbering[&I] = ++CurrentNumber;
1917 6527 : BlockNumberingValid.insert(B);
1918 6527 : }
1919 :
1920 : /// Determine, for two memory accesses in the same block,
1921 : /// whether \p Dominator dominates \p Dominatee.
1922 : /// \returns True if \p Dominator dominates \p Dominatee.
1923 22933 : bool MemorySSA::locallyDominates(const MemoryAccess *Dominator,
1924 : const MemoryAccess *Dominatee) const {
1925 22933 : const BasicBlock *DominatorBlock = Dominator->getBlock();
1926 :
1927 : assert((DominatorBlock == Dominatee->getBlock()) &&
1928 : "Asking for local domination when accesses are in different blocks!");
1929 : // A node dominates itself.
1930 22933 : if (Dominatee == Dominator)
1931 : return true;
1932 :
1933 : // When Dominatee is defined on function entry, it is not dominated by another
1934 : // memory access.
1935 22933 : if (isLiveOnEntryDef(Dominatee))
1936 : return false;
1937 :
1938 : // When Dominator is defined on function entry, it dominates the other memory
1939 : // access.
1940 22933 : if (isLiveOnEntryDef(Dominator))
1941 : return true;
1942 :
1943 21435 : if (!BlockNumberingValid.count(DominatorBlock))
1944 6527 : renumberBlock(DominatorBlock);
1945 :
1946 42870 : unsigned long DominatorNum = BlockNumbering.lookup(Dominator);
1947 : // All numbers start with 1
1948 : assert(DominatorNum != 0 && "Block was not numbered properly");
1949 21435 : unsigned long DominateeNum = BlockNumbering.lookup(Dominatee);
1950 : assert(DominateeNum != 0 && "Block was not numbered properly");
1951 21435 : return DominatorNum < DominateeNum;
1952 : }
1953 :
1954 257756 : bool MemorySSA::dominates(const MemoryAccess *Dominator,
1955 : const MemoryAccess *Dominatee) const {
1956 257756 : if (Dominator == Dominatee)
1957 : return true;
1958 :
1959 225990 : if (isLiveOnEntryDef(Dominatee))
1960 : return false;
1961 :
1962 223239 : if (Dominator->getBlock() != Dominatee->getBlock())
1963 200308 : return DT->dominates(Dominator->getBlock(), Dominatee->getBlock());
1964 22931 : return locallyDominates(Dominator, Dominatee);
1965 : }
1966 :
1967 0 : bool MemorySSA::dominates(const MemoryAccess *Dominator,
1968 : const Use &Dominatee) const {
1969 0 : if (MemoryPhi *MP = dyn_cast<MemoryPhi>(Dominatee.getUser())) {
1970 : BasicBlock *UseBB = MP->getIncomingBlock(Dominatee);
1971 : // The def must dominate the incoming block of the phi.
1972 0 : if (UseBB != Dominator->getBlock())
1973 0 : return DT->dominates(Dominator->getBlock(), UseBB);
1974 : // If the UseBB and the DefBB are the same, compare locally.
1975 0 : return locallyDominates(Dominator, cast<MemoryAccess>(Dominatee));
1976 : }
1977 : // If it's not a PHI node use, the normal dominates can already handle it.
1978 0 : return dominates(Dominator, cast<MemoryAccess>(Dominatee.getUser()));
1979 : }
1980 :
1981 : const static char LiveOnEntryStr[] = "liveOnEntry";
1982 :
1983 472 : void MemoryAccess::print(raw_ostream &OS) const {
1984 944 : switch (getValueID()) {
1985 73 : case MemoryPhiVal: return static_cast<const MemoryPhi *>(this)->print(OS);
1986 240 : case MemoryDefVal: return static_cast<const MemoryDef *>(this)->print(OS);
1987 159 : case MemoryUseVal: return static_cast<const MemoryUse *>(this)->print(OS);
1988 : }
1989 0 : llvm_unreachable("invalid value id");
1990 : }
1991 :
1992 240 : void MemoryDef::print(raw_ostream &OS) const {
1993 : MemoryAccess *UO = getDefiningAccess();
1994 :
1995 : auto printID = [&OS](MemoryAccess *A) {
1996 : if (A && A->getID())
1997 : OS << A->getID();
1998 : else
1999 : OS << LiveOnEntryStr;
2000 : };
2001 :
2002 240 : OS << getID() << " = MemoryDef(";
2003 240 : printID(UO);
2004 240 : OS << ")";
2005 :
2006 : if (isOptimized()) {
2007 0 : OS << "->";
2008 0 : printID(getOptimized());
2009 :
2010 0 : if (Optional<AliasResult> AR = getOptimizedAccessType())
2011 0 : OS << " " << *AR;
2012 : }
2013 240 : }
2014 :
2015 73 : void MemoryPhi::print(raw_ostream &OS) const {
2016 : bool First = true;
2017 73 : OS << getID() << " = MemoryPhi(";
2018 313 : for (const auto &Op : operands()) {
2019 : BasicBlock *BB = getIncomingBlock(Op);
2020 : MemoryAccess *MA = cast<MemoryAccess>(Op);
2021 167 : if (!First)
2022 : OS << ',';
2023 : else
2024 : First = false;
2025 :
2026 : OS << '{';
2027 167 : if (BB->hasName())
2028 151 : OS << BB->getName();
2029 : else
2030 16 : BB->printAsOperand(OS, false);
2031 : OS << ',';
2032 167 : if (unsigned ID = MA->getID())
2033 : OS << ID;
2034 : else
2035 18 : OS << LiveOnEntryStr;
2036 : OS << '}';
2037 : }
2038 : OS << ')';
2039 73 : }
2040 :
2041 159 : void MemoryUse::print(raw_ostream &OS) const {
2042 : MemoryAccess *UO = getDefiningAccess();
2043 159 : OS << "MemoryUse(";
2044 318 : if (UO && UO->getID())
2045 : OS << UO->getID();
2046 : else
2047 33 : OS << LiveOnEntryStr;
2048 : OS << ')';
2049 :
2050 159 : if (Optional<AliasResult> AR = getOptimizedAccessType())
2051 133 : OS << " " << *AR;
2052 159 : }
2053 :
2054 0 : void MemoryAccess::dump() const {
2055 : // Cannot completely remove virtual function even in release mode.
2056 : #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
2057 : print(dbgs());
2058 : dbgs() << "\n";
2059 : #endif
2060 0 : }
2061 :
2062 : char MemorySSAPrinterLegacyPass::ID = 0;
2063 :
2064 20 : MemorySSAPrinterLegacyPass::MemorySSAPrinterLegacyPass() : FunctionPass(ID) {
2065 20 : initializeMemorySSAPrinterLegacyPassPass(*PassRegistry::getPassRegistry());
2066 20 : }
2067 :
2068 20 : void MemorySSAPrinterLegacyPass::getAnalysisUsage(AnalysisUsage &AU) const {
2069 : AU.setPreservesAll();
2070 : AU.addRequired<MemorySSAWrapperPass>();
2071 20 : }
2072 :
2073 48 : bool MemorySSAPrinterLegacyPass::runOnFunction(Function &F) {
2074 48 : auto &MSSA = getAnalysis<MemorySSAWrapperPass>().getMSSA();
2075 48 : MSSA.print(dbgs());
2076 48 : if (VerifyMemorySSA)
2077 47 : MSSA.verifyMemorySSA();
2078 48 : return false;
2079 : }
2080 :
2081 : AnalysisKey MemorySSAAnalysis::Key;
2082 :
2083 196 : MemorySSAAnalysis::Result MemorySSAAnalysis::run(Function &F,
2084 : FunctionAnalysisManager &AM) {
2085 : auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
2086 : auto &AA = AM.getResult<AAManager>(F);
2087 196 : return MemorySSAAnalysis::Result(llvm::make_unique<MemorySSA>(F, &AA, &DT));
2088 : }
2089 :
2090 38 : PreservedAnalyses MemorySSAPrinterPass::run(Function &F,
2091 : FunctionAnalysisManager &AM) {
2092 38 : OS << "MemorySSA for function: " << F.getName() << "\n";
2093 38 : AM.getResult<MemorySSAAnalysis>(F).getMSSA().print(OS);
2094 :
2095 38 : return PreservedAnalyses::all();
2096 : }
2097 :
2098 35 : PreservedAnalyses MemorySSAVerifierPass::run(Function &F,
2099 : FunctionAnalysisManager &AM) {
2100 35 : AM.getResult<MemorySSAAnalysis>(F).getMSSA().verifyMemorySSA();
2101 :
2102 35 : return PreservedAnalyses::all();
2103 : }
2104 :
2105 : char MemorySSAWrapperPass::ID = 0;
2106 :
2107 3058 : MemorySSAWrapperPass::MemorySSAWrapperPass() : FunctionPass(ID) {
2108 1529 : initializeMemorySSAWrapperPassPass(*PassRegistry::getPassRegistry());
2109 1529 : }
2110 :
2111 44325 : void MemorySSAWrapperPass::releaseMemory() { MSSA.reset(); }
2112 :
2113 1529 : void MemorySSAWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
2114 : AU.setPreservesAll();
2115 : AU.addRequiredTransitive<DominatorTreeWrapperPass>();
2116 : AU.addRequiredTransitive<AAResultsWrapperPass>();
2117 1529 : }
2118 :
2119 44325 : bool MemorySSAWrapperPass::runOnFunction(Function &F) {
2120 44325 : auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
2121 44325 : auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults();
2122 44325 : MSSA.reset(new MemorySSA(F, &AA, &DT));
2123 44325 : return false;
2124 : }
2125 :
2126 0 : void MemorySSAWrapperPass::verifyAnalysis() const { MSSA->verifyMemorySSA(); }
2127 :
2128 2 : void MemorySSAWrapperPass::print(raw_ostream &OS, const Module *M) const {
2129 2 : MSSA->print(OS);
2130 2 : }
2131 :
2132 44551 : MemorySSAWalker::MemorySSAWalker(MemorySSA *M) : MSSA(M) {}
2133 :
2134 44550 : MemorySSA::CachingWalker::CachingWalker(MemorySSA *M, AliasAnalysis *A,
2135 44550 : DominatorTree *D)
2136 44550 : : MemorySSAWalker(M), Walker(*M, *A, *D) {}
2137 :
2138 503 : void MemorySSA::CachingWalker::invalidateInfo(MemoryAccess *MA) {
2139 : if (auto *MUD = dyn_cast<MemoryUseOrDef>(MA))
2140 : MUD->resetOptimized();
2141 503 : }
2142 :
2143 : /// Walk the use-def chains starting at \p MA and find
2144 : /// the MemoryAccess that actually clobbers Loc.
2145 : ///
2146 : /// \returns our clobbering memory access
2147 : MemoryAccess *MemorySSA::CachingWalker::getClobberingMemoryAccess(
2148 : MemoryAccess *StartingAccess, UpwardsMemoryQuery &Q) {
2149 164371 : return Walker.findClobber(StartingAccess, Q);
2150 : }
2151 :
2152 2 : MemoryAccess *MemorySSA::CachingWalker::getClobberingMemoryAccess(
2153 : MemoryAccess *StartingAccess, const MemoryLocation &Loc) {
2154 2 : if (isa<MemoryPhi>(StartingAccess))
2155 : return StartingAccess;
2156 :
2157 : auto *StartingUseOrDef = cast<MemoryUseOrDef>(StartingAccess);
2158 4 : if (MSSA->isLiveOnEntryDef(StartingUseOrDef))
2159 : return StartingUseOrDef;
2160 :
2161 2 : Instruction *I = StartingUseOrDef->getMemoryInst();
2162 :
2163 : // Conservatively, fences are always clobbers, so don't perform the walk if we
2164 : // hit a fence.
2165 2 : if (!ImmutableCallSite(I) && I->isFenceLike())
2166 : return StartingUseOrDef;
2167 :
2168 : UpwardsMemoryQuery Q;
2169 2 : Q.OriginalAccess = StartingUseOrDef;
2170 2 : Q.StartingLoc = Loc;
2171 2 : Q.Inst = I;
2172 : Q.IsCall = false;
2173 :
2174 : // Unlike the other function, do not walk to the def of a def, because we are
2175 : // handed something we already believe is the clobbering access.
2176 : MemoryAccess *DefiningAccess = isa<MemoryUse>(StartingUseOrDef)
2177 2 : ? StartingUseOrDef->getDefiningAccess()
2178 : : StartingUseOrDef;
2179 :
2180 : MemoryAccess *Clobber = getClobberingMemoryAccess(DefiningAccess, Q);
2181 : LLVM_DEBUG(dbgs() << "Starting Memory SSA clobber for " << *I << " is ");
2182 : LLVM_DEBUG(dbgs() << *StartingUseOrDef << "\n");
2183 : LLVM_DEBUG(dbgs() << "Final Memory SSA clobber for " << *I << " is ");
2184 : LLVM_DEBUG(dbgs() << *Clobber << "\n");
2185 : return Clobber;
2186 : }
2187 :
2188 : MemoryAccess *
2189 246598 : MemorySSA::CachingWalker::getClobberingMemoryAccess(MemoryAccess *MA) {
2190 : auto *StartingAccess = dyn_cast<MemoryUseOrDef>(MA);
2191 : // If this is a MemoryPhi, we can't do anything.
2192 : if (!StartingAccess)
2193 : return MA;
2194 :
2195 : // If this is an already optimized use or def, return the optimized result.
2196 : // Note: Currently, we store the optimized def result in a separate field,
2197 : // since we can't use the defining access.
2198 246598 : if (StartingAccess->isOptimized())
2199 : return StartingAccess->getOptimized();
2200 :
2201 164381 : const Instruction *I = StartingAccess->getMemoryInst();
2202 164381 : UpwardsMemoryQuery Q(I, StartingAccess);
2203 : // We can't sanely do anything with a fence, since they conservatively clobber
2204 : // all memory, and have no locations to get pointers from to try to
2205 : // disambiguate.
2206 164381 : if (!Q.IsCall && I->isFenceLike())
2207 : return StartingAccess;
2208 :
2209 164381 : if (isUseTriviallyOptimizableToLiveOnEntry(*MSSA->AA, I)) {
2210 1 : MemoryAccess *LiveOnEntry = MSSA->getLiveOnEntryDef();
2211 1 : StartingAccess->setOptimized(LiveOnEntry);
2212 : StartingAccess->setOptimizedAccessType(None);
2213 1 : return LiveOnEntry;
2214 : }
2215 :
2216 : // Start with the thing we already think clobbers this location
2217 : MemoryAccess *DefiningAccess = StartingAccess->getDefiningAccess();
2218 :
2219 : // At this point, DefiningAccess may be the live on entry def.
2220 : // If it is, we will not get a better result.
2221 328760 : if (MSSA->isLiveOnEntryDef(DefiningAccess)) {
2222 11 : StartingAccess->setOptimized(DefiningAccess);
2223 : StartingAccess->setOptimizedAccessType(None);
2224 11 : return DefiningAccess;
2225 : }
2226 :
2227 : MemoryAccess *Result = getClobberingMemoryAccess(DefiningAccess, Q);
2228 : LLVM_DEBUG(dbgs() << "Starting Memory SSA clobber for " << *I << " is ");
2229 : LLVM_DEBUG(dbgs() << *DefiningAccess << "\n");
2230 : LLVM_DEBUG(dbgs() << "Final Memory SSA clobber for " << *I << " is ");
2231 : LLVM_DEBUG(dbgs() << *Result << "\n");
2232 :
2233 164369 : StartingAccess->setOptimized(Result);
2234 328738 : if (MSSA->isLiveOnEntryDef(Result))
2235 : StartingAccess->setOptimizedAccessType(None);
2236 : else if (Q.AR == MustAlias)
2237 : StartingAccess->setOptimizedAccessType(MustAlias);
2238 :
2239 : return Result;
2240 : }
2241 :
2242 : MemoryAccess *
2243 0 : DoNothingMemorySSAWalker::getClobberingMemoryAccess(MemoryAccess *MA) {
2244 : if (auto *Use = dyn_cast<MemoryUseOrDef>(MA))
2245 : return Use->getDefiningAccess();
2246 : return MA;
2247 : }
2248 :
2249 0 : MemoryAccess *DoNothingMemorySSAWalker::getClobberingMemoryAccess(
2250 : MemoryAccess *StartingAccess, const MemoryLocation &) {
2251 : if (auto *Use = dyn_cast<MemoryUseOrDef>(StartingAccess))
2252 : return Use->getDefiningAccess();
2253 : return StartingAccess;
2254 : }
2255 :
2256 62610 : void MemoryPhi::deleteMe(DerivedUser *Self) {
2257 125220 : delete static_cast<MemoryPhi *>(Self);
2258 62610 : }
2259 :
2260 1064954 : void MemoryDef::deleteMe(DerivedUser *Self) {
2261 2129908 : delete static_cast<MemoryDef *>(Self);
2262 1064954 : }
2263 :
2264 693314 : void MemoryUse::deleteMe(DerivedUser *Self) {
2265 1386628 : delete static_cast<MemoryUse *>(Self);
2266 693314 : }
|