profiling of branches - odd code generation?
Remi Forax
forax at univ-mlv.fr
Thu Jun 4 23:31:08 UTC 2015
The problem is that the bytecode instruction used to restart the
interpreter is different for each branch and the JIT is neither able to
see that the checks do not do side effect nor able to re-balance a tree
of test.
cheers,
Rémi
On 06/05/2015 01:20 AM, Vitaly Davidovich wrote:
> Hi,
>
> Suppose you have a method like this:
>
> private static int f(final int x) {
> if (x == 0)
> return 1;
> else if (x == 1)
> return 2;
> else if (x == 2)
> return 3;
> return 4;
>
> }
>
> If I then call it with x=2 always, the generated asm is not what I
> expect (8u40 with C2 compiler)
>
> # parm0: rsi = int
> # [sp+0x30] (sp of caller)
> 0x00007fcc5970c520: mov %eax,-0x14000(%rsp)
> 0x00007fcc5970c527: push %rbp
> 0x00007fcc5970c528: sub $0x20,%rsp ;*synchronization entry
>
> 0x00007fcc5970c52c: test %esi,%esi
> 0x00007fcc5970c52e: je 0x00007fcc5970c55d ;*ifne
>
> 0x00007fcc5970c530: cmp $0x1,%esi
> 0x00007fcc5970c533: je 0x00007fcc5970c571 ;*if_icmpne
>
> 0x00007fcc5970c535: cmp $0x2,%esi
> 0x00007fcc5970c538: jne 0x00007fcc5970c54b ;*if_icmpne
>
> 0x00007fcc5970c53a: mov $0x3,%eax
> 0x00007fcc5970c53f: add $0x20,%rsp
> 0x00007fcc5970c543: pop %rbp
> 0x00007fcc5970c544: test %eax,0x5e0dab6(%rip)300000 #
> 0x00007fcc5f51a000
> ; {poll_return}
> 0x00007fcc5970c54a: retq
> <snip>
>
> It's checking the if conditions in order, and then jumps to some
> runtime calls (I'm assuming that's for deopt to restore pruned
> branches? Cause I don't see anything that returns 1 or 2 otherwise).
> Why is this code not favoring x=2? I'd have thought this code would be
> something like (after epilogue):
>
> cmp $0x2, %esi
> jne <deopt_or_other_cases>
> mov $0x3, %eax
> retq
>
> Thanks
>
More information about the hotspot-compiler-dev
mailing list