[13] RFR (S): 8075052: Autobox elimination hinders loop unrolling
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Mon Feb 4 18:56:30 UTC 2019
> So loop is not unrolled because of IntegerCache checks in valueOf()?
> I assume valueOf() is inlined and the check is the only difference from
> new Integer(). Right?
> And the check should be collapsing too if result is not used. So why
> loop is not counted?
Sorry, the title is very misleading. I don't remember all the details,
but it seems I confused 2 loops - main and post loops - when filed the bug.
Main loop is counted and unrolled, but full of the following code pattern:
0x00000001174210c0: mov 0x10(%rdi,%r10,4),%r9d
0x00000001174210c5: mov %r9d,%r11d
0x00000001174210c8: add $0x80,%r11d
0x00000001174210cf: cmp $0x100,%r11d
0x00000001174210d6: jae 0x000000011742120b
...
0x00000001174211b8: add $0x8,%r10d
0x00000001174211bc: cmp %ebx,%r10d
0x00000001174211bf: jl 0x00000001174210c0 ; loop back edge
...
0x000000011742120b: mov %r9d,%r8d
0x000000011742120e: mov %eax,%ebp
0x0000000117421210: jmp 0x000000011742123c
...
0x000000011742123c: mov $0xffffff45,%esi
0x0000000117421241: mov %r10d,(%rsp)
0x0000000117421245: mov %r8d,0x8(%rsp)
0x000000011742124a: mov %rcx,0x10(%rsp)
0x000000011742124f: callq 0x00000001173b23a0 ; {runtime_call
UncommonTrapBlob}
It's a left-over from IntegerCache checks in Integer.valueOf() which C2
can't fully eliminate.
After the fix the main loop looks as follows:
0x0000000111b54830: add 0x10(%r11,%r8,4),%eax
...
0x0000000111b54853: add 0x2c(%r11,%r8,4),%eax
0x0000000111b54858: add $0x8,%r8d
0x0000000111b5485c: cmp %ecx,%r8d
0x0000000111b5485f: jl 0x0000000111b54830
> The only issue I have with it is if you have exception path in code and
> you have to throw an exception (OOM, for example) even when result is
> not used. But on other hand it is similar for normal scalar replaced
> allocation since exception can come only from allocation in valueOf().
Yes, by calling it "pure" I meant all side effects occur only as part of
result computation. If result value isn't needed, it's safe to get rid
of all the side effects as part of computation elimination.
> Code change is fine to me. I just want more information about the cause.
Thanks for review! I'll experiment with annotation John & Remi suggested.
Best regards,
Vladimir Ivanov
> On 2/1/19 7:19 PM, Vladimir Ivanov wrote:
>> http://cr.openjdk.java.net/~vlivanov/8075052/webrev.00/
>> https://bugs.openjdk.java.net/browse/JDK-8075052
>>
>> C2 doesn't optimize Integer.valueOf() as good as new Integer().
>> (There's a benchmark in the bug which demonstrates the difference.)
>>
>> It is caused by the fact that though Integer.intValue() can see
>> through the call, the call itself isn't optimized away if the result
>> (box) is not used. It is unconditionally inlined and hinders
>> consequent optimizations.
>>
>> Proposed fix is to treat Integer.valueOf() as if it were a pure method
>> and remove the call if its result (boxed value) isn't used.
>>
>> Testing: hs-precheckin-comp, tier1-7 (in progress)
>>
>> Best regards,
>> Vladimir Ivanov
More information about the hotspot-compiler-dev
mailing list