Suboptimal code generation in C2?

Vladimir Kozlov vladimir.kozlov at oracle.com
Thu Sep 24 01:09:41 UTC 2015


Could be loop predicates or C2 splits loop (pre-main-post) before we 
collapsed it. But I agree that we could do better.

Aleksey, thank you for filing RFE.

Thanks,
Vladimir

On 9/24/15 3:04 AM, Vitaly Davidovich wrote:
> Thanks Aleksey.
>
> 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.
>
> sent from my phone
>
> Hi,
>
> On 09/23/2015 08:49 PM, Vitaly Davidovich wrote:
>  > Consider this simple method:
>  >
>  >     private static int test(final int ops, int start) {
>  >         for (int i = 0; i < ops; ++i) {
>  >             start++;
>  >         }
>  >         return start;
>  >     }
>
>  > test(int, int):
>  > leal(%rsi,%rdi), %edx
>  > movl%esi, %eax
>  > testl%edi, %edi
>  > cmovg%edx, %eax
>  > ret
>  >
>  > Any ideas on why C2 doesn't generate roughly the same thing? Clang 3.7
>  > and ICC 13.0.1 are almost the same as the GCC output above.
>
> Yup, could be better:
> https://bugs.openjdk.java.net/browse/JDK-8137049
> <https://bugs.openjdk.java.net/browse/JDK-8137049>
>
> I am not entirely sure conditional move is better than a branch in this
> particular case, since $ops is probably always non-negative in practice.
> HotSpot generates a branch there, which is good. The arithmetic dance is
> indeed not very clean -- I'd speculate that's a leftover from loop peeling.
>
> Thanks,
> -Aleksey
>
>
> sent from my phone
>


More information about the hotspot-compiler-dev mailing list