RFR 8227494 [lworld][c1] Optimize withfield bytecode into putfield
Tobias Hartmann
tobias.hartmann at oracle.com
Thu Jul 25 08:59:45 UTC 2019
Hi Ioi,
this looks good to me!
Why is the change in c1_GraphBuilder.cpp:1879 necessary?
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