[lworld] RFR: 8253113: [lworld] [lw3] C1 should avoid copying element of flattened arrays when reading a sub-element [v3]
Tobias Hartmann
thartmann at openjdk.java.net
Tue Sep 15 15:30:34 UTC 2020
On Tue, 15 Sep 2020 14:13:38 GMT, Frederic Parain <fparain at openjdk.org> wrote:
>> Please review these changes optimizing access to flattened arrays in C1.
>>
>> The optimization avoids unnecessary copies of intermediate values when the code accesses a sub-element of a flattened
>> array.
>> For instance, with the following code:
>>
>> inline class Point { int x = 0, y = 0; }
>> void foo() {
>> Point[] array = new Point[10];
>> int i = array[1].x;
>> }
>>
>> C1 used to create a new instance of Point, copy the content from the array, then reads the x field from this new
>> instance. With the optimization, C1 directly accesses the x field from the flattened array, and makes no heap
>> allocation.
>> A simple benchmark on the "int i = array[1].x;" line gives these results:
>>
>> baseline:
>> Benchmark Mode Samples Score Score error Units
>> o.s.MyBenchmark.testArrayReads avgt 200 4.250 0.011 ns/op
>>
>> optimized:
>> Benchmark Mode Samples Score Score error Units
>> o.s.MyBenchmark.testArrayReads avgt 200 2.228 0.004 ns/op
>>
>> Thank you,
>>
>> Fred
>
> Frederic Parain has updated the pull request incrementally with one additional commit since the last revision:
>
> More refactoring
Nice refactoring. Looks good to me.
src/hotspot/share/c1/c1_LIRGenerator.cpp line 1638:
> 1636: assert(field != NULL, "Need a subelement type specified");
> 1637:
> 1638: // Find the starting address of the source (inside the array)
Indentation is wrong.
src/hotspot/share/c1/c1_LIRGenerator.cpp line 1670:
> 1668: assert(sub_offset == 0 || field != NULL, "Sanity check");
> 1669:
> 1670: // Find the starting address of the source (inside the array)
Indentation is wrong.
-------------
Marked as reviewed by thartmann (Committer).
PR: https://git.openjdk.java.net/valhalla/pull/187
More information about the valhalla-dev
mailing list