RFR 8220788 [lworld] C1 support for LW2 Arrays

Ioi Lam ioi.lam at oracle.com
Wed May 22 16:10:57 UTC 2019

Hi Tobias,

Thanks for the review. I've updated the patch. Here's the delta from the 
last webrev:


On 5/21/2019 1:05 AM, Tobias Hartmann wrote:
> Hi Ioi,
> looks good to me, nice progress! Here are some comments/questions:
> c1_Instruction.cpp:
> - line 151: no need to check for is_null_free()


> - line 299: I think you can remove the else branch because we return false anyway and maybe add the
> comment to before the check in line 297 ("this can fail with inling ..")

I changed it to:

     // The following check can fail with inlining:
     //     void test45_inline(Object[] oa, Object o, int index) { 
oa[index] = o; }
     //     void test45(MyValue1[] va, int index, MyValue2 v) { 
test45_inline(va, v, index); }
     if (element_klass == actual_klass) {
       return true;

> c1_LIRAssembler_x86.cpp:
> - line 1934: The comment is a bit misleading because we are also emitting this check for interface
> arrays and MyValue?[], right?

I changed to

   // We are loading/storing an array that *may* be a flattened array 
(the declared type
   // Object[], interface[], or VT?[]). If this array is flattened, take 
slow path.

> - line 1940: Why do you need that check? And why do you still emit the flattened check even if
> value()->is_illegal()?

emit_opFlattenedArrayCheck is called for both aaload and aastore. In the 
case of aaload, op->value() is illegal. See LIRGenerator::do_LoadIndexed

       check_flattened_array(array.result(), LIR_OprFact::illegalOpr, 

I use emit_opFlattenedArrayCheck for both aaload and aastore because 
it's a lot of hassle to write a new LIR_Op.

> - line 1956: "actual array is a "QLVT;" should be "actual array is a "[QVT;", right?


> macroAssembler_x86.cpp:
> - Why is that change necessary?

There were two places in c1_LIRAssembler_x86.cpp that called 
decode_klass_not_null directly.

In my updated patch: For LIR_Assembler::arraycopy_flat_check, I rewrote 
it to avoid loading the klass altogether. For LIR_Assembler::mem2reg, I 
added the masking operation before calling decode_klass_not_null.

Anyway, I think the masking operation should be placed inside 
decode_klass_not_null. Maybe I'll fix that in a subsequent RFE.

- Ioi

> Thanks,
> Tobias
> On 20.05.19 05:03, Ioi Lam wrote:
>> https://bugs.openjdk.java.net/browse/JDK-8220788
>> http://cr.openjdk.java.net/~iklam/valhalla/8220788-c1-support-for-lw2-arrays.v01/
>> With this changeset, C1 can properly distinguish between "[QV;" and "[LV;" arrays. It can also
>> handle non-flattened arrays that are null free (e.g., "[V;" arrays where the size of V is larger
>> than ValueArrayElemMaxFlatSize).
>> Testing:
>>      cd test/hotspot/jtreg/compiler/valhalla/valuetypes
>>      jtreg -vmoptions:-XX:+EnableValhallaC1 \
>>            -vmoptions:-XX:TieredStopAtLevel=1 \
>>            -vmoptions:-XX:-ValueTypePassFieldsAsArgs \
>>            -vmoptions:-XX:-ValueTypeReturnedAsFields \
>>            -Dtest.c1=true \
>>            .
>> All tests passed.
>> My next step is to test C1 more thoroughly, and add test groups for C1 under valhalla-hs-tier* for
>> mach5 testing.
>> Thanks
>> - Ioi

More information about the valhalla-dev mailing list