Ignore:
Timestamp:
Sep 26, 2014, 3:53:20 PM (11 years ago)
Author:
[email protected]
Message:

DFG shouldn't insert store barriers when it has it on good authority that we're not storing a cell
https://bugs.webkit.org/show_bug.cgi?id=137161

Reviewed by Mark Hahnenberg.

This looks like a 1% Octane speed-up.

  • bytecode/SpeculatedType.h:

(JSC::isNotCellSpeculation):

  • dfg/DFGFixupPhase.cpp:

(JSC::DFG::FixupPhase::fixupNode):
(JSC::DFG::FixupPhase::insertStoreBarrier):
(JSC::DFG::FixupPhase::insertCheck):

  • dfg/DFGNode.h:

(JSC::DFG::Node::shouldSpeculateNotCell):

File:
1 edited

Legend:

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

    r173993 r174025  
    645645                fixEdge<KnownCellUse>(child1);
    646646                fixEdge<Int32Use>(child2);
    647                 insertStoreBarrier(m_indexInBlock, child1);
     647                insertStoreBarrier(m_indexInBlock, child1, child3);
    648648                break;
    649649            default:
     
    683683            case Array::Contiguous:
    684684            case Array::ArrayStorage:
    685                 insertStoreBarrier(m_indexInBlock, node->child1());
     685                insertStoreBarrier(m_indexInBlock, node->child1(), node->child2());
    686686                break;
    687687            default:
     
    855855        case PutClosureVar: {
    856856            fixEdge<KnownCellUse>(node->child1());
    857             insertStoreBarrier(m_indexInBlock, node->child1());
     857            insertStoreBarrier(m_indexInBlock, node->child1(), node->child2());
    858858            break;
    859859        }
     
    900900        case PutByIdDirect: {
    901901            fixEdge<CellUse>(node->child1());
    902             insertStoreBarrier(m_indexInBlock, node->child1());
     902            insertStoreBarrier(m_indexInBlock, node->child1(), node->child2());
    903903            break;
    904904        }
     
    943943                fixEdge<KnownCellUse>(node->child1());
    944944            fixEdge<KnownCellUse>(node->child2());
    945             insertStoreBarrier(m_indexInBlock, node->child2());
     945            insertStoreBarrier(m_indexInBlock, node->child2(), node->child3());
    946946            break;
    947947        }
     
    949949        case MultiPutByOffset: {
    950950            fixEdge<CellUse>(node->child1());
    951             insertStoreBarrier(m_indexInBlock, node->child1());
     951            insertStoreBarrier(m_indexInBlock, node->child1(), node->child2());
    952952            break;
    953953        }
     
    16411641    }
    16421642   
    1643     void insertStoreBarrier(unsigned indexInBlock, Edge child1)
    1644     {
    1645         Node* barrierNode = m_graph.addNode(SpecNone, StoreBarrier, m_currentNode->origin, child1);
    1646         m_insertionSet.insert(indexInBlock, barrierNode);
     1643    void insertStoreBarrier(unsigned indexInBlock, Edge base, Edge value = Edge())
     1644    {
     1645        if (!!value) {
     1646            if (value->shouldSpeculateInt32()) {
     1647                insertCheck<Int32Use>(indexInBlock, value.node());
     1648                return;
     1649            }
     1650           
     1651            if (value->shouldSpeculateBoolean()) {
     1652                insertCheck<BooleanUse>(indexInBlock, value.node());
     1653                return;
     1654            }
     1655           
     1656            if (value->shouldSpeculateOther()) {
     1657                insertCheck<OtherUse>(indexInBlock, value.node());
     1658                return;
     1659            }
     1660           
     1661            if (value->shouldSpeculateNumber()) {
     1662                insertCheck<NumberUse>(indexInBlock, value.node());
     1663                return;
     1664            }
     1665           
     1666            if (value->shouldSpeculateNotCell()) {
     1667                insertCheck<NotCellUse>(indexInBlock, value.node());
     1668                return;
     1669            }
     1670        }
     1671
     1672        m_insertionSet.insertNode(
     1673            indexInBlock, SpecNone, StoreBarrier, m_currentNode->origin, base);
     1674    }
     1675   
     1676    template<UseKind useKind>
     1677    void insertCheck(unsigned indexInBlock, Node* node)
     1678    {
     1679        observeUseKindOnNode<useKind>(node);
     1680        m_insertionSet.insertNode(
     1681            indexInBlock, SpecNone, Check, m_currentNode->origin, Edge(node, useKind));
    16471682    }
    16481683
Note: See TracChangeset for help on using the changeset viewer.