[10] RFR(L): 8132547: [AOT] support invokedynamic instructions
dean.long at oracle.com
dean.long at oracle.com
Tue Oct 17 07:57:00 UTC 2017
New hotspot webrev is here:
http://cr.openjdk.java.net/~dlong/8132547/hs.2/
Comments inlined below...
On 10/16/17 11:06 AM, Vladimir Kozlov wrote:
> I looked more on changes.
>
> First, please, run RBT testing. May be ask SQE to run testing with
> AOTed java.base as they did before.
>
> I did not look on Graal assuming Labs reviewed it already.
> JVMCI changes looks fine to me.
>
> JAOTC. In addition to previous comment about change in
> DataPatchProcessor.java.
> ------
>
> AOTCompiledClass.java - I wish metadataName() was defined in
> corresponding classes instead of manual checking type.
To do that I would probably need to wrap the JVMCI types in new JAOTC
types. I don't want to pollute the JVMCI types.
> It is fine for now but I would add assert for 'else' case that only
> HotSpotResolvedObjectType ref is expected there.
>
Sure, thanks for catching that. The cast will fail with an exception
without the assert, but the assert can give a more informative error
message.
> Should we also unify how we generate method name?
> We use JavaMethodInfo.uniqueMethodName() in few places.
> Then we have AOTHotSpotResolvedJavaMethod.getNameAndSignature().
> And now you added new metadataName().
>
OK, I filed RFE 8189411.
> Hotspot AOT code.
> -----------------
>
> aotLoader.hpp - you don't need 2 methods. Move UseAOT check into .cpp
> code and in .hpp you can do:
>
> static bool reconcile_dynamic_invoke(InstanceKlass* holder, int index,
> Method* adapter_method, Klass *appendix_klass) NOT_AOT({ return true; });
>
> aotCodeHeap.* - I don't like that you have separate
> reconcile_dynamic_klass() method only for one use. Instead of passin
> [2] array pas it as separate parameter so you can pass NULL when it is
> not defined.
>
OK.
> Hotspot fingerprint.
> -------------------
>
> I am concern that you changed logic when and how klass's fingerprint
> is generated. With your changes it become more expensive:
>
> if (UseAOT && ik->supers_have_passed_fingerprint_checks()) {
> + uint64_t str_fp = _stream->compute_fingerprint();
>
You are right, I will revert these changes that were left over from an
earlier version.
> Why removing !result->is_anonymous() check is not enough?:
>
> if (InstanceKlass::should_store_fingerprint()) {
> result->store_fingerprint(stream->compute_fingerprint());
>
Because InstanceKlass::should_store_fingerprint() will return false for
an anonymous class.
dl
> Thanks,
> Vladimir
>
> On 10/6/17 12:52 PM, dean.long at oracle.com wrote:
>> On 10/6/17 12:37 PM, dean.long at oracle.com wrote:
>>
>>> On 10/6/17 10:03 AM, Igor Veresov wrote:
>>>
>>>>
>>>>
>>>>> On Oct 6, 2017, at 9:52 AM, Vladimir Kozlov
>>>>> <vladimir.kozlov at oracle.com <mailto:vladimir.kozlov at oracle.com>>
>>>>> wrote:
>>>>>
>>>>> On 10/5/17 11:16 PM, Igor Veresov wrote:
>>>>>>> On Oct 5, 2017, at 10:57 AM, dean.long at oracle.com
>>>>>>> <mailto:dean.long at oracle.com> wrote:
>>>>>>>
>>>>>>> On 10/4/17 6:27 PM, Vladimir Kozlov wrote:
>>>>>>>
>>>>>>>> Yes, I start looking on it.
>>>>>>>>
>>>>>>>> In DataPatchProcessor.java why you removed
>>>>>>>> addDependentKlassData() call?:
>>>>>>>>
>>>>>>>> + AOTCompiledClass.addFingerprintKlassData(binaryContainer, type);
>>>>>>>> + targetSymbol =
>>>>>>>> AOTCompiledClass.metadataName(type);
>>>>>>>> gotName = ((action ==
>>>>>>>> HotSpotConstantLoadAction.INITIALIZE) ? "got.init." : "got.") +
>>>>>>>> targetSymbol;
>>>>>>>> -
>>>>>>>> methodInfo.addDependentKlassData(binaryContainer,
>>>>>>>> type);
>>>>>>>> } else if
>>>>>>>> (metaspaceConstant.asResolvedJavaMethod() != null && action ==
>>>>>>>> HotSpotConstantLoadAction.LOAD_COUNTERS) {
>>>>>>>>
>>>>>>>
>>>>>>> It is supposed to be an optimization, to prevent adding
>>>>>>> dependencies when we don't need them. We add dependencies
>>>>>>> elsewhere if we inline a method or reference a field, etc. I
>>>>>>> don't think we need a dependency just because we reference a
>>>>>>> constant.
>>>>>>> Igor, do you agree?
>>>>>>>
>>>>>> I suppose you’re right. Field offset seems to be the only place
>>>>>> where a dependency would be required and we should get it
>>>>>> covered. Perhaps this was added before we had field access
>>>>>> recording. But I’d test it in case something pops up (although
>>>>>> nothing come to mind right now).
>>>>>
>>>>> What about allocations and runtime guard checks (class checks)?
>>>>
>>>>
>>>> Yes, good point. Allocation will have the size of the object as a
>>>> constant, which is definitely something we need a dependency for.
>>>> So either we need to collect all types allocated in the parser, or
>>>> leave that statement as it were. Perhaps we need a followup RFE to
>>>> clean this up.
>>>>
>>>
>>> OK let me see if I can simply revert that change. There may be an
>>> ordering problem that I was trying to fix at the same time.
>>>
>>
>> I forgot to mention, if it's in the metadata, then there should be a
>> dependency, and we have an assert that checks for that. Do all
>> allocations and class checks generate a metadata entry? But I agree
>> that a followup RFE is safer.
>>
>> dl
>>
>>
>>> dl
>>>
>>>> igor
>>>>
>>>>>
>>>>> Vladimir
>>>>>
>>>>>> igor
>>>>>>>> Is HotSpotConstantPoolObject is real oop (Java object)? oop_got
>>>>>>>> array is scanned for oops only.
>>>>>>>>
>>>>>>>
>>>>>>> Yes, it's the appendix object.
>>>>>>>
>>>>>>>> Can you explain why the same class can have several Metaspace
>>>>>>>> Names? Are all of them correspond to one class (and its
>>>>>>>> methods)? Should we do more in load_klass_data() in such case.
>>>>>>>>
>>>>>>>
>>>>>>> It is a many to one mapping (aliases) for anonymous classes
>>>>>>> because we can't rely on the temporary name that the JVM
>>>>>>> creates. Regular classes use load_klass_data but anonymous
>>>>>>> classes don't. I have a TODO in
>>>>>>> AOTCodeHeap::reconcile_dynamic_klass() for loading code for
>>>>>>> anonymous classes, but it is disabled because I haven't
>>>>>>> implemented AOT of anonymous classes yet:
>>>>>>>
>>>>>>> // TODO: hook up any AOT code
>>>>>>> // load_klass_data(dyno_data, thread);
>>>>>>>
>>>>>>>> Please, check consumption of Java heap since you are passing
>>>>>>>> oops for metadata generation instead of strings through JVMCI.
>>>>>>>>
>>>>>>>
>>>>>>> OK.
>>>>>>>
>>>>>>> dl
>>>>>>>
>>>>>>>> Vladimir
>>>>>>>>
>>>>>>>> On 10/4/17 2:50 PM, dean.long at oracle.com
>>>>>>>> <mailto:dean.long at oracle.com> wrote:
>>>>>>>>> Hi Vladimir, do you have time to review this?
>>>>>>>>>
>>>>>>>>> thanks,
>>>>>>>>>
>>>>>>>>> dl
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 9/11/17 7:21 PM, Dean Long wrote:
>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8132547
>>>>>>>>>>
>>>>>>>>>> http://cr.openjdk.java.net/~dlong/8132547/
>>>>>>>>>>
>>>>>>>>>> This enhancement is a first step in supporting invokedynamic
>>>>>>>>>> instructions in AOT. Previously, when we saw an
>>>>>>>>>> invokedynamic instruction, or any anonymous class, we would
>>>>>>>>>> generate code to bail out and deoptimize. With this
>>>>>>>>>> changeset we go a little further and call into the runtime to
>>>>>>>>>> resolve the dynamic constant pool entry, running the
>>>>>>>>>> bootstrap method, and returning the adapter method and
>>>>>>>>>> appendix object. Like class initialization in AOT, we only
>>>>>>>>>> do this the first time through. Because AOT double-checks
>>>>>>>>>> classes using fingerprints and symbolic names, special care
>>>>>>>>>> was required to handle anonymous class names. The solution I
>>>>>>>>>> chose was to name anonymous types with aliases based on their
>>>>>>>>>> constant pool location ("adapter<classid:cpi>" and
>>>>>>>>>> appendix<classid:cpi>").
>>>>>>>>>>
>>>>>>>>>> Future work is needed to AOT-compile the anonymous classes
>>>>>>>>>> and/or inline through them, so this change is not expected to
>>>>>>>>>> affect AOT performance. In my tests I was not able to
>>>>>>>>>> measure any difference.
>>>>>>>>>>
>>>>>>>>>> Upstream Graal changes have already been pushed. I broke the
>>>>>>>>>> JVMCI and hotspot changes into separate webrevs.
>>>>>>>>>>
>>>>>>>>>> dl
>>>>
>>>
>>
More information about the hotspot-compiler-dev
mailing list