profiling of branches - odd code generation?
Vladimir Kozlov
vladimir.kozlov at oracle.com
Thu Jun 4 23:36:56 UTC 2015
VM does not profiling values. We profiling branches.
When C2 construct control flow graph it follows bytecode. And it can't
eliminate cmp code based only on branch profiling. Profiling still shows
that all cmp bytecodes are always executed - only branches are not
taken. We would eliminate tests if they were on non taken branch.
We generate uncommon traps for branches which were not taken based on
profiling.
Vladimir
On 6/4/15 4:20 PM, 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