Good news, bad news
Tom Rodriguez
tom.rodriguez at oracle.com
Mon May 23 17:23:12 PDT 2011
On May 23, 2011, at 5:13 PM, Charles Oliver Nutter wrote:
> On Mon, May 23, 2011 at 6:17 PM, Rémi Forax <forax at univ-mlv.fr> wrote:
>> On 05/24/2011 12:44 AM, Tom Rodriguez wrote:
>>> I haven't been following 292 that closely but it used to be a piece of code that did precisely that.
>>>
>>> + private Object invoke_L0() throws Throwable {
>>> + if ((boolean) test.invokeExact())
>>> + return target.invokeExact();
>>> + return fallback.invokeExact();
>>> + }
>>>
>>> It looks like it was reworked at some point to use selectAlternative but the optimizer was never updated to deal with it properly. It's not particularly hard, we just need to generate code like we would for a bimorphic call site. The current code expects to either get a constant or something else and doesn't inline if it's something else. In this case we have a Phi of two constants which we just need to split.
>
> I'll give it a shot. I'll put together a benchmark that produces
> "effectively monomorphic" calls at the invokedynamic call site, but
> which uses an intermediate hand-written piece of Java code (that ends
> up polymorphic) in place of GWT.
>
> Obviously GWT should not fail this badly in final release, but if this
> works it could mean many, many other patterns will too. And it will
> definitively answer the question about whether such a case inlines in
> current logic.
You can also just wait for a fix. I've started writing the logic for it and just need to duplicate the guard. We should be able to have this fixed for JDK7.
tom
>
>> The main problem of writing your own variant is that you will have to
>> write 256 * (number_of_primitive_type + 1) variants.
>> The main idea of GWT (and all other method handle combiners) is that
>> they provide a way to get such polymorphic variant
>> without coding all combinations.
>>
>> The benefit is also that these combiners are known by the VM that can
>> provide
>> dedicated path that are more efficient,
>> by ex, the arguments of GWT is pushed only once and used by the test
>> *and* the target (or fallback)
>> or better guarantee about how trees of combiners are inlined.
>
> I am not currently specializing any call paths for primitives, but
> that will come soon. For experiment's sake, I only need to provide one
> such GWT replacement to test fib (no block passed, single IRubyObject
> argument) and one more for the dispatch bench (no block, no args).
> We'll see how it looks.
>
> - Charlie
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
More information about the mlvm-dev
mailing list