Trying to remember compiler implementation details this sounds reasonable and 
is a bug (or an enhancement, actually ;-).  Can someone file a bug?

> On Jan 7, 2015, at 10:07 AM, Charles Oliver Nutter <head...@headius.com> 
> wrote:
> 
> This could explain performance regressions we've seen on the
> performance of heavily-recursive algorithms. I'll try to get an
> assembly dump for fib in JRuby later today.
> 
> - Charlie
> 
> On Wed, Jan 7, 2015 at 10:13 AM, Remi Forax <fo...@univ-mlv.fr> wrote:
>> 
>> On 01/07/2015 10:43 AM, Marcus Lagergren wrote:
>>> 
>>> Remi, I tried to reproduce your problem with jdk9 b44. It runs decently
>>> fast.
>> 
>> 
>> yes, nashorn is fast enough but it can be faster if the JIT was not doing
>> something stupid.
>> 
>> When the VM inline fibo, because fibo is recursive, the recursive call is
>> inlined only once,
>> so the call at depth=2 can not be inlined but should be a classical direct
>> call.
>> 
>> But if fibo is called through an invokedynamic, instead of emitting a direct
>> call to fibo,
>> the JIT generates a code that push the method handle on stack and execute it
>> like if the metod handle was not constant
>> (the method handle is constant because the call at depth=1 is inlined !).
>> 
>>> When did it start to regress?
>> 
>> 
>> jdk7u40, i believe.
>> 
>> I've created a jar containing some handwritten bytecodes with no dependency
>> to reproduce the issue easily:
>>  https://github.com/forax/vmboiler/blob/master/test7/fibo7.jar
>> 
>> [forax@localhost test7]$ time /usr/jdk/jdk1.9.0/bin/java -cp fibo7.jar
>> FiboSample
>> 1836311903
>> 
>> real    0m6.653s
>> user    0m6.729s
>> sys    0m0.019s
>> [forax@localhost test7]$ time /usr/jdk/jdk1.8.0_25/bin/java -cp fibo7.jar
>> FiboSample
>> 1836311903
>> 
>> real    0m6.572s
>> user    0m6.591s
>> sys    0m0.019s
>> [forax@localhost test7]$ time /usr/jdk/jdk1.7.0_71/bin/java -cp fibo7.jar
>> FiboSample
>> 1836311903
>> 
>> real    0m6.373s
>> user    0m6.396s
>> sys    0m0.016s
>> [forax@localhost test7]$ time /usr/jdk/jdk1.7.0_25/bin/java -cp fibo7.jar
>> FiboSample
>> 1836311903
>> 
>> real    0m4.847s
>> user    0m4.832s
>> sys    0m0.019s
>> 
>> as you can see, it was faster with a JDK before jdk7u40.
>> 
>>> 
>>> Regards
>>> Marcus
>> 
>> 
>> cheers,
>> Rémi
>> 
>> 
>>> 
>>>> On 30 Dec 2014, at 20:48, Remi Forax <fo...@univ-mlv.fr> wrote:
>>>> 
>>>> Hi guys,
>>>> I've found a bug in the interaction between the lambda form and inlining
>>>> algorithm,
>>>> basically if the inlining heuristic bailout because the method is
>>>> recursive and already inlined once,
>>>> instead to emit a code to do a direct call, it revert to do call to
>>>> linkStatic with the method
>>>> as MemberName.
>>>> 
>>>> I think it's a regression because before the introduction of lambda
>>>> forms,
>>>> I'm pretty sure that the JIT was emitting a direct call.
>>>> 
>>>> Step to reproduce with nashorn, run this JavaScript code
>>>> function fibo(n) {
>>>>  return (n < 2)? 1: fibo(n - 1) + fibo(n - 2)
>>>> }
>>>> 
>>>> print(fibo(45))
>>>> 
>>>> like this:
>>>>  /usr/jdk/jdk1.9.0/bin/jjs -J-XX:+UnlockDiagnosticVMOptions
>>>> -J-XX:+PrintAssembly fibo.js > log.txt
>>>> 
>>>> look for a method 'fibo' from the tail of the log, you will find
>>>> something like this:
>>>> 
>>>>  0x00007f97e4b4743f: mov    $0x76d08f770,%r8   ;   {oop(a
>>>> 'java/lang/invoke/MemberName' = {method} {0x00007f97dcff8e40} 'fibo'
>>>> '(Ljdk/nashorn/internal/runtime/ScriptFunction;Ljava/lang/Object;I)I' in
>>>> 'jdk/nashorn/internal/scripts/Script$Recompilation$2$fibo')}
>>>>  0x00007f97e4b47449: xchg   %ax,%ax
>>>>  0x00007f97e4b4744b: callq  0x00007f97dd0446e0
>>>> 
>>>> I hope this can be fixed. My demonstration that I can have fibo written
>>>> with a dynamic language
>>>> that run as fast as written in Java doesn't work anymore :(
>>>> 
>>>> cheers,
>>>> Rémi
>>>> 
>>>> _______________________________________________
>>>> mlvm-dev mailing list
>>>> mlvm-dev@openjdk.java.net
>>>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>>> 
>>> _______________________________________________
>>> mlvm-dev mailing list
>>> mlvm-dev@openjdk.java.net
>>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>> 
>> 
>> _______________________________________________
>> mlvm-dev mailing list
>> mlvm-dev@openjdk.java.net
>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev@openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to