Ignore:
Timestamp:
Sep 19, 2012, 2:43:10 PM (13 years ago)
Author:
[email protected]
Message:

DFG should not emit PutByVal hole case unless it has to
https://bugs.webkit.org/show_bug.cgi?id=97080

Reviewed by Geoffrey Garen.

This causes us to generate less code for typical PutByVal's. But if profiling tells us
that the hole case is being hit, we generate the same code as we would have generated
before. This seems like a slight speed-up across the board.

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::store8):
(MacroAssemblerARMv7):

  • assembler/MacroAssemblerX86.h:

(MacroAssemblerX86):
(JSC::MacroAssemblerX86::store8):

  • assembler/MacroAssemblerX86_64.h:

(MacroAssemblerX86_64):
(JSC::MacroAssemblerX86_64::store8):

  • assembler/X86Assembler.h:

(X86Assembler):
(JSC::X86Assembler::movb_i8m):

  • bytecode/ArrayProfile.h:

(JSC::ArrayProfile::ArrayProfile):
(JSC::ArrayProfile::addressOfMayStoreToHole):
(JSC::ArrayProfile::mayStoreToHole):
(ArrayProfile):

  • dfg/DFGArrayMode.cpp:

(JSC::DFG::fromObserved):
(JSC::DFG::modeAlreadyChecked):
(JSC::DFG::modeToString):

  • dfg/DFGArrayMode.h:

(DFG):
(JSC::DFG::mayStoreToHole):

  • dfg/DFGSpeculativeJIT32_64.cpp:

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

  • dfg/DFGSpeculativeJIT64.cpp:

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

  • jit/JIT.h:

(JIT):

  • jit/JITInlineMethods.h:

(JSC::JIT::emitArrayProfileStoreToHoleSpecialCase):
(JSC):

  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emit_op_put_by_val):

  • jit/JITPropertyAccess32_64.cpp:

(JSC::JIT::emit_op_put_by_val):

  • llint/LowLevelInterpreter32_64.asm:
  • llint/LowLevelInterpreter64.asm:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/dfg/DFGArrayMode.cpp

    r128957 r129045  
    4343        return Array::Undecided;
    4444    case asArrayModes(NonArrayWithArrayStorage):
    45         return makeSafe ? Array::ArrayStorageOutOfBounds : Array::ArrayStorage;
     45        return makeSafe ? Array::ArrayStorageOutOfBounds : (profile->mayStoreToHole() ? Array::ArrayStorageToHole : Array::ArrayStorage);
    4646    case asArrayModes(NonArrayWithSlowPutArrayStorage):
    4747    case asArrayModes(NonArrayWithArrayStorage) | asArrayModes(NonArrayWithSlowPutArrayStorage):
    4848        return Array::SlowPutArrayStorage;
    4949    case asArrayModes(ArrayWithArrayStorage):
    50         return makeSafe ? Array::ArrayWithArrayStorageOutOfBounds : Array::ArrayWithArrayStorage;
     50        return makeSafe ? Array::ArrayWithArrayStorageOutOfBounds : (profile->mayStoreToHole() ? Array::ArrayWithArrayStorageToHole : Array::ArrayWithArrayStorage);
    5151    case asArrayModes(ArrayWithSlowPutArrayStorage):
    5252    case asArrayModes(ArrayWithArrayStorage) | asArrayModes(ArrayWithSlowPutArrayStorage):
    5353        return Array::ArrayWithSlowPutArrayStorage;
    5454    case asArrayModes(NonArrayWithArrayStorage) | asArrayModes(ArrayWithArrayStorage):
    55         return makeSafe ? Array::PossiblyArrayWithArrayStorageOutOfBounds : Array::PossiblyArrayWithArrayStorage;
     55        return makeSafe ? Array::PossiblyArrayWithArrayStorageOutOfBounds : (profile->mayStoreToHole() ? Array::PossiblyArrayWithArrayStorageToHole : Array::PossiblyArrayWithArrayStorage);
    5656    case asArrayModes(NonArrayWithSlowPutArrayStorage) | asArrayModes(ArrayWithSlowPutArrayStorage):
    5757    case asArrayModes(NonArrayWithArrayStorage) | asArrayModes(ArrayWithArrayStorage) | asArrayModes(NonArrayWithSlowPutArrayStorage) | asArrayModes(ArrayWithSlowPutArrayStorage):
     
    140140       
    141141    case Array::ArrayStorage:
     142    case Array::ArrayStorageToHole:
    142143    case Array::ArrayStorageOutOfBounds:
    143144    case Array::PossiblyArrayWithArrayStorage:
     145    case Array::PossiblyArrayWithArrayStorageToHole:
    144146    case Array::PossiblyArrayWithArrayStorageOutOfBounds:
    145147        return value.m_currentKnownStructure.hasSingleton()
     
    152154       
    153155    case Array::ArrayWithArrayStorage:
     156    case Array::ArrayWithArrayStorageToHole:
    154157    case Array::ArrayWithArrayStorageOutOfBounds:
    155158        return value.m_currentKnownStructure.hasSingleton()
     
    216219    case Array::ArrayStorage:
    217220        return "ArrayStorage";
     221    case Array::ArrayStorageToHole:
     222        return "ArrayStorageToHole";
    218223    case Array::SlowPutArrayStorage:
    219224        return "SlowPutArrayStorage";
     
    222227    case Array::ArrayWithArrayStorage:
    223228        return "ArrayWithArrayStorage";
     229    case Array::ArrayWithArrayStorageToHole:
     230        return "ArrayWithArrayStorageToHole";
    224231    case Array::ArrayWithSlowPutArrayStorage:
    225232        return "ArrayWithSlowPutArrayStorage";
     
    228235    case Array::PossiblyArrayWithArrayStorage:
    229236        return "PossiblyArrayWithArrayStorage";
     237    case Array::PossiblyArrayWithArrayStorageToHole:
     238        return "PossiblyArrayWithArrayStorageToHole";
    230239    case Array::PossiblyArrayWithSlowPutArrayStorage:
    231240        return "PossiblyArrayWithSlowPutArrayStorage";
Note: See TracChangeset for help on using the changeset viewer.