Changeset 91041 in webkit


Ignore:
Timestamp:
Jul 14, 2011 7:06:10 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

DFG JIT does not optimize Branch as well as it could.
https://bugs.webkit.org/show_bug.cgi?id=64574

Patch by Filip Pizlo <fpizlo@apple.com> on 2011-07-14
Reviewed by Gavin Barraclough.

This creates a common code path for emitting unfused branches, which does
no speculation, and only performs a slow call if absolutely necessary.

  • dfg/DFGJITCodeGenerator.cpp:

(JSC::DFG::JITCodeGenerator::emitBranch):

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

(JSC::DFG::NonSpeculativeJIT::compile):

  • dfg/DFGSpeculativeJIT.cpp:

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

Location:
trunk/Source/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r91039 r91041  
     12011-07-14  Filip Pizlo  <fpizlo@apple.com>
     2
     3        DFG JIT does not optimize Branch as well as it could.
     4        https://bugs.webkit.org/show_bug.cgi?id=64574
     5
     6        Reviewed by Gavin Barraclough.
     7       
     8        This creates a common code path for emitting unfused branches, which does
     9        no speculation, and only performs a slow call if absolutely necessary.
     10
     11        * dfg/DFGJITCodeGenerator.cpp:
     12        (JSC::DFG::JITCodeGenerator::emitBranch):
     13        * dfg/DFGJITCodeGenerator.h:
     14        * dfg/DFGNonSpeculativeJIT.cpp:
     15        (JSC::DFG::NonSpeculativeJIT::compile):
     16        * dfg/DFGSpeculativeJIT.cpp:
     17        (JSC::DFG::SpeculativeJIT::compile):
     18
    1192011-07-14  Filip Pizlo  <fpizlo@apple.com>
    220
  • trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.cpp

    r91010 r91041  
    469469}
    470470
     471void JITCodeGenerator::emitBranch(Node& node)
     472{
     473    JSValueOperand value(this, node.child1());
     474    GPRReg valueGPR = value.gpr();
     475   
     476    GPRTemporary result(this);
     477    GPRReg resultGPR = result.gpr();
     478   
     479    BlockIndex taken = m_jit.graph().blockIndexForBytecodeOffset(node.takenBytecodeOffset());
     480    BlockIndex notTaken = m_jit.graph().blockIndexForBytecodeOffset(node.notTakenBytecodeOffset());
     481
     482    addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueGPR, MacroAssembler::ImmPtr(JSValue::encode(jsNumber(0)))), notTaken);
     483    addBranch(m_jit.branchPtr(MacroAssembler::AboveOrEqual, valueGPR, GPRInfo::tagTypeNumberRegister), taken);
     484    addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueGPR, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(false)))), notTaken);
     485    addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueGPR, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(true)))), taken);
     486   
     487    silentSpillAllRegisters(resultGPR);
     488    m_jit.move(valueGPR, GPRInfo::argumentGPR1);
     489    m_jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
     490    appendCallWithExceptionCheck(dfgConvertJSValueToBoolean);
     491    m_jit.move(GPRInfo::returnValueGPR, resultGPR);
     492    silentFillAllRegisters(resultGPR);
     493   
     494    addBranch(m_jit.branchTest8(MacroAssembler::NonZero, resultGPR), taken);
     495    if (notTaken != (m_block + 1))
     496        addBranch(m_jit.jump(), notTaken);
     497   
     498    noResult(m_compileIndex);
     499}
     500
    471501void JITCodeGenerator::emitCall(Node& node)
    472502{
  • trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.h

    r91010 r91041  
    536536    void cachedGetMethod(GPRReg baseGPR, GPRReg resultGPR, unsigned identifierNumber, JITCompiler::Jump slowPathTarget = JITCompiler::Jump());
    537537   
     538    void emitBranch(Node&);
     539   
    538540    MacroAssembler::Address addressOfCallData(int idx)
    539541    {
  • trunk/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.cpp

    r91010 r91041  
    921921    }
    922922
    923     case Branch: {
    924         JSValueOperand value(this, node.child1());
    925         GPRReg valueGPR = value.gpr();
    926         flushRegisters();
    927 
    928         GPRResult result(this);
    929         callOperation(dfgConvertJSValueToBoolean, result.gpr(), valueGPR);
    930 
    931         BlockIndex taken = m_jit.graph().blockIndexForBytecodeOffset(node.takenBytecodeOffset());
    932         BlockIndex notTaken = m_jit.graph().blockIndexForBytecodeOffset(node.notTakenBytecodeOffset());
    933 
    934         addBranch(m_jit.branchTest8(MacroAssembler::NonZero, result.gpr()), taken);
    935         if (notTaken != (m_block + 1))
    936             addBranch(m_jit.jump(), notTaken);
    937 
    938         noResult(m_compileIndex);
    939         break;
    940     }
     923    case Branch:
     924        emitBranch(node);
     925        break;
    941926
    942927    case Return: {
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

    r91010 r91041  
    944944    }
    945945
    946     case Branch: {
    947         JSValueOperand value(this, node.child1());
    948         GPRReg valueReg = value.gpr();
    949 
    950         BlockIndex taken = m_jit.graph().blockIndexForBytecodeOffset(node.takenBytecodeOffset());
    951         BlockIndex notTaken = m_jit.graph().blockIndexForBytecodeOffset(node.notTakenBytecodeOffset());
    952 
    953         // Integers
    954         addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueReg, MacroAssembler::ImmPtr(JSValue::encode(jsNumber(0)))), notTaken);
    955         MacroAssembler::Jump isNonZeroInteger = m_jit.branchPtr(MacroAssembler::AboveOrEqual, valueReg, GPRInfo::tagTypeNumberRegister);
    956 
    957         // Booleans
    958         addBranch(m_jit.branchPtr(MacroAssembler::Equal, valueReg, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(false)))), notTaken);
    959         speculationCheck(m_jit.branchPtr(MacroAssembler::NotEqual, valueReg, MacroAssembler::ImmPtr(JSValue::encode(jsBoolean(true)))));
    960 
    961         if (taken == (m_block + 1))
    962             isNonZeroInteger.link(&m_jit);
    963         else {
    964             addBranch(isNonZeroInteger, taken);
    965             addBranch(m_jit.jump(), taken);
    966         }
    967 
    968         noResult(m_compileIndex);
    969         break;
    970     }
     946    case Branch:
     947        emitBranch(node);
     948        break;
    971949
    972950    case Return: {
Note: See TracChangeset for help on using the changeset viewer.