<div class="gmail_quote">On 23 May 2012 08:29, Evan Cheng <span dir="ltr"><<a href="mailto:evan.cheng@apple.com" target="_blank">evan.cheng@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Has this been fixed?<br></blockquote><div><br></div><div>Nope.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888">Evan<br>


</font></span><div class="HOEnZb"><div class="h5"><br>
On Apr 30, 2012, at 10:37 PM, Nick Lewycky <<a href="mailto:nicholas@mxc.ca">nicholas@mxc.ca</a>> wrote:<br>
<br>
> Eli Friedman wrote:<br>
>> On Mon, Apr 30, 2012 at 9:03 PM, Nick Lewycky<<a href="mailto:nicholas@mxc.ca">nicholas@mxc.ca</a>>  wrote:<br>
>>> Author: nicholas<br>
>>> Date: Mon Apr 30 23:03:01 2012<br>
>>> New Revision: 155884<br>
>>><br>
>>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=155884&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=155884&view=rev</a><br>
>>> Log:<br>
>>> An instruction in a loop is not guaranteed to be executed just because the loop<br>
>>> has no exit blocks. Fixes PR12706!<br>
>>><br>
>>> Modified:<br>
>>>    llvm/trunk/lib/Transforms/Scalar/LICM.cpp<br>
>>>    llvm/trunk/test/Transforms/LICM/speculate.ll<br>
>>><br>
>>> Modified: llvm/trunk/lib/Transforms/Scalar/LICM.cpp<br>
>>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LICM.cpp?rev=155884&r1=155883&r2=155884&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LICM.cpp?rev=155884&r1=155883&r2=155884&view=diff</a><br>


>>> ==============================================================================<br>
>>> --- llvm/trunk/lib/Transforms/Scalar/LICM.cpp (original)<br>
>>> +++ llvm/trunk/lib/Transforms/Scalar/LICM.cpp Mon Apr 30 23:03:01 2012<br>
>>> @@ -618,6 +618,11 @@<br>
>>>     if (!DT->dominates(Inst.getParent(), ExitBlocks[i]))<br>
>>>       return false;<br>
>>><br>
>>> +  // As a degenerate case, if the loop is statically infinite then we haven't<br>
>>> +  // proven anything since there are no exit blocks.<br>
>>> +  if (ExitBlocks.empty())<br>
>>> +    return false;<br>
>><br>
>> Even if there are exit blocks, you still haven't proven anything; take<br>
>> something like the following, assuming the compiler doesn't know<br>
>> anything about exit():<br>
>><br>
>> int f(int x, int y) {<br>
>>   int n = 0;<br>
>>   for (int i = 0; i<  10; i++) {<br>
>>     exit(0);<br>
>>     n += x / (y+i);<br>
>>   }<br>
>>   return n;<br>
>> }<br>
><br>
> Great point Eli. I was struggling with a different aspect of its design<br>
> (why use exit blocks vs. exiting blocks) but missed this bug. I don't<br>
> have the time to fix it, so I'd appreciate it if you want to take over!<br>
><br>
> Nick<br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br>