Title: [96184] trunk/Source/_javascript_Core
Revision
96184
Author
[email protected]
Date
2011-09-27 20:39:36 -0700 (Tue, 27 Sep 2011)

Log Message

DFG JIT should speculate more aggressively on reads of array.length
https://bugs.webkit.org/show_bug.cgi?id=68932

Reviewed by Oliver Hunt.
        
This is a 2% speed-up on Kraken, neutral elsewhere.

* dfg/DFGNode.h:
* dfg/DFGPropagator.cpp:
(JSC::DFG::Propagator::propagateNodePredictions):
(JSC::DFG::Propagator::fixupNode):
(JSC::DFG::Propagator::performNodeCSE):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compile):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (96183 => 96184)


--- trunk/Source/_javascript_Core/ChangeLog	2011-09-28 03:37:23 UTC (rev 96183)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-09-28 03:39:36 UTC (rev 96184)
@@ -1,3 +1,20 @@
+2011-09-27  Filip Pizlo  <[email protected]>
+
+        DFG JIT should speculate more aggressively on reads of array.length
+        https://bugs.webkit.org/show_bug.cgi?id=68932
+
+        Reviewed by Oliver Hunt.
+        
+        This is a 2% speed-up on Kraken, neutral elsewhere.
+
+        * dfg/DFGNode.h:
+        * dfg/DFGPropagator.cpp:
+        (JSC::DFG::Propagator::propagateNodePredictions):
+        (JSC::DFG::Propagator::fixupNode):
+        (JSC::DFG::Propagator::performNodeCSE):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::compile):
+
 2011-09-27  Gavin Barraclough  <[email protected]>
 
         DFG JIT - merge changes between 95905 - 96175

Modified: trunk/Source/_javascript_Core/dfg/DFGNode.h (96183 => 96184)


--- trunk/Source/_javascript_Core/dfg/DFGNode.h	2011-09-28 03:37:23 UTC (rev 96183)
+++ trunk/Source/_javascript_Core/dfg/DFGNode.h	2011-09-28 03:39:36 UTC (rev 96184)
@@ -266,6 +266,7 @@
     macro(PutByIdDirect, NodeMustGenerate | NodeClobbersWorld) \
     macro(CheckStructure, NodeResultStorage | NodeMustGenerate) \
     macro(GetByOffset, NodeResultJS) \
+    macro(GetArrayLength, NodeResultInt32) \
     macro(GetMethod, NodeResultJS | NodeMustGenerate) \
     macro(CheckMethod, NodeResultJS | NodeMustGenerate) \
     macro(GetScopeChain, NodeResultJS) \

Modified: trunk/Source/_javascript_Core/dfg/DFGPropagator.cpp (96183 => 96184)


--- trunk/Source/_javascript_Core/dfg/DFGPropagator.cpp	2011-09-28 03:37:23 UTC (rev 96183)
+++ trunk/Source/_javascript_Core/dfg/DFGPropagator.cpp	2011-09-28 03:39:36 UTC (rev 96184)
@@ -375,13 +375,6 @@
             break;
         }
 
-        case ValueToDouble: {
-            // This node should never be visible at this stage of compilation. It is
-            // inserted by fixup(), which follows this phase.
-            ASSERT_NOT_REACHED();
-            break;
-        }
-        
         case ValueAdd: {
             PredictedType left = m_predictions[node.child1()];
             PredictedType right = m_predictions[node.child2()];
@@ -546,6 +539,14 @@
             break;
         }
 
+        case ValueToDouble:
+        case GetArrayLength: {
+            // This node should never be visible at this stage of compilation. It is
+            // inserted by fixup(), which follows this phase.
+            ASSERT_NOT_REACHED();
+            break;
+        }
+        
 #ifndef NDEBUG
         // These get ignored because they don't return anything.
         case PutScopedVar:
@@ -681,6 +682,21 @@
             break;
         }
             
+        case GetById: {
+            if (!isArrayPrediction(m_predictions[node.child1()]))
+                break;
+            if (!isInt32Prediction(m_predictions[m_compileIndex]))
+                break;
+            if (m_codeBlock->identifier(node.identifierNumber()) != m_globalData.propertyNames->length)
+                break;
+            
+#if ENABLE(DFG_DEBUG_PROPAGATION_VERBOSE)
+            printf("  @%u -> GetArrayLength", nodeIndex);
+#endif
+            node.op = GetArrayLength;
+            break;
+        }
+            
         default:
             break;
         }
@@ -1044,6 +1060,7 @@
         case ArithMax:
         case ArithSqrt:
         case GetCallee:
+        case GetArrayLength:
             setReplacement(pureCSE(node));
             break;
             

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (96183 => 96184)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2011-09-28 03:37:23 UTC (rev 96183)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2011-09-28 03:39:36 UTC (rev 96184)
@@ -1831,6 +1831,26 @@
         jsValueResult(resultGPR, m_compileIndex, UseChildrenCalledExplicitly);
         break;
     }
+        
+    case GetArrayLength: {
+        Node& baseNode = m_jit.graph()[node.child1()];
+        SpeculateCellOperand base(this, node.child1());
+        GPRTemporary result(this);
+        
+        GPRReg baseGPR = base.gpr();
+        GPRReg resultGPR = result.gpr();
+        
+        if (baseNode.op != GetLocal || !isArrayPrediction(m_jit.graph().getPrediction(baseNode.local())))
+            speculationCheck(m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(baseGPR), MacroAssembler::TrustedImmPtr(m_jit.globalData()->jsArrayVPtr)));
+        
+        m_jit.loadPtr(MacroAssembler::Address(baseGPR, JSArray::storageOffset()), resultGPR);
+        m_jit.load32(MacroAssembler::Address(resultGPR, OBJECT_OFFSETOF(ArrayStorage, m_length)), resultGPR);
+        
+        speculationCheck(m_jit.branch32(MacroAssembler::LessThan, resultGPR, MacroAssembler::TrustedImm32(0)));
+        
+        integerResult(resultGPR, m_compileIndex);
+        break;
+    }
 
     case CheckStructure: {
         SpeculateCellOperand base(this, node.child1());
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to