Changeset 95147 in webkit


Ignore:
Timestamp:
Sep 14, 2011 6:24:39 PM (13 years ago)
Author:
fpizlo@apple.com
Message:

DFG JIT always speculates that ValueAdd is a numeric addition
https://bugs.webkit.org/show_bug.cgi?id=67956

Reviewed by Geoffrey Garen.

  • dfg/DFGJITCodeGenerator.cpp:

(JSC::DFG::JITCodeGenerator::isKnownNotNumber):

  • dfg/DFGJITCodeGenerator.h:
  • dfg/DFGNonSpeculativeJIT.cpp:

(JSC::DFG::NonSpeculativeJIT::knownConstantArithOp):
(JSC::DFG::NonSpeculativeJIT::basicArithOp):

  • dfg/DFGOperations.cpp:
  • dfg/DFGOperations.h:
  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • dfg/DFGSpeculativeJIT.h:

(JSC::DFG::SpeculativeJIT::shouldSpeculateNumber):

Location:
trunk/Source/JavaScriptCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r95145 r95147  
     12011-09-12  Filip Pizlo  <fpizlo@apple.com>
     2
     3        DFG JIT always speculates that ValueAdd is a numeric addition
     4        https://bugs.webkit.org/show_bug.cgi?id=67956
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        * dfg/DFGJITCodeGenerator.cpp:
     9        (JSC::DFG::JITCodeGenerator::isKnownNotNumber):
     10        * dfg/DFGJITCodeGenerator.h:
     11        * dfg/DFGNonSpeculativeJIT.cpp:
     12        (JSC::DFG::NonSpeculativeJIT::knownConstantArithOp):
     13        (JSC::DFG::NonSpeculativeJIT::basicArithOp):
     14        * dfg/DFGOperations.cpp:
     15        * dfg/DFGOperations.h:
     16        * dfg/DFGSpeculativeJIT.cpp:
     17        (JSC::DFG::SpeculativeJIT::compile):
     18        * dfg/DFGSpeculativeJIT.h:
     19        (JSC::DFG::SpeculativeJIT::shouldSpeculateNumber):
     20
    1212011-09-14  Anders Carlsson  <andersca@apple.com>
    222
  • trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.cpp

    r95127 r95147  
    396396}
    397397
     398bool JITCodeGenerator::isKnownNotNumber(NodeIndex nodeIndex)
     399{
     400    Node& node = m_jit.graph()[nodeIndex];
     401    VirtualRegister virtualRegister = node.virtualRegister();
     402    GenerationInfo& info = m_generationInfo[virtualRegister];
     403   
     404    return (!info.isJSDouble() && !info.isJSInteger())
     405        || (node.isConstant() && !isNumberConstant(nodeIndex));
     406}
     407
    398408bool JITCodeGenerator::isKnownBoolean(NodeIndex nodeIndex)
    399409{
  • trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.h

    r95127 r95147  
    414414   
    415415    bool isKnownNotInteger(NodeIndex);
     416    bool isKnownNotNumber(NodeIndex);
    416417
    417418    bool isKnownBoolean(NodeIndex);
  • trunk/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.cpp

    r95136 r95147  
    241241        }
    242242        m_jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
    243         appendCallWithExceptionCheck(operationValueAdd);
     243        appendCallWithExceptionCheck(operationValueAddNotNumber);
    244244        m_jit.move(GPRInfo::returnValueGPR, resultGPR);
    245245        silentFillAllRegisters(resultGPR);
     
    419419        setupStubArguments(arg1GPR, arg2GPR);
    420420        m_jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
    421         appendCallWithExceptionCheck(operationValueAdd);
     421        appendCallWithExceptionCheck(operationValueAddNotNumber);
    422422        m_jit.move(GPRInfo::returnValueGPR, resultGPR);
    423423        silentFillAllRegisters(resultGPR);
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp

    r94942 r95147  
    125125    JSValue op2 = JSValue::decode(encodedOp2);
    126126   
     127    return JSValue::encode(jsAdd(exec, op1, op2));
     128}
     129
     130EncodedJSValue operationValueAddNotNumber(ExecState* exec, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2)
     131{
     132    JSValue op1 = JSValue::decode(encodedOp1);
     133    JSValue op2 = JSValue::decode(encodedOp2);
     134   
    127135    ASSERT(!op1.isNumber() || !op2.isNumber());
     136   
     137    if (op1.isString()) {
     138        if (op2.isString())
     139            return JSValue::encode(jsString(exec, asString(op1), asString(op2)));
     140        return JSValue::encode(jsString(exec, asString(op1), op2.toPrimitiveString(exec)));
     141    }
    128142
    129143    return JSValue::encode(jsAddSlowCase(exec, op1, op2));
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.h

    r94942 r95147  
    5858EncodedJSValue operationConvertThis(ExecState*, EncodedJSValue encodedOp1);
    5959EncodedJSValue operationValueAdd(ExecState*, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2);
     60EncodedJSValue operationValueAddNotNumber(ExecState*, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2);
    6061EncodedJSValue operationArithAdd(EncodedJSValue encodedOp1, EncodedJSValue encodedOp2);
    6162EncodedJSValue operationArithSub(EncodedJSValue encodedOp1, EncodedJSValue encodedOp2);
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

    r95136 r95147  
    924924        }
    925925
    926         SpeculateDoubleOperand op1(this, node.child1());
    927         SpeculateDoubleOperand op2(this, node.child2());
    928         FPRTemporary result(this, op1, op2);
    929 
    930         FPRReg reg1 = op1.fpr();
    931         FPRReg reg2 = op2.fpr();
    932         m_jit.addDouble(reg1, reg2, result.fpr());
    933 
    934         doubleResult(result.fpr(), m_compileIndex);
     926        if (shouldSpeculateNumber(node.child1(), node.child2())) {
     927            SpeculateDoubleOperand op1(this, node.child1());
     928            SpeculateDoubleOperand op2(this, node.child2());
     929            FPRTemporary result(this, op1, op2);
     930           
     931            FPRReg reg1 = op1.fpr();
     932            FPRReg reg2 = op2.fpr();
     933            m_jit.addDouble(reg1, reg2, result.fpr());
     934           
     935            doubleResult(result.fpr(), m_compileIndex);
     936            break;
     937        }
     938       
     939        ASSERT(op == ValueAdd);
     940       
     941        JSValueOperand op1(this, node.child1());
     942        JSValueOperand op2(this, node.child2());
     943       
     944        GPRReg op1GPR = op1.gpr();
     945        GPRReg op2GPR = op2.gpr();
     946       
     947        flushRegisters();
     948       
     949        GPRResult result(this);
     950        if (isKnownNotNumber(node.child1()) || isKnownNotNumber(node.child2()))
     951            callOperation(operationValueAddNotNumber, result.gpr(), op1GPR, op2GPR);
     952        else
     953            callOperation(operationValueAdd, result.gpr(), op1GPR, op2GPR);
     954       
     955        jsValueResult(result.gpr(), m_compileIndex);
    935956        break;
    936957    }
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h

    r95060 r95147  
    385385    }
    386386   
    387     bool shouldNotSpeculateInteger(NodeIndex nodeIndex)
    388     {
    389         if (isDoubleConstant(nodeIndex))
    390             return true;
    391 
     387    bool shouldSpeculateNumber(NodeIndex nodeIndex)
     388    {
    392389        Node& node = m_jit.graph()[nodeIndex];
    393 
     390       
     391        if (node.hasNumberResult())
     392            return true;
     393       
     394        if (isNumberConstant(nodeIndex))
     395            return true;
     396       
    394397        VirtualRegister virtualRegister = node.virtualRegister();
    395398        GenerationInfo& info = m_generationInfo[virtualRegister];
    396399
     400        if (info.isJSInteger() || info.isJSDouble())
     401            return true;
     402       
     403        PredictedType prediction = m_jit.graph().getPrediction(node);
     404       
     405        if (isNumberPrediction(prediction) || prediction == PredictNone)
     406            return true;
     407       
     408        return false;
     409    }
     410   
     411    bool shouldNotSpeculateInteger(NodeIndex nodeIndex)
     412    {
     413        if (isDoubleConstant(nodeIndex))
     414            return true;
     415
     416        Node& node = m_jit.graph()[nodeIndex];
     417
     418        VirtualRegister virtualRegister = node.virtualRegister();
     419        GenerationInfo& info = m_generationInfo[virtualRegister];
     420
    397421        if (info.isJSDouble())
    398422            return true;
     
    407431    {
    408432        return !(shouldNotSpeculateInteger(op1) || shouldNotSpeculateInteger(op2)) && (shouldSpeculateInteger(op1) || shouldSpeculateInteger(op2));
     433    }
     434   
     435    bool shouldSpeculateNumber(NodeIndex op1, NodeIndex op2)
     436    {
     437        return shouldSpeculateNumber(op1) && shouldSpeculateNumber(op2);
    409438    }
    410439
Note: See TracChangeset for help on using the changeset viewer.