RFR(S): ZGC: C2: Oop instance cloning causing skipped compiles
Per Liden
per.liden at oracle.com
Tue Nov 26 13:29:40 UTC 2019
Hi Nils,
On 11/21/19 12:53 PM, Nils Eliasson wrote:
> I updated this to version 2.
>
> http://cr.openjdk.java.net/~neliasso/8234520/webrev.02/
>
> I found a problen running compiler/arguments/TestStressReflectiveCode.java
>
> Even though the clone was created as a oop clone, the type node type
> returns isa_aryprt. This is caused by the src ptr not being the base
> pointer. Until I fix that I wanted a more robust test.
>
> In this webrev I split up the is_clonebasic into is_clone_oop and
> is_clone_array. (is_clone_oop_array is already there). Having a complete
> set with the three clone types allows for a robust test and easy
> verification. (The three variants end up in different paths with
> different GCs).
A couple of suggestions:
1) Instead of
CloneOop
CloneArray
CloneOopArray
I think we should call the three types:
CloneInstance
CloneTypeArray
CloneOopArray
Since CloneOop is not actually cloning an oop, but an object/instance.
And being explicit about TypeArray seems like a good thing to avoid any
confusion about the difference compared to CloneOopArray. I guess
PrimArray would be an alternative to TypeArray.
And of course, if we change this then the is_clone/set_clone functions
should follow the same naming convention.
Btw, what about CopyOf and CopyOfRange? Don't they also come in Oop and
Type versions, or are we handling those differently in some way? Looking
at the code it looks like they are only used for the oop array case?
2) In zBarrierSerC2.cpp, do you mind if we do like this instead? I find
that quite a bit easier to read.
[...]
const Type** domain_fields = TypeTuple::fields(4);
domain_fields[TypeFunc::Parms + 0] = TypeInstPtr::NOTNULL; // src
domain_fields[TypeFunc::Parms + 1] = TypeInstPtr::NOTNULL; // dst
domain_fields[TypeFunc::Parms + 2] = TypeLong::LONG; // size lower
domain_fields[TypeFunc::Parms + 3] = Type::HALF; // size upper
const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms + 4,
domain_fields);
[...]
3) I'd also like to add some const, adjust indentation, etc, in a few
places. Instead of listing them here I made a patch, which goes on top
of yours. This patch also adjusts 2) above. Just shout if you have any
objections.
http://cr.openjdk.java.net/~pliden/8234520/webrev.03-review
/Per
>
> Regards,
>
> Nils
>
>
> On 2019-11-20 15:25, Nils Eliasson wrote:
>> Hi,
>>
>> I found a few bugs after the enabling of the clone intrinsic in ZGC.
>>
>> 1) The arraycopy clone_basic has the parameters adjusted to work as a
>> memcopy. For an oop the src is pointing inside the oop to where we
>> want to start copying. But when we want to do a runtime call to clone
>> - the parameters are supposed to be the actual src oop and dst oop,
>> and the size should be the instance size.
>>
>> For now I have made a workaround. What should be done later is using
>> the offset in the arraycopy node to encode where the payload is, so
>> that the base pointers are always correct. But that would require
>> changes to the BarrierSet classes of all GCs. So I leave that for next
>> release.
>>
>> 2) The size parameter of the TypeFunc for the runtime call has the
>> wrong type. It was originally Long but missed the upper Half, it was
>> fixed to INT (JDK-8233834), but that is wrong and causes the compiles
>> to be skipped. We didn't notice that since they failed silently. That
>> is also why we didn't notice problem #1 too.
>>
>> https://bugs.openjdk.java.net/browse/JDK-8234520
>>
>> http://cr.openjdk.java.net/~neliasso/8234520/webrev.01/
>>
>> Please review!
>>
>> Nils
>>
More information about the hotspot-compiler-dev
mailing list