Changeset 166834 in webkit


Ignore:
Timestamp:
Apr 5, 2014 12:31:58 PM (10 years ago)
Author:
commit-queue@webkit.org
Message:

Use preallocated stack reference to store adjacentBacktrackingStart
https://bugs.webkit.org/show_bug.cgi?id=131237

Patch by Yusuke Suzuki <Yusuke Suzuki> on 2014-04-05
Reviewed by Benjamin Poulain.

  • cssjit/SelectorCompiler.cpp:

(WebCore::SelectorCompiler::SelectorCodeGenerator::SelectorCodeGenerator):
(WebCore::SelectorCompiler::SelectorCodeGenerator::computeBacktrackingInformation):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateDirectAdjacentTreeWalker):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateAdjacentBacktrackingTail):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateBacktrackingTailsIfNeeded):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateWalkToPreviousAdjacent): Deleted.
(WebCore::SelectorCompiler::SelectorCodeGenerator::linkFailures): Deleted.
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateDescendantBacktrackingTail): Deleted.

  • cssjit/StackAllocator.h:

(WebCore::StackAllocator::allocateUninitialized):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r166833 r166834  
     12014-04-05  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        Use preallocated stack reference to store adjacentBacktrackingStart
     4        https://bugs.webkit.org/show_bug.cgi?id=131237
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        * cssjit/SelectorCompiler.cpp:
     9        (WebCore::SelectorCompiler::SelectorCodeGenerator::SelectorCodeGenerator):
     10        (WebCore::SelectorCompiler::SelectorCodeGenerator::computeBacktrackingInformation):
     11        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker):
     12        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateDirectAdjacentTreeWalker):
     13        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateAdjacentBacktrackingTail):
     14        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateBacktrackingTailsIfNeeded):
     15        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateWalkToPreviousAdjacent): Deleted.
     16        (WebCore::SelectorCompiler::SelectorCodeGenerator::linkFailures): Deleted.
     17        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateDescendantBacktrackingTail): Deleted.
     18        * cssjit/StackAllocator.h:
     19        (WebCore::StackAllocator::allocateUninitialized):
     20
    1212014-04-05  Jeongeun Kim  <je_julie.kim@samsung.com>
    222
  • trunk/Source/WebCore/cssjit/SelectorCompiler.cpp

    r166695 r166834  
    164164
    165165    void linkFailures(Assembler::JumpList& globalFailureCases, BacktrackingAction, Assembler::JumpList& localFailureCases);
    166     void generateAdjacentBacktrackingTail(Assembler::JumpList& failureCases);
     166    void generateAdjacentBacktrackingTail();
    167167    void generateDescendantBacktrackingTail();
    168168    void generateBacktrackingTailsIfNeeded(Assembler::JumpList& failureCases, const SelectorFragment&);
     
    196196    FunctionType m_functionType;
    197197    SelectorFragmentList m_selectorFragments;
     198    bool m_needsAdjacentBacktrackingStart;
    198199
    199200    StackAllocator::StackReference m_checkingContextStackReference;
     
    327328    , m_selectorContext(selectorContext)
    328329    , m_functionType(FunctionType::SimpleSelectorChecker)
     330    , m_needsAdjacentBacktrackingStart(false)
    329331#if CSS_SELECTOR_JIT_DEBUGGING
    330332    , m_originalSelector(rootSelector)
     
    635637        if (fragment.relationToLeftFragment != FragmentRelation::Descendant && fragment.relationToRightFragment == FragmentRelation::Child && isFirstAncestor(ancestorPositionSinceDescendantRelation))
    636638            fragment.backtrackingFlags |= BacktrackingFlag::SaveDescendantBacktrackingStart;
    637         if (fragment.relationToLeftFragment == FragmentRelation::DirectAdjacent && fragment.relationToRightFragment == FragmentRelation::DirectAdjacent && isFirstAdjacent(adjacentPositionSinceIndirectAdjacentTreeWalk))
     639        if (fragment.relationToLeftFragment == FragmentRelation::DirectAdjacent && fragment.relationToRightFragment == FragmentRelation::DirectAdjacent && isFirstAdjacent(adjacentPositionSinceIndirectAdjacentTreeWalk)) {
    638640            fragment.backtrackingFlags |= BacktrackingFlag::SaveAdjacentBacktrackingStart;
     641            m_needsAdjacentBacktrackingStart = true;
     642        }
    639643        if (fragment.relationToLeftFragment != FragmentRelation::DirectAdjacent && needsAdjacentTail) {
    640644            ASSERT(fragment.relationToRightFragment == FragmentRelation::DirectAdjacent);
     
    663667    if (m_functionType == FunctionType::SelectorCheckerWithCheckingContext)
    664668        m_checkingContextStackReference = m_stackAllocator.push(checkingContextRegister);
     669
     670    if (m_needsAdjacentBacktrackingStart)
     671        m_adjacentBacktrackingStart = m_stackAllocator.allocateUninitialized();
    665672
    666673    Assembler::JumpList failureCases;
     
    691698
    692699    if (m_functionType == FunctionType::SimpleSelectorChecker) {
    693         // Success.
    694         m_assembler.move(Assembler::TrustedImm32(1), returnRegister);
    695         if (!reservedCalleeSavedRegisters)
     700        if (!m_needsAdjacentBacktrackingStart && !reservedCalleeSavedRegisters) {
     701            // Success.
     702            m_assembler.move(Assembler::TrustedImm32(1), returnRegister);
    696703            m_assembler.ret();
    697704
    698         // Failure.
    699         if (!failureCases.empty()) {
    700             Assembler::Jump skipFailureCase;
    701             if (reservedCalleeSavedRegisters)
    702                 skipFailureCase = m_assembler.jump();
    703 
    704             failureCases.link(&m_assembler);
    705             m_assembler.move(Assembler::TrustedImm32(0), returnRegister);
    706 
    707             if (!reservedCalleeSavedRegisters)
     705            // Failure.
     706            if (!failureCases.empty()) {
     707                failureCases.link(&m_assembler);
     708                m_assembler.move(Assembler::TrustedImm32(0), returnRegister);
    708709                m_assembler.ret();
    709             else
     710            }
     711        } else {
     712            // Success.
     713            m_assembler.move(Assembler::TrustedImm32(1), returnRegister);
     714
     715            // Failure.
     716            if (!failureCases.empty()) {
     717                Assembler::Jump skipFailureCase = m_assembler.jump();
     718                failureCases.link(&m_assembler);
     719                m_assembler.move(Assembler::TrustedImm32(0), returnRegister);
    710720                skipFailureCase.link(&m_assembler);
    711         }
    712         if (reservedCalleeSavedRegisters) {
     721            }
     722
     723            if (m_needsAdjacentBacktrackingStart)
     724                m_stackAllocator.popAndDiscardUpTo(m_adjacentBacktrackingStart);
    713725            m_registerAllocator.restoreCalleeSavedRegisters(m_stackAllocator);
    714726            m_assembler.ret();
     
    831843    linkFailures(failureCases, fragment.matchingBacktrackingAction, matchingFailureCases);
    832844
    833     if (fragment.backtrackingFlags & BacktrackingFlag::SaveAdjacentBacktrackingStart)
    834         m_adjacentBacktrackingStart = m_stackAllocator.push(elementAddressRegister);
     845    if (fragment.backtrackingFlags & BacktrackingFlag::SaveAdjacentBacktrackingStart) {
     846        unsigned offsetToAdjacentBacktrackingStart = m_stackAllocator.offsetToStackReference(m_adjacentBacktrackingStart);
     847        m_assembler.storePtr(elementAddressRegister, Assembler::Address(Assembler::stackPointerRegister, offsetToAdjacentBacktrackingStart));
     848    }
    835849}
    836850
     
    926940}
    927941
    928 void SelectorCodeGenerator::generateAdjacentBacktrackingTail(Assembler::JumpList& successCases)
    929 {
    930     StackAllocator successStack = m_stackAllocator;
    931     StackAllocator recoveryStack = m_stackAllocator;
    932     StackAllocator failureStack = m_stackAllocator;
    933 
    934     successStack.popAndDiscard(m_adjacentBacktrackingStart);
    935     successCases.append(m_assembler.jump());
    936 
     942void SelectorCodeGenerator::generateAdjacentBacktrackingTail()
     943{
    937944    // Recovering tail.
    938945    m_adjacentBacktrackingFailureCases.link(&m_assembler);
    939946    m_adjacentBacktrackingFailureCases.clear();
    940     recoveryStack.pop(m_adjacentBacktrackingStart, elementAddressRegister);
     947    unsigned offsetToAdjacentBacktrackingStart = m_stackAllocator.offsetToStackReference(m_adjacentBacktrackingStart);
     948    m_assembler.loadPtr(Assembler::Address(Assembler::stackPointerRegister, offsetToAdjacentBacktrackingStart), elementAddressRegister);
    941949    m_assembler.jump(m_indirectAdjacentEntryPoint);
    942950
    943951    // Total failure tail.
    944952    m_clearAdjacentBacktrackingFailureCases.link(&m_assembler);
    945     failureStack.popAndDiscard(m_adjacentBacktrackingStart);
    946 
    947     m_stackAllocator.merge(std::move(successStack), std::move(recoveryStack), std::move(failureStack));
    948953}
    949954
     
    960965{
    961966    if (fragment.backtrackingFlags & BacktrackingFlag::DirectAdjacentTail && fragment.backtrackingFlags & BacktrackingFlag::DescendantTail) {
    962         Assembler::JumpList successCases;
    963         generateAdjacentBacktrackingTail(successCases);
     967        Assembler::Jump normalCase = m_assembler.jump();
     968        generateAdjacentBacktrackingTail();
    964969        generateDescendantBacktrackingTail();
    965         successCases.link(&m_assembler);
     970        normalCase.link(&m_assembler);
    966971    } else if (fragment.backtrackingFlags & BacktrackingFlag::DirectAdjacentTail) {
    967         Assembler::JumpList successCases;
    968         generateAdjacentBacktrackingTail(successCases);
     972        Assembler::Jump normalCase = m_assembler.jump();
     973        generateAdjacentBacktrackingTail();
    969974        failureCases.append(m_assembler.jump());
    970         successCases.link(&m_assembler);
     975        normalCase.link(&m_assembler);
    971976    } else if (fragment.backtrackingFlags & BacktrackingFlag::DescendantTail) {
    972977        Assembler::Jump normalCase = m_assembler.jump();
  • trunk/Source/WebCore/cssjit/StackAllocator.h

    r164911 r166834  
    5959        RELEASE_ASSERT(!m_offsetFromTop);
    6060        RELEASE_ASSERT(!m_hasFunctionCallPadding);
     61    }
     62
     63    StackReference allocateUninitialized()
     64    {
     65        RELEASE_ASSERT(!m_hasFunctionCallPadding);
     66        m_assembler.addPtrNoFlags(JSC::MacroAssembler::TrustedImm32(-8), JSC::MacroAssembler::stackPointerRegister);
     67        m_offsetFromTop += 8;
     68        return StackReference(m_offsetFromTop);
    6169    }
    6270
Note: See TracChangeset for help on using the changeset viewer.