[llvm] r299322 - MemorySSA: Add support for caching clobbering access in stores
Daniel Berlin via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 4 01:25:51 PDT 2017
This change is broken somehow, i'm debugging.
I have a suspicion it's related to the interaction between how the walker
works and the def_chain iterator change.
You can see the cache hands back different results and if you turn on
expensive checks, it'll assert.
If it's a simple matter of not caching, i'll fix it with the caching
removal, otherwise, i'm going to see what's up and probably revert this.
(Nobody other than the patch i have for newgvn refines stores, so nobody
else is broken, or i'd just revert now)
On Sat, Apr 1, 2017 at 10:09 PM, Daniel Berlin via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: dannyb
> Date: Sun Apr 2 00:09:15 2017
> New Revision: 299322
>
> URL: http://llvm.org/viewvc/llvm-project?rev=299322&view=rev
> Log:
> MemorySSA: Add support for caching clobbering access in stores
>
> Summary:
> This enables us to cache the clobbering access for stores, despite the
> fact that we can't rewrite the use-def chains themselves.
>
> Early testing shows that, after this change, for larger testcases, it will
> be a significant net positive (memory and time) to remove the walker
> caching.
>
> Reviewers: george.burgess.iv, davide
>
> Subscribers: Prazek, llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D31567
>
> Modified:
> llvm/trunk/include/llvm/Transforms/Utils/MemorySSA.h
> llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp
> llvm/trunk/lib/Transforms/Utils/MemorySSAUpdater.cpp
>
> Modified: llvm/trunk/include/llvm/Transforms/Utils/MemorySSA.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/Transforms/Utils/MemorySSA.h?rev=299322&r1=299321&r2=299322&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/Transforms/Utils/MemorySSA.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Utils/MemorySSA.h Sun Apr 2
> 00:09:15 2017
> @@ -246,6 +246,16 @@ public:
> return MA->getValueID() == MemoryUseVal || MA->getValueID() ==
> MemoryDefVal;
> }
>
> + // Sadly, these have to be public because they are needed in some of
> the iterators.
> + virtual bool isOptimized() const = 0;
> + virtual MemoryAccess *getOptimized() const = 0;
> + virtual void setOptimized(MemoryAccess *) = 0;
> +
> + /// \brief Reset the ID of what this MemoryUse was optimized to,
> causing it to
> + /// be rewalked by the walker if necessary.
> + /// This really should only be called by tests.
> + virtual void resetOptimized() = 0;
> +
> protected:
> friend class MemorySSA;
> friend class MemorySSAUpdater;
> @@ -254,8 +264,12 @@ protected:
> : MemoryAccess(C, Vty, BB, 1), MemoryInst(MI) {
> setDefiningAccess(DMA);
> }
> -
> - void setDefiningAccess(MemoryAccess *DMA) { setOperand(0, DMA); }
> + void setDefiningAccess(MemoryAccess *DMA, bool Optimized = false) {
> + setOperand(0, DMA);
> + if (!Optimized)
> + return;
> + setOptimized(DMA);
> + }
>
> private:
> Instruction *MemoryInst;
> @@ -288,20 +302,18 @@ public:
>
> void print(raw_ostream &OS) const override;
>
> - void setDefiningAccess(MemoryAccess *DMA, bool Optimized = false) {
> - if (Optimized)
> - OptimizedID = DMA->getID();
> - MemoryUseOrDef::setDefiningAccess(DMA);
> + virtual void setOptimized(MemoryAccess *DMA) override {
> + OptimizedID = DMA->getID();
> }
>
> - bool isOptimized() const {
> + virtual bool isOptimized() const override {
> return getDefiningAccess() && OptimizedID ==
> getDefiningAccess()->getID();
> }
>
> - /// \brief Reset the ID of what this MemoryUse was optimized to,
> causing it to
> - /// be rewalked by the walker if necessary.
> - /// This really should only be called by tests.
> - void resetOptimized() { OptimizedID = INVALID_MEMORYACCESS_ID; }
> + virtual MemoryAccess *getOptimized() const override {
> + return getDefiningAccess();
> + }
> + virtual void resetOptimized() override { OptimizedID =
> INVALID_MEMORYACCESS_ID; }
>
> protected:
> friend class MemorySSA;
> @@ -333,7 +345,8 @@ public:
>
> MemoryDef(LLVMContext &C, MemoryAccess *DMA, Instruction *MI,
> BasicBlock *BB,
> unsigned Ver)
> - : MemoryUseOrDef(C, DMA, MemoryDefVal, MI, BB), ID(Ver) {}
> + : MemoryUseOrDef(C, DMA, MemoryDefVal, MI, BB), ID(Ver),
> + Optimized(nullptr), OptimizedID(INVALID_MEMORYACCESS_ID) {}
>
> // allocate space for exactly one operand
> void *operator new(size_t s) { return User::operator new(s, 1); }
> @@ -343,6 +356,17 @@ public:
> return MA->getValueID() == MemoryDefVal;
> }
>
> + virtual void setOptimized(MemoryAccess *MA) override {
> + Optimized = MA;
> + OptimizedID = getDefiningAccess()->getID();
> + }
> + virtual MemoryAccess *getOptimized() const override { return Optimized;
> }
> + virtual bool isOptimized() const override {
> + return getOptimized() && OptimizedID == getDefiningAccess()->getID();
> + }
> + virtual void resetOptimized() override { OptimizedID =
> INVALID_MEMORYACCESS_ID; }
> +
> +
> void print(raw_ostream &OS) const override;
>
> protected:
> @@ -352,6 +376,8 @@ protected:
>
> private:
> const unsigned ID;
> + MemoryAccess *Optimized;
> + unsigned int OptimizedID;
> };
>
> template <>
> @@ -1075,10 +1101,15 @@ struct def_chain_iterator
>
> def_chain_iterator &operator++() {
> // N.B. liveOnEntry has a null defining access.
> - if (auto *MUD = dyn_cast<MemoryUseOrDef>(MA))
> - MA = MUD->getDefiningAccess();
> - else
> + if (auto *MUD = dyn_cast<MemoryUseOrDef>(MA)) {
> + if (MUD->isOptimized())
> + MA = MUD->getOptimized();
> + else
> + MA = MUD->getDefiningAccess();
> + } else {
> MA = nullptr;
> + }
> +
> return *this;
> }
>
>
> Modified: llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> Transforms/Utils/MemorySSA.cpp?rev=299322&r1=299321&r2=299322&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp Sun Apr 2 00:09:15 2017
> @@ -2181,9 +2181,9 @@ MemorySSA::CachingWalker::getClobberingM
> // If this is an already optimized use or def, return the optimized
> result.
> // Note: Currently, we do not store the optimized def result because
> we'd need
> // a separate field, since we can't use it as the defining access.
> - if (MemoryUse *MU = dyn_cast<MemoryUse>(StartingAccess))
> - if (MU->isOptimized())
> - return MU->getDefiningAccess();
> + if (auto *MUD = dyn_cast<MemoryUseOrDef>(StartingAccess))
> + if (MUD->isOptimized())
> + return MUD->getOptimized();
>
> const Instruction *I = StartingAccess->getMemoryInst();
> UpwardsMemoryQuery Q(I, StartingAccess);
> @@ -2199,8 +2199,8 @@ MemorySSA::CachingWalker::getClobberingM
> if (isUseTriviallyOptimizableToLiveOnEntry(*MSSA->AA, I)) {
> MemoryAccess *LiveOnEntry = MSSA->getLiveOnEntryDef();
> Cache.insert(StartingAccess, LiveOnEntry, Q.StartingLoc, Q.IsCall);
> - if (MemoryUse *MU = dyn_cast<MemoryUse>(StartingAccess))
> - MU->setDefiningAccess(LiveOnEntry, true);
> + if (auto *MUD = dyn_cast<MemoryUseOrDef>(StartingAccess))
> + MUD->setDefiningAccess(LiveOnEntry, true);
> return LiveOnEntry;
> }
>
> @@ -2217,8 +2217,8 @@ MemorySSA::CachingWalker::getClobberingM
> DEBUG(dbgs() << *DefiningAccess << "\n");
> DEBUG(dbgs() << "Final Memory SSA clobber for " << *I << " is ");
> DEBUG(dbgs() << *Result << "\n");
> - if (MemoryUse *MU = dyn_cast<MemoryUse>(StartingAccess))
> - MU->setDefiningAccess(Result, true);
> + if (auto *MUD = dyn_cast<MemoryUseOrDef>(StartingAccess))
> + MUD->setDefiningAccess(Result, true);
>
> return Result;
> }
>
> Modified: llvm/trunk/lib/Transforms/Utils/MemorySSAUpdater.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/
> MemorySSAUpdater.cpp?rev=299322&r1=299321&r2=299322&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Transforms/Utils/MemorySSAUpdater.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/MemorySSAUpdater.cpp Sun Apr 2
> 00:09:15 2017
> @@ -451,8 +451,8 @@ void MemorySSAUpdater::removeMemoryAcces
>
> while (!MA->use_empty()) {
> Use &U = *MA->use_begin();
> - if (MemoryUse *MU = dyn_cast<MemoryUse>(U.getUser()))
> - MU->resetOptimized();
> + if (auto *MUD = dyn_cast<MemoryUseOrDef>(U.getUser()))
> + MUD->resetOptimized();
> U.set(NewDefTarget);
> }
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170404/f0fe116a/attachment.html>
More information about the llvm-commits
mailing list