<div dir="ltr">Does Bar have attribute 'read/write none'? Test MSSA->getMemoryAccess(BarInstruction); and see if there's a MemoryAccess associated with the instruction.<div>You should not create an artificial MemoryAccess.<br><div><br></div><div>Alina</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Nov 8, 2021 at 4:36 PM Riyaz Puthiyapurayil <<a href="mailto:Riyaz.Puthiyapurayil@synopsys.com">Riyaz.Puthiyapurayil@synopsys.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-US">
<div class="gmail-m_4078298642651041115WordSection1">
<p class="MsoNormal">Thanks Alina. This is exactly what I wanted to do. But what would “MemoryAccess associated with Bar” be? Notice that in the original code Bar (before I rewrite Bar to BarP), Bar didn’t read any memory. It was passed %foo (target of load)
 by value. Do I have to create an artificial memory access instruction before calling MemorySSA? Am I missing something here?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><b>From:</b> Alina Sbirlea <<a href="mailto:alina.sbirlea@gmail.com" target="_blank">alina.sbirlea@gmail.com</a>> <br>
<b>Sent:</b> Monday, November 8, 2021 1:42 PM<br>
<b>To:</b> Riyaz Puthiyapurayil <<a href="mailto:riyaz@synopsys.com" target="_blank">riyaz@synopsys.com</a>><br>
<b>Cc:</b> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> Re: [llvm-dev] Memory SSA for this problem?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">Hi Riyaz,<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">With MemorySSA you could query clobbering on the G at the Bar callsite using the API: `MemoryAccess *getClobberingMemoryAccess(MemoryAccess *MA, const MemoryLocation &Loc)`, where MA is "the MemoryAccess associated with Bar"->getDefiningAccess()
 and Loc is the memorylocation defining G.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">If the returned clobber access dominates the load, then there are no additional clobbering accesses between the load and the call.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Alina<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Mon, Nov 8, 2021 at 12:19 PM Riyaz Puthiyapurayil via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)">I am trying to figure what is the best way to do the following in LLVM. Specifically wonder if MemorySSA can be used here…any pointers to existing code that does something similar will be useful.</span>
<u></u><u></u></p>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)">Consider this code:<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)">%foo = load i256, i256* @G<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)">…<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)">possible uses of %foo<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)">…<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)">%bar = call i32 @Bar(i256 %foo)<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)">Now if I know that there are no writes to @G between the load and the call, I would like to convert the call to @Bar to a call to @BarP which accepts a pointer to i256:<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33);background:white">%bar = call i32 @BarP(i256* @G)</span><span style="color:rgb(33,33,33)"><u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33);background:white">How can I check if there are no clobbers of @G between the load and the call? @G does not alias with any other memory but there can be writes to @G between the above load and the call and if
 so, the safe thing to do is:</span><span style="color:rgb(33,33,33)"><u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33);background:white">%foop = alloca i256</span><span style="color:rgb(33,33,33)"><u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33);background:white">store i256 %foo, i256* %foop</span><span style="color:rgb(33,33,33)"><u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)">…<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33);background:white">%bar = call i32 @BarP(i256* %foop)</span><span style="color:rgb(33,33,33)"><u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33);background:white">Note that I am trying to avoid creating a copy of %foo on the stack when possible.</span><span style="color:rgb(33,33,33)"><u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33)"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="color:rgb(33,33,33);background:white">The goal here is to keep the wide integer in SSA form (there is performance benefit in doing this) but when I have to pass the wide vector to a library function, I want to pass its address. Since
 @G may be a copy of %foo, I would like to pass @G instead of creating a temp with alloca whenever it is safe to do so. The question is how to check if @G still has the same value as %foo.</span><span style="color:rgb(33,33,33)"><u></u><u></u></span></p>
</div>
<p class="MsoNormal" style="margin-bottom:12pt"><u></u> <u></u></p>
</div>
<div id="gmail-m_4078298642651041115gmail-m_-3585682335794567144ms-outlook-mobile-signature">
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="background:white"><span style="color:rgb(33,33,33)">/Riyaz<u></u><u></u></span></p>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal">_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://urldefense.com/v3/__https:/lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev__;!!A4F2R9G_pg!IiUsjHksGaaFO5c4V01C4QL4ID-PqtsFYsYkU5Cq60T2sVw0wEw_MR75IaZW6i2n0n8VNxNqwL1o$" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><u></u><u></u></p>
</blockquote>
</div>
</div>
</div>

</blockquote></div>