Title: [198935] trunk/Source/_javascript_Core
Revision
198935
Author
[email protected]
Date
2016-03-31 18:48:34 -0700 (Thu, 31 Mar 2016)

Log Message

[JSC] CFA's valuesAtHead should be a list, not a map
https://bugs.webkit.org/show_bug.cgi?id=156087

Patch by Benjamin Poulain <[email protected]> on 2016-03-31
Reviewed by Mark Lam.

One more step toward moving to the Air-style of liveness analysis:

Make DFG's valuesAtHead a list of Node*-AbstractValue.
This patch alone is already a speedup because our many CFAs
spend an unreasonable amount of time updating at block boundaries.

* dfg/DFGBasicBlock.h:
* dfg/DFGCFAPhase.cpp:
(JSC::DFG::CFAPhase::performBlockCFA):
* dfg/DFGGraph.cpp:
(JSC::DFG::Graph::dump):
* dfg/DFGInPlaceAbstractState.cpp:
(JSC::DFG::InPlaceAbstractState::beginBasicBlock):
(JSC::DFG::setLiveValues):
(JSC::DFG::InPlaceAbstractState::merge):
* dfg/DFGNode.h:
(JSC::DFG::nodeValuePairComparator):
(JSC::DFG::nodeValuePairListDump):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (198934 => 198935)


--- trunk/Source/_javascript_Core/ChangeLog	2016-04-01 01:40:25 UTC (rev 198934)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-04-01 01:48:34 UTC (rev 198935)
@@ -1,3 +1,29 @@
+2016-03-31  Benjamin Poulain  <[email protected]>
+
+        [JSC] CFA's valuesAtHead should be a list, not a map
+        https://bugs.webkit.org/show_bug.cgi?id=156087
+
+        Reviewed by Mark Lam.
+
+        One more step toward moving to the Air-style of liveness analysis:
+
+        Make DFG's valuesAtHead a list of Node*-AbstractValue.
+        This patch alone is already a speedup because our many CFAs
+        spend an unreasonable amount of time updating at block boundaries.
+
+        * dfg/DFGBasicBlock.h:
+        * dfg/DFGCFAPhase.cpp:
+        (JSC::DFG::CFAPhase::performBlockCFA):
+        * dfg/DFGGraph.cpp:
+        (JSC::DFG::Graph::dump):
+        * dfg/DFGInPlaceAbstractState.cpp:
+        (JSC::DFG::InPlaceAbstractState::beginBasicBlock):
+        (JSC::DFG::setLiveValues):
+        (JSC::DFG::InPlaceAbstractState::merge):
+        * dfg/DFGNode.h:
+        (JSC::DFG::nodeValuePairComparator):
+        (JSC::DFG::nodeValuePairListDump):
+
 2016-03-31  Saam barati  <[email protected]>
 
         Revert rewrite const as var workaround

Modified: trunk/Source/_javascript_Core/dfg/DFGBasicBlock.h (198934 => 198935)


--- trunk/Source/_javascript_Core/dfg/DFGBasicBlock.h	2016-04-01 01:40:25 UTC (rev 198934)
+++ trunk/Source/_javascript_Core/dfg/DFGBasicBlock.h	2016-04-01 01:48:34 UTC (rev 198935)
@@ -245,7 +245,11 @@
         bool liveAtTailIsDirty { false };
         HashSet<Node*> liveAtTail;
         HashSet<Node*> liveAtHead;
-        HashMap<Node*, AbstractValue> valuesAtHead;
+        struct NodeAbstractValuePair {
+            Node* node;
+            AbstractValue value;
+        };
+        Vector<NodeAbstractValuePair> valuesAtHead;
         HashMap<Node*, AbstractValue> valuesAtTail;
         
         SSAData(BasicBlock*);

Modified: trunk/Source/_javascript_Core/dfg/DFGCFAPhase.cpp (198934 => 198935)


--- trunk/Source/_javascript_Core/dfg/DFGCFAPhase.cpp	2016-04-01 01:40:25 UTC (rev 198934)
+++ trunk/Source/_javascript_Core/dfg/DFGCFAPhase.cpp	2016-04-01 01:48:34 UTC (rev 198935)
@@ -148,7 +148,7 @@
         if (m_verbose) {
             dataLog("      head vars: ", block->valuesAtHead, "\n");
             if (m_graph.m_form == SSA)
-                dataLog("      head regs: ", mapDump(block->ssa->valuesAtHead), "\n");
+                dataLog("      head regs: ", nodeValuePairListDump(block->ssa->valuesAtHead), "\n");
         }
         for (unsigned i = 0; i < block->size(); ++i) {
             if (m_verbose) {

Modified: trunk/Source/_javascript_Core/dfg/DFGGraph.cpp (198934 => 198935)


--- trunk/Source/_javascript_Core/dfg/DFGGraph.cpp	2016-04-01 01:40:25 UTC (rev 198934)
+++ trunk/Source/_javascript_Core/dfg/DFGGraph.cpp	2016-04-01 01:48:34 UTC (rev 198935)
@@ -512,7 +512,7 @@
             RELEASE_ASSERT(block->ssa);
             out.print("  Availability: ", block->ssa->availabilityAtHead, "\n");
             out.print("  Live: ", nodeListDump(block->ssa->liveAtHead), "\n");
-            out.print("  Values: ", nodeMapDump(block->ssa->valuesAtHead, context), "\n");
+            out.print("  Values: ", nodeValuePairListDump(block->ssa->valuesAtHead, context), "\n");
             break;
         } }
         for (size_t i = 0; i < block->size(); ++i) {

Modified: trunk/Source/_javascript_Core/dfg/DFGInPlaceAbstractState.cpp (198934 => 198935)


--- trunk/Source/_javascript_Core/dfg/DFGInPlaceAbstractState.cpp	2016-04-01 01:40:25 UTC (rev 198934)
+++ trunk/Source/_javascript_Core/dfg/DFGInPlaceAbstractState.cpp	2016-04-01 01:48:34 UTC (rev 198935)
@@ -63,7 +63,7 @@
     
     if (m_graph.m_form == SSA) {
         for (auto& entry : basicBlock->ssa->valuesAtHead)
-            forNode(entry.key) = entry.value;
+            forNode(entry.node) = entry.value;
     }
     basicBlock->cfaShouldRevisit = false;
     basicBlock->cfaHasVisited = true;
@@ -84,6 +84,14 @@
         values.add(*iter, AbstractValue());
 }
 
+static void setLiveValues(Vector<BasicBlock::SSAData::NodeAbstractValuePair>& values, HashSet<Node*>& live)
+{
+    values.resize(0);
+    values.reserveCapacity(live.size());
+    for (Node* node : live)
+        values.uncheckedAppend(BasicBlock::SSAData::NodeAbstractValuePair { node, AbstractValue() });
+}
+
 void InPlaceAbstractState::initialize()
 {
     BasicBlock* root = m_graph.block(0);
@@ -300,7 +308,7 @@
             changed |= to->valuesAtHead[i].merge(from->valuesAtTail[i]);
 
         for (auto& entry : to->ssa->valuesAtHead) {
-            Node* node = entry.key;
+            Node* node = entry.node;
             if (verbose)
                 dataLog("      Merging for ", node, ": from ", from->ssa->valuesAtTail.find(node)->value, " to ", entry.value, "\n");
             changed |= entry.value.merge(

Modified: trunk/Source/_javascript_Core/dfg/DFGNode.h (198934 => 198935)


--- trunk/Source/_javascript_Core/dfg/DFGNode.h	2016-04-01 01:40:25 UTC (rev 198934)
+++ trunk/Source/_javascript_Core/dfg/DFGNode.h	2016-04-01 01:48:34 UTC (rev 198935)
@@ -2341,6 +2341,25 @@
     return out.toCString();
 }
 
+template<typename IteratorType>
+inline bool nodeValuePairComparator(IteratorType a, IteratorType b)
+{
+    return nodeComparator(a.node, b.node);
+}
+
+template<typename T>
+CString nodeValuePairListDump(const T& nodeValuePairList, DumpContext* context = 0)
+{
+    T sortedList = nodeValuePairList;
+    std::sort(sortedList.begin(), sortedList.end(), nodeValuePairComparator<decltype(*sortedList.begin())>);
+
+    StringPrintStream out;
+    CommaPrinter comma;
+    for (const auto& pair : sortedList)
+        out.print(comma, pair.node, "=>", inContext(pair.value, context));
+    return out.toCString();
+}
+
 } } // namespace JSC::DFG
 
 namespace WTF {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to