RFR 8227494 [lworld][c1] Optimize withfield bytecode into putfield
Ioi Lam
ioi.lam at oracle.com
Thu Jul 25 20:32:06 UTC 2019
Hi Tobias, thanks for the review.
On 7/25/2019 1:59 AM, Tobias Hartmann wrote:
> Hi Ioi,
>
> this looks good to me!
>
> Why is the change in c1_GraphBuilder.cpp:1879 necessary?
I have modified the line to the following:
if (!holder->is_loaded()
|| needs_patching /* FIXME: 8228634 - field_modify->will_link()
may incorrectly return false */
) {
I'll add more descriptions into the bug, but so far it seems to affect
only with __Withfield() macros that operates on the final fields of
other classes. It doesn't affect "normal" Java code that initializes the
fields of an inline class in its own <init> method.
Thanks
- Ioi
> Best regards,
> Tobias
>
> On 24.07.19 07:30, Ioi Lam wrote:
>> https://bugs.openjdk.java.net/browse/JDK-8227494
>> http://cr.openjdk.java.net/~iklam/valhalla/8227494-withfield-optimization.v01/
>>
>>
>> This optimization significantly reduces the amount of code generated by C1 for
>> withfield bytecodes.
>>
>> In the <init> methods of value classes, it's quite common to have a sequence like
>> this, where we load a value object from a local slot, and overwrite the same local
>> slot with a modified copy of the value object.
>>
>> defaultvalue #1 // class compiler/valhalla/valuetypes/MyValue1
>> astore 9
>> ...
>> iload_0
>> aload 9
>> swap
>> withfield #7 // Field x:I
>> astore 9
>>
>> If this object was created by defaultvalue, and has not escaped, and is not stored
>> in any other local slots, we can effectively treat the withfield/astore
>> sequence as a single putfield bytecode.
>>
>> I implemented a very rudimentary escape analysis in c1_GraphBuilder.cpp. It seems like
>> there's no need to follow back branches like this:
>>
>> static FooValue test4() {
>> FooValue v = FooValue.default;
>> for (int i=1; i<=2; i++) {
>> v = __WithField(v.x, i);
>> v = __WithField(v.y, i);
>> set_foo_static_if_null(v);
>> }
>>
>> return v;
>> }
>>
>> The local slot for "v" in the loop body is a Phi node (not a NewValueTypeInstance node),
>> so it will fail the "obj->is_optimizable_for_withfield()" check (which will only return true
>> from NewValueTypeInstance) in GraphBuilder::withfield().
>>
>> Thanks
>> - Ioi
>>
More information about the valhalla-dev
mailing list