MH compilation is broken in valhalla(mvt branch) build

Roland Westrelin rwestrel at redhat.com
Mon Jun 19 08:18:52 UTC 2017


Hi Sergey,

> I found that in valhalla build (mvt branch) MH compilation is broken if 
> MH is stored in non-final field. Cost of MH invocation is increased 
> ~100x times.

Compilation of lambda forms as root of compilation is currently
disabled.

If we have a value type:

class Point {
  double x;
  double y;
}

and some method is called:

foo(Point p)

when that method is JIT'ed, we use a special calling convention that
doesn't pass a reference to p but the fields:

foo(double x, double y)

If foo is called with a method handle call and the method handle is not
constant, foo won't be inlined in a caller, it will be called from a
lambda form. That lambda form is specialized to the value type supertype
so it's not aware that the value type argument is a Point. It passes a
reference to a value type as an argument to foo but foo expects a pair
of doubles. If the call is from an interpreted lambda form, the i2c
takes care of loading the fields from the value type. If the call is
from a compiled method, this would cause the compiled method foo to see
garbage in x and y. The current workaround is to disable compilation of
lambda forms. The correct fix I think is to have a special entry point
in the compiled method.

That this problem is indeed the root cause of what you're seeing can be
verified by disabling the special calling convention with:

-XX:-ValueTypePassFieldsAsArgs

Roland.


More information about the valhalla-dev mailing list