[llvm-dev] [LICM][MemorySSA] Converting LICM pass to use MemorySSA to avoid AliasSet collapse issue

Daniel Berlin via llvm-dev llvm-dev at lists.llvm.org
Mon Apr 11 13:17:09 PDT 2016


On Mon, Apr 11, 2016 at 12:03 PM, Geoff Berry <gberry at codeaurora.org> wrote:

> Hi All,
>
>
>
> I’m looking into converting LICM to use MemorySSA instead of AliasSets to
> determine when it is safe to hoist/sink/promote loads and stores to get
> around the issue of alias set collapse (see discussion [1]).
>

Thank you


> I have a prototype implementation, but have run into two issues that I
> could use input from the designers of MemorySSA to resolve:
>
> 1)      Is MemorySSA intended to be maintained across passes?  More
> specifically how is it intended to interact with the Pass Manager?  In my
> current prototype I’m just building it at the start of LICM.
>
I am working on it, it will be preserved/destroyed like any analysis pass.


> 2)      What is the intended method for dealing with changes to the
> function that invalidate the MemorySSA form?  I see that there is a way to
> remove nodes from the MemorySSA graph, but for other transformations (e.g.
> hoisting a load) am I supposed to just update the MemorySSA graph myself?
>

For hoisting loads, i have an API that will work abotu to be under review
over here:
http://reviews.llvm.org/D18090
a load hoist will look something like this to update:

  // We also hoist operands of loads using this function, so check to see if
  // this is really a memory access before we try to update MemorySSA for
it.
  MemoryAccess *HoistCandAccess = MSSA->getMemoryAccess(HoistCand);
  if (HoistCandAccess) {
    MemoryUseOrDef *MUD = cast<MemoryUseOrDef>(HoistCandAccess);
    // What is happening here is that we are creating the hoisted access
    // and destroying the old accesses.
    MSSA->createMemoryAccess(HoistedInst, MUD->getDefiningAccess(), BB,
                             MemorySSA::End);
    MSSA->removeMemoryAccess(HoistCandAccess);
    MSSA->removeMemoryAccess(MSSA->getMemoryAccess(ElseInst));
  }


(this is "create a new access with this memorydef as it's definition, kill
these two old loads").


A store sink is slightly harder, but it will be similar.

Comments welcome!



>
>
>
>
> [1] http://lists.llvm.org/pipermail/llvm-dev/2015-April/084881.html
>
>
>
> --
>
> Geoff Berry
>
> Employee of Qualcomm Innovation Center, Inc.
>
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux
> Foundation Collaborative Project
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160411/9d97c1b1/attachment.html>


More information about the llvm-dev mailing list