• fschneider@chromium.org's avatar
    Fix lazy deoptimization at HInvokeFunction and enable target-recording call-function stub. · 84805694
    fschneider@chromium.org authored
    Changes the way we do lazy deoptimization:
    
    1. For side-effect instructions, we insert the lazy-deopt call at
    the following LLazyBailout instruction.
    
         CALL
         GAP
         LAZY-BAILOUT ==> lazy-deopt-call
    
    2. For other instructions (StackCheck) we insert it right after the
    instruction since the deopt targets an earlier deoptimization environment.
    
       STACK-CHECK
       GAP ==> lazy-deopt-call
    
    The pc of the lazy-deopt call that will be patched in is recorded in the
    deoptimization input data. Each Lithium instruction can have 0..n safepoints.
    All safepoints get the deoptimization index of the associated LAZY-BAILOUT
    instruction. On lazy deoptimization we use the return-pc to find the safepoint.
    The safepoint tells us the deoptimization index, which in turn finds us the
    PC where to insert the lazy-deopt-call.
    
    Additional changes:
     * RegExpLiteral marked it as having side-effects so that it 
       gets an explicitlazy-bailout instruction (instead of
       treating it specially like stack-checks)
     * Enable target recording CallFunctionStub to achieve
       more inlining on optimized code.
    
    BUG=v8:1789
    TEST=jslint and uglify run without crashing, mjsunit/compiler/regress-lazy-deopt.js
    Review URL: http://codereview.chromium.org/8492004
    
    git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10006 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
    84805694
deoptimizer-ia32.cc 31.4 KB