RFR 8223729 [lworld] Initial C1 implementation for -XX:ACmpOnValues=3
Tobias Hartmann
tobias.hartmann at oracle.com
Tue May 14 09:58:02 UTC 2019
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