[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