Conditional moves vs. branching in unrolled loops

Paul Sandoz paul.sandoz at oracle.com
Wed Jan 6 14:34:29 UTC 2016


> On 6 Jan 2016, at 13:38, Vitaly Davidovich <vitalyd at gmail.com> wrote:
> 
> Perhaps for conditional moves data dependency chains are more costly?
> 
> cmov carries a dependency on both inputs, making it more likely to stall when at least one isn't available whereas the branch still allows cpu to continue with speculative execution.  In a tight loop with a memory access as one input to cmov, the memory op has to retire before cmov can proceed; using cmov when both inputs are already ready (e.g. values in registers) is pretty harmless though and avoids a branch entirely.  cmov also has larger encoding than a branch.
> 

Ok. The generated code for an unrolled loop firsts load array elements into registers before performing the cmovs.


> As the original jira on this issue states, cmov should only be used when the branch is profiled to be unpredictable.  I'm not sure why loops with a max/min accumulator need to be called out separately in this regard - wouldn't the branch profile dictate this anyway?

Yes, that was me not understanding the underlying branch profiling mechanisms.

Paul.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 841 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20160106/eaecba0a/signature-0001.asc>


More information about the hotspot-compiler-dev mailing list