<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 11, 2019 at 9:09 AM Davis, Alan via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</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">I have some machine code that looks something like:<br>
<br>
        flag = true<br>
        c = call()<br>
        if (c)<br>
                flag = false<br>
                ...<br>
        ...<br>
        if (flag) ...<br>
<br>
The 'flag' variable is a Boolean value of type i1. The target has 1-bit condition registers but none are preserved across calls. So flag is spilled to memory, resulting in terrible code.<br></blockquote><div><br></div><div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">If the code looks like this at the IR level (in SSA):<br></div></div><div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">bb1:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">c = call()</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">if (c)</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  bb2:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  ...</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">bb3:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">flag = phi [ true, bb1 ], [ false, bb2 ]</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">if (flag) ...</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">and copy instructions are inserted when going out of SSA, wouldn't "flag = true" typically be inserted at the end of bb1 (ie. after the call)?</div></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
There is no dependency between the flag=true instruction and the call, so I'd like to move it after the call. I was hoping the front end would do it via TargetTransformInfo::getCostOfKeepingLiveOverCall.  But apparently that only applies to vectorization transforms.<br>
<br>
The pre-RA MachineScheduler won't do it either, because scheduling regions are delimited by calls. (From MachineScheduler.cpp: "MachineScheduler does not currently support scheduling across calls.")<br>
<br>
Is there some standard way in the front end or codegen to make this happen?<br>
<br>
-Alan<br>
_______________________________________________<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://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div></div>