Hotspot loves PHP.reboot

Thomas Wuerthinger thomas.wuerthinger at oracle.com
Thu Sep 8 17:35:31 PDT 2011


On 09.09.2011 01:21, John Rose wrote:
> On Sep 8, 2011, at 4:06 PM, Thomas Wuerthinger wrote:
>
>> Here an example for a scripting method that performs a+b and is 
>> guessed to not overflow.
>
> Your example is simplified by the fact that, in the handler, there is 
> only one possible deopt point.  What if there are two?
>
> E.g., what if your code is: add(a,b,c) := a+b+c .
>

The example could be any complex scripting function. So let's consider 
the following method:
function sumUp(n) {
     var sum=0;
     for (var i=0; i<n; ++i) sum += i;
     return sum;
}

That would transform into:
int sumUpFastPath(int n) {
     int sum = 0;
     for (int i=0; i<n; i = safeAdd(i, 1)) sum = safeAdd(sum, i);
     return sum;
}

int safeAdd(int a, int b) {
    if (addWouldOverflow(a, b)) throw new DeoptimizationException();
    return a + b;
}

The two deoptimization points are distinguished by the different Java 
bci at the calls to safeAdd. For each of those points, there must be a 
slow-path continuation. While generating the bytecodes for the method 
sumUpFastPath, one can also generate a mapping from 
exception-bci=>slowpath-entry-point. Such a slowpath-entry-point could 
either be an interpreter loop method (started with the current locals 
and scripting code position) or a lazily generated generic OSR version 
of the scripting function.

So the code could look like:

Object sumUpGeneric(int n) {
     try {
        return sumUpFastPath(n);
     } catch(DeoptimizationException e) {
        StackFrame f = e.getStackFrame("sumUpFastPath");
        ScriptingPosition p = map.get(f.bci());
        return invokeInterpreter(sumUpMethod, p, f.getLocals(), 
f.getExpressionStack());
    }
}

The operand stack and locals manipulation in the generated bytecodes 
must exactly match the manipulations done by the scripting interpreter, 
but I think that it is possible to align those (although there might be 
some complexity due to the fact that certain value types require more 
than 1 stack slot). The safeAdd method could be intrinsified to 
deoptimize to the Java interpreter. So, in case an overflow occurs, 
there would be a two-level deoptimization: Java optimized code => Java 
interpreter (which now actually throws the DeoptimizationException) => 
Scripting language interpreter.

- thomas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20110909/3ac3d463/attachment.html 


More information about the mlvm-dev mailing list