7u40 is when the native invoke dynamic implementation was replaced with Lambda 
Forms :-/

/M

> On 07 Jan 2015, at 17:13, 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 
> <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 <mailto:mlvm-dev@openjdk.java.net>
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev 
> <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