[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