While fixing JDK-8270626 it was discovered that the C2 intrinsic for 
`Reference.refersTo()` is not used as often as one would think. Instead C2 
often prefers using the native implementation, which is much slower which 
defeats the purpose of having an intrinsic in the first place.

The problem arise from having `refersTo0()` be virtual, native and 
@IntrinsicCandidate. This can be worked around by introducing an virtual method 
layer and so that `refersTo0()` can be made `final`. That's what this patch 
does, by adding a virtual `refersToImpl()` which in turn calls the now final 
`refersTo0()`.

It should be noted that `Object.clone()` and `Object.hashCode()` are also 
virtual, native and @IntrinsicCandidate and these methods get special treatment 
by C2 to get the intrinsic generated more optimally. We might want to do a 
similar optimization for `Reference.refersTo0()`. In that case, it is suggested 
that such an improvement could come later and be handled as a separate 
enhancement, and @kimbarrett has already filed JDK-8272140 to track that.

Testing:
I found this hard to test without instrumenting Hotspot to tell me that the 
intrinsic was called instead of the native method. So, for that reason testing 
was ad-hoc, using an instrumented Hotspot in combination with the test 
(`vmTestbase/gc/gctests/PhantomReference/phantom002/TestDescription.java`) that 
initially uncovered the problem. See JDK-8270626 for additional information.

-------------

Commit messages:
 - 8271862: C2 intrinsic for Reference.refersTo() is often not used

Changes: https://git.openjdk.java.net/jdk/pull/5052/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=5052&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8271862
  Stats: 14 lines in 2 files changed: 11 ins; 0 del; 3 mod
  Patch: https://git.openjdk.java.net/jdk/pull/5052.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/5052/head:pull/5052

PR: https://git.openjdk.java.net/jdk/pull/5052

Reply via email to