From 2c6b4b67602f6629e6421eaca2ce5c98c48ed8ff Mon Sep 17 00:00:00 2001 From: Alina Sbirlea Date: Mon, 7 Jan 2019 19:38:47 +0000 Subject: [PATCH] [MemorySSA] Add SkipSelfWalker. Summary: Add implementation of SkipSelfWalker. Reviewers: george.burgess.iv Subscribers: sanjoy, jlebar, Prazek, llvm-commits Differential Revision: https://reviews.llvm.org/D56285 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350561 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/MemorySSA.h | 3 ++ lib/Analysis/MemorySSA.cpp | 50 ++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/include/llvm/Analysis/MemorySSA.h b/include/llvm/Analysis/MemorySSA.h index 3384bb83a22..7b6ad79fbe8 100644 --- a/include/llvm/Analysis/MemorySSA.h +++ b/include/llvm/Analysis/MemorySSA.h @@ -703,6 +703,7 @@ public: ~MemorySSA(); MemorySSAWalker *getWalker(); + MemorySSAWalker *getSkipSelfWalker(); /// Given a memory Mod/Ref'ing instruction, get the MemorySSA /// access associated with it. If passed a basic block gets the memory phi @@ -830,6 +831,7 @@ protected: private: class ClobberWalkerBase; class CachingWalker; + class SkipSelfWalker; class OptimizeUses; CachingWalker *getWalkerImpl(); @@ -885,6 +887,7 @@ private: // Memory SSA building info std::unique_ptr WalkerBase; std::unique_ptr Walker; + std::unique_ptr SkipWalker; unsigned NextID; }; diff --git a/lib/Analysis/MemorySSA.cpp b/lib/Analysis/MemorySSA.cpp index 623472cd6df..e471ec7c08c 100644 --- a/lib/Analysis/MemorySSA.cpp +++ b/lib/Analysis/MemorySSA.cpp @@ -994,6 +994,31 @@ public: } }; +class MemorySSA::SkipSelfWalker final : public MemorySSAWalker { + ClobberWalkerBase *Walker; + +public: + SkipSelfWalker(MemorySSA *M, ClobberWalkerBase *W) + : MemorySSAWalker(M), Walker(W) {} + ~SkipSelfWalker() override = default; + + using MemorySSAWalker::getClobberingMemoryAccess; + + MemoryAccess *getClobberingMemoryAccess(MemoryAccess *MA) override; + MemoryAccess *getClobberingMemoryAccess(MemoryAccess *MA, + const MemoryLocation &Loc) override; + + void invalidateInfo(MemoryAccess *MA) override { + if (auto *MUD = dyn_cast(MA)) + MUD->resetOptimized(); + } + + void verify(const MemorySSA *MSSA) override { + MemorySSAWalker::verify(MSSA); + Walker->verify(MSSA); + } +}; + } // end namespace llvm void MemorySSA::renameSuccessorPhis(BasicBlock *BB, MemoryAccess *IncomingVal, @@ -1129,7 +1154,7 @@ void MemorySSA::markUnreachableAsLiveOnEntry(BasicBlock *BB) { MemorySSA::MemorySSA(Function &Func, AliasAnalysis *AA, DominatorTree *DT) : AA(AA), DT(DT), F(Func), LiveOnEntryDef(nullptr), Walker(nullptr), - NextID(0) { + SkipWalker(nullptr), NextID(0) { buildMemorySSA(); } @@ -1467,6 +1492,18 @@ MemorySSA::CachingWalker *MemorySSA::getWalkerImpl() { return Walker.get(); } +MemorySSAWalker *MemorySSA::getSkipSelfWalker() { + if (SkipWalker) + return SkipWalker.get(); + + if (!WalkerBase) + WalkerBase = llvm::make_unique(this, AA, DT); + + SkipWalker = llvm::make_unique(this, WalkerBase.get()); + return SkipWalker.get(); + } + + // This is a helper function used by the creation routines. It places NewAccess // into the access and defs lists for a given basic block, at the given // insertion point. @@ -2297,6 +2334,17 @@ MemorySSA::CachingWalker::getClobberingMemoryAccess(MemoryAccess *MA, return Walker->getClobberingMemoryAccessBase(MA, Loc); } +MemoryAccess * +MemorySSA::SkipSelfWalker::getClobberingMemoryAccess(MemoryAccess *MA) { + return Walker->getClobberingMemoryAccessBase(MA, true); +} + +MemoryAccess * +MemorySSA::SkipSelfWalker::getClobberingMemoryAccess(MemoryAccess *MA, + const MemoryLocation &Loc) { + return Walker->getClobberingMemoryAccessBase(MA, Loc); +} + MemoryAccess * DoNothingMemorySSAWalker::getClobberingMemoryAccess(MemoryAccess *MA) { if (auto *Use = dyn_cast(MA)) -- 2.50.1