Ignore:
Timestamp:
Oct 14, 2012, 8:17:17 PM (13 years ago)
Author:
[email protected]
Message:

DFG should handle polymorphic array modes by eagerly transforming arrays into the most general applicable form
https://bugs.webkit.org/show_bug.cgi?id=99269

Reviewed by Geoffrey Garen.

This kills off a bunch of code for "polymorphic" array modes in the DFG. It should
also be a performance win for code that uses a lot of array storage arrays.

  • dfg/DFGAbstractState.cpp:

(JSC::DFG::AbstractState::execute):

  • dfg/DFGArrayMode.cpp:

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

  • dfg/DFGArrayMode.h:

(DFG):
(JSC::DFG::modeUsesButterfly):
(JSC::DFG::modeIsJSArray):
(JSC::DFG::mayStoreToTail):
(JSC::DFG::mayStoreToHole):
(JSC::DFG::canCSEStorage):
(JSC::DFG::modeSupportsLength):
(JSC::DFG::benefitsFromStructureCheck):

  • dfg/DFGFixupPhase.cpp:

(JSC::DFG::FixupPhase::checkArray):
(JSC::DFG::FixupPhase::blessArrayOperation):

  • dfg/DFGGraph.h:

(JSC::DFG::Graph::byValIsPure):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode):
(JSC::DFG::SpeculativeJIT::checkArray):
(JSC::DFG::SpeculativeJIT::arrayify):
(DFG):
(JSC::DFG::SpeculativeJIT::compileGetArrayLength):

  • dfg/DFGSpeculativeJIT.h:

(JSC::DFG::SpeculativeJIT::putByValWillNeedExtraRegister):
(SpeculativeJIT):

  • dfg/DFGSpeculativeJIT32_64.cpp:

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

  • dfg/DFGSpeculativeJIT64.cpp:

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

File:
1 edited

Legend:

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

    r131276 r131289  
    4040    case asArrayModes(NonArray):
    4141        if (action == Array::Write && !profile->mayInterceptIndexedAccesses())
    42             return Array::BlankToContiguousOrArrayStorage; // FIXME: we don't know whether to go to slow put mode or not. We're guessing that we don't need slow put.
     42            return Array::ToContiguous; // FIXME: we don't know whether to go to contiguous or array storage. We're making a static guess here. In future we should use exit profiling for this.
    4343        return Array::Undecided;
    4444    case asArrayModes(NonArrayWithContiguous):
     
    6464        return Array::PossiblyArrayWithSlowPutArrayStorage;
    6565    case asArrayModes(NonArrayWithContiguous) | asArrayModes(NonArrayWithArrayStorage):
    66         return Array::ContiguousOrArrayStorage;
     66        return Array::ToArrayStorage;
    6767    case asArrayModes(ArrayWithContiguous) | asArrayModes(ArrayWithArrayStorage):
    68         return Array::ArrayWithContiguousOrArrayStorage;
     68        return Array::ArrayToArrayStorage;
    6969    case asArrayModes(NonArrayWithContiguous) | asArrayModes(NonArrayWithArrayStorage) | asArrayModes(ArrayWithContiguous) | asArrayModes(ArrayWithArrayStorage):
    70         return Array::PossiblyArrayWithContiguousOrArrayStorage;
     70        return Array::PossiblyArrayToArrayStorage;
    7171    case asArrayModes(NonArray) | asArrayModes(NonArrayWithContiguous):
    7272        if (action == Array::Write && !profile->mayInterceptIndexedAccesses())
    73             return Array::BlankToContiguous;
     73            return Array::ToContiguous;
    7474        return Array::Undecided;
    7575    case asArrayModes(NonArray) | asArrayModes(NonArrayWithContiguous) | asArrayModes(NonArrayWithArrayStorage):
    76         if (action == Array::Write && !profile->mayInterceptIndexedAccesses())
    77             return Array::BlankToContiguousOrArrayStorage;
    78         return Array::Undecided;
    7976    case asArrayModes(NonArray) | asArrayModes(NonArrayWithArrayStorage):
    8077        if (action == Array::Write && !profile->mayInterceptIndexedAccesses())
    81             return Array::BlankToArrayStorage;
     78            return Array::ToArrayStorage;
    8279        return Array::Undecided;
    8380    case asArrayModes(NonArray) | asArrayModes(NonArrayWithSlowPutArrayStorage):
    8481    case asArrayModes(NonArray) | asArrayModes(NonArrayWithArrayStorage) | asArrayModes(NonArrayWithSlowPutArrayStorage):
    8582        if (action == Array::Write && !profile->mayInterceptIndexedAccesses())
    86             return Array::BlankToSlowPutArrayStorage;
     83            return Array::ToSlowPutArrayStorage;
    8784        return Array::Undecided;
    8885    default:
     
    208205       
    209206    case ALL_EFFECTFUL_MODES:
    210     case POLYMORPHIC_MODES:
    211207        return false;
    212208       
     
    305301    case Array::PossiblyArrayWithArrayStorageOutOfBounds:
    306302        return "PossiblyArrayWithArrayStorageOutOfBounds";
    307     case Array::BlankToContiguous:
    308         return "BlankToContiguous";
    309     case Array::BlankToArrayStorage:
    310         return "BlankToArrayStorage";
    311     case Array::BlankToSlowPutArrayStorage:
    312         return "BlankToSlowPutArrayStorage";
    313     case Array::BlankToContiguousOrArrayStorage:
    314         return "BlankToContiguousOrArrayStorage";
    315     case Array::ContiguousOrArrayStorage:
    316         return "ContiguousOrArrayStorage";
    317     case Array::ArrayWithContiguousOrArrayStorage:
    318         return "ArrayWithContiguousOrArrayStorage";
    319     case Array::PossiblyArrayWithContiguousOrArrayStorage:
    320         return "PossiblyArrayWithContiguousOrArrayStorage";
     303    case Array::ToContiguous:
     304        return "ToContiguous";
     305    case Array::ToArrayStorage:
     306        return "ToArrayStorage";
     307    case Array::ToSlowPutArrayStorage:
     308        return "ToSlowPutArrayStorage";
     309    case Array::ArrayToArrayStorage:
     310        return "ArrayToArrayStorage";
     311    case Array::PossiblyArrayToArrayStorage:
     312        return "PossiblyArrayToArrayStorage";
    321313    case Array::Arguments:
    322314        return "Arguments";
Note: See TracChangeset for help on using the changeset viewer.