[PATCH] D26661: [MemorySSA] Define a restricted upward AccessList splice.

Daniel Berlin via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 15 13:36:50 PST 2016


This needs a bunch of unit tests.
:)
Also, you need to invalidate BlockNumberingValid for the from and to blocks.


On Mon, Nov 14, 2016 at 11:17 PM, bryant <3.14472+reviews.llvm.org at gmail.com
> wrote:

> bryant created this revision.
> bryant added reviewers: dberlin, george.burgess.iv, hfinkel.
> bryant added a subscriber: llvm-commits.
> bryant set the repository for this revision to rL LLVM.
>
> This defines an API endpoint that allows clients to move upwards a
> MemoryUse/Def
> *M to just before a MemoryDef *Dest, where Dest and M may reside in
> separate
> BasicBlocks. The following conditions must hold:
>
> - Dest must dominate M,
> - All MemoryAccesses between the Dest and M, as well as Dest itself, must
> be no-alias with M,
> - Dest is MemoryDef (this restriction could probably be lifted).
>
> These conditions allow the splice to be carried out with simple
> replaceAllUsesWith and setDefiningAccess operations. In particular, the
> first
> and second conditions are sufficient conditions for preservation of
> semantics.
>
>
> Repository:
>   rL LLVM
>
> https://reviews.llvm.org/D26661
>
> Files:
>   include/llvm/Transforms/Utils/MemorySSA.h
>   lib/Transforms/Utils/MemorySSA.cpp
>
>
> Index: lib/Transforms/Utils/MemorySSA.cpp
> ===================================================================
> --- lib/Transforms/Utils/MemorySSA.cpp
> +++ lib/Transforms/Utils/MemorySSA.cpp
> @@ -1614,6 +1614,25 @@
>    return NewAccess;
>  }
>
> +void MemorySSA::spliceMemoryAccessAbove(MemoryDef *Where,
> +                                        MemoryUseOrDef *What) {
> +  assert(What != getLiveOnEntryDef() &&
> +         Where != getLiveOnEntryDef() && "Can't splice (above) LOE.");
> +  assert(dominates(Where, What) && "Only upwards splices are permitted.");
> +
> +  if (Where == What)
> +    return;
> +  if (isa<MemoryDef>(What)) {
> +    // TODO: possibly use removeMemoryAccess' more efficient RAUW
> +    What->replaceAllUsesWith(What->getDefiningAccess());
> +    What->setDefiningAccess(Where->getDefiningAccess());
> +    Where->setDefiningAccess(What);
> +  }
> +  AccessList *Src = getWritableBlockAccesses(What->getBlock());
> +  AccessList *Dest = getWritableBlockAccesses(Where->getBlock());
> +  Dest->splice(AccessList::iterator(Where), *Src, What);
> +}
> +
>  /// \brief Helper function to create new memory accesses
>  MemoryUseOrDef *MemorySSA::createNewAccess(Instruction *I) {
>    // The assume intrinsic has a control dependency which we model by
> claiming
> Index: include/llvm/Transforms/Utils/MemorySSA.h
> ===================================================================
> --- include/llvm/Transforms/Utils/MemorySSA.h
> +++ include/llvm/Transforms/Utils/MemorySSA.h
> @@ -570,6 +570,15 @@
>                                            MemoryAccess *Definition,
>                                            MemoryAccess *InsertPt);
>
> +  // \brief Splice \p What to just before \p Where.
> +  //
> +  // In order to be efficient, the following conditions must be met:
> +  //   - \p Where  dominates \p What,
> +  //   - All memory accesses in [\p Where, \p What) are no-alias with \p
> What.
> +  //
> +  // TODO: relax the MemoryDef requirement on Where.
> +  void spliceMemoryAccessAbove(MemoryDef *Where, MemoryUseOrDef *What);
> +
>    /// \brief Remove a MemoryAccess from MemorySSA, including updating all
>    /// definitions and uses.
>    /// This should be called when a memory instruction that has a
> MemoryAccess
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161115/8bc40ad2/attachment.html>


More information about the llvm-commits mailing list