RFR 8223729 [lworld] Initial C1 implementation for -XX:ACmpOnValues=3
Ioi Lam
ioi.lam at oracle.com
Tue May 14 15:38:07 UTC 2019
Hi Tobias, thanks for the review. I will fix the typos and push.
- Ioi
On 5/14/19 2:58 AM, Tobias Hartmann wrote:
> Hi Ioi,
>
> this looks good to me!
>
> Small things:
> - It should be "substitutability" not "substituability".
> - In c1_LIRGenerator.cpp: "We do this only if we are not sure that the operands _are_ value objects"
>
> Thanks,
> Tobias
>
>
> On 11.05.19 00:32, Ioi Lam wrote:
>> https://bugs.openjdk.java.net/browse/JDK-8223729
>> http://cr.openjdk.java.net/~iklam/valhalla/8223729-initial-c1-acmp-on-values-3.v01/
>>
>> This is a rough implementation that passes all the tests in TestNewAcmp, but more optimizations can
>> be done (see FIXME in the code).
>>
>> If both operands are known to be inlined instances, the generated code is:
>>
>> 76: cmp %rdx,%rsi ; x == y ?
>> 79: je L_2
>>
>> 85: cmp $0x0,%rsi ; null check for x
>> 89: je L_4
>> 95: cmp $0x0,%rdx ; null check for y
>> 99: je L_4
>> 105: jmpq L_5
>>
>> L_4 110: mov $0x0,%edi ; not equal
>> 115: jmpq L_7
>>
>>
>> L_5 120: mov %rsi,%rdi ; shuffle parameters for isSubstitutable(x, y)
>> 123: mov %rsi,0x28(%rsp) ; why is this code here?
>> 128: mov %rdi,%rsi
>> 131: mov %rdx,%rdi
>> 134: mov %rdx,0x20(%rsp)
>> 139: mov %rdi,%rdx
>>
>> 142: nop
>> 143: callq 0x00007f9ca0865c20 ; ValueBootstrapMethods::isSubstitutable()
>>
>> 148: cmp $0x1,%eax
>> 151: mov $0x0,%edi
>> 156: jne L_7
>>
>> L_2 162: mov $0x1,%edi
>>
>> L_7 ....
>>
>>
>> Notes:
>>
>> (1) I decided to do the explicit null check, as it may be common to do something like
>>
>> Object x = .., y = a_static_field_thats_null;
>> if (x == y) {...}
>>
>> and I don't want to trigger a signal for every acmp in this situation.
>>
>> (2) The explicit null check can be removed if both operands are not nullable
>> (or with profiling).
>>
>> (3) If x and y are of type Object, etc, there are more checks (lines 41 ~ 89 below).
>> As I mentioned in the FIXME, lines 41~75 can be simplified down to about
>> 5 instructions on x64.
>>
>> 12: cmp %rdx,%rsi
>> 15: je L_1
>> 21: cmp $0x0,%rsi
>> 25: je L_5
>> 31: cmp $0x0,%rdx
>> 35: je L_5
>>
>> // check if x and y are inline types
>> 41: mov $0x405,%rdi
>> 51: mov (%rsi),%rbx
>> 54: and %rdi,%rbx
>> 57: cmp %rdi,%rbx
>> 60: jne L_5
>> 66: mov (%rdx),%rbx
>> 69: and %rdi,%rbx
>> 72: cmp %rdi,%rbx
>> 75: jne L_5
>>
>> // check if x and y of the same type
>> 81: mov 0x8(%rsi),%edi
>> 84: mov 0x8(%rdx),%ebx
>> 87: cmp %ebx,%edi
>> 89: je L_6
>>
>> L_5 95: mov $0x0,%edi
>> 100: jmpq L_8
>>
>> (4) I had to add "-XX:CompileCommand=exclude,java.lang.ClassValue::*" to TestNewAcmp.java for
>> C1, or else ValueBootstrapMethods::isSubstitutable() works incorrectly. I'll investigate that
>> in a follow-on bug.
>>
>> Thanks
>> - Ioi
>>
>>
More information about the valhalla-dev
mailing list