<p dir="ltr">Thanks Aleksey.</p>
<p dir="ltr">The cmov is probably a non-issue here since both dependencies are in registers.  The arithmetic dance, jumps, and register allocation seems off though.  For instance, esi is cleared with xor then it jumps to code that adds edx to esi, then it moves esi into eax - this could be replaced with moving edx into eax.</p>
<p dir="ltr">sent from my phone</p>
<p dir="ltr">Hi,</p>
<p dir="ltr">On 09/23/2015 08:49 PM, Vitaly Davidovich wrote:<br>
> Consider this simple method:<br>
><br>
>     private static int test(final int ops, int start) {<br>
>         for (int i = 0; i < ops; ++i) {<br>
>             start++;<br>
>         }<br>
>         return start;<br>
>     }</p>
<p dir="ltr">> test(int, int):<br>
> leal(%rsi,%rdi), %edx<br>
> movl%esi, %eax<br>
> testl%edi, %edi<br>
> cmovg%edx, %eax<br>
> ret<br>
><br>
> Any ideas on why C2 doesn't generate roughly the same thing? Clang 3.7<br>
> and ICC 13.0.1 are almost the same as the GCC output above.</p>
<p dir="ltr">Yup, could be better:<br>
 <a href="https://bugs.openjdk.java.net/browse/JDK-8137049"> https://bugs.openjdk.java.net/browse/JDK-8137049</a></p>
<p dir="ltr">I am not entirely sure conditional move is better than a branch in this<br>
particular case, since $ops is probably always non-negative in practice.<br>
HotSpot generates a branch there, which is good. The arithmetic dance is<br>
indeed not very clean -- I'd speculate that's a leftover from loop peeling.</p>
<p dir="ltr">Thanks,<br>
-Aleksey<br><br><br></p>
<p dir="ltr">sent from my phone</p>