<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Apr 11, 2016 at 12:03 PM, Geoff Berry <span dir="ltr"><<a href="mailto:gberry@codeaurora.org" target="_blank">gberry@codeaurora.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div lang="EN-US" link="#0563C1" vlink="#954F72"><div><p class="MsoNormal">Hi All,<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">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]).  </p></div></div></blockquote><div><br></div><div>Thank you</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div lang="EN-US" link="#0563C1" vlink="#954F72"><div><p class="MsoNormal">I have a prototype implementation, but have run into two issues that I could use input from the designers of MemorySSA to resolve:<u></u><u></u></p><p><u></u><span>1)<span style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7pt;line-height:normal;font-family:'Times New Roman'">      </span></span><u></u>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.</p></div></div></blockquote><div>I am working on it, it will be preserved/destroyed like any analysis pass.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div lang="EN-US" link="#0563C1" vlink="#954F72"><div><p><u></u><u></u></p><p><u></u><span>2)<span style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7pt;line-height:normal;font-family:'Times New Roman'">      </span></span><u></u>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?</p></div></div></blockquote><div><br></div><div>For hoisting loads, i have an API that will work abotu to be under review over here:</div><div><a href="http://reviews.llvm.org/D18090">http://reviews.llvm.org/D18090</a></div><div>a load hoist will look something like this to update:</div><div><div><br></div><div>  // We also hoist operands of loads using this function, so check to see if</div><div>  // this is really a memory access before we try to update MemorySSA for it.</div><div>  MemoryAccess *HoistCandAccess = MSSA->getMemoryAccess(HoistCand);</div><div>  if (HoistCandAccess) {</div><div>    MemoryUseOrDef *MUD = cast<MemoryUseOrDef>(HoistCandAccess);</div><div>    // What is happening here is that we are creating the hoisted access</div><div>    // and destroying the old accesses.</div><div>    MSSA->createMemoryAccess(HoistedInst, MUD->getDefiningAccess(), BB,</div><div>                             MemorySSA::End);</div><div>    MSSA->removeMemoryAccess(HoistCandAccess);</div><div>    MSSA->removeMemoryAccess(MSSA->getMemoryAccess(ElseInst));</div><div>  }</div><div><br></div><div><br></div><div>(this is "create a new access with this memorydef as it's definition, kill these two old loads").</div><div><br></div><div><br></div><div>A store sink is slightly harder, but it will be similar.</div><div><br></div><div>Comments welcome!</div><div><br></div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div lang="EN-US" link="#0563C1" vlink="#954F72"><div><p><u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">[1] <a href="http://lists.llvm.org/pipermail/llvm-dev/2015-April/084881.html" target="_blank">http://lists.llvm.org/pipermail/llvm-dev/2015-April/084881.html</a><u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><div style="border:1pt dashed rgb(47,111,171);padding:12pt;background:rgb(249,249,249)"><p class="MsoNormal" style="line-height:15.6pt;border:none;padding:0in;background:rgb(249,249,249)">--<u></u><u></u></p><p class="MsoNormal" style="line-height:15.6pt;border:none;padding:0in;background:rgb(249,249,249)">Geoff Berry<u></u><u></u></p><p class="MsoNormal" style="line-height:15.6pt;border:none;padding:0in;background:rgb(249,249,249)">Employee of Qualcomm Innovation Center, Inc.<u></u><u></u></p><p class="MsoNormal" style="line-height:15.6pt;border:none;padding:0in;background:rgb(249,249,249)"> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project<u></u><u></u></p></div><p class="MsoNormal"><u></u> <u></u></p></div></div></blockquote></div><br></div></div>