Title: [128425] trunk/Source/_javascript_Core
Revision
128425
Author
[email protected]
Date
2012-09-13 01:40:00 -0700 (Thu, 13 Sep 2012)

Log Message

Testing whether indexing type is ArrayWithArrayStorage should not compare against ArrayWithArrayStorage
https://bugs.webkit.org/show_bug.cgi?id=96611

Reviewed by Gavin Barraclough.

* dfg/DFGRepatch.cpp:
(JSC::DFG::tryCacheGetByID):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::checkArray):
* jit/JITPropertyAccess.cpp:
(JSC::JIT::privateCompilePatchGetArrayLength):
* jit/JITPropertyAccess32_64.cpp:
(JSC::JIT::privateCompilePatchGetArrayLength):
* llint/LowLevelInterpreter32_64.asm:
* llint/LowLevelInterpreter64.asm:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (128424 => 128425)


--- trunk/Source/_javascript_Core/ChangeLog	2012-09-13 08:38:23 UTC (rev 128424)
+++ trunk/Source/_javascript_Core/ChangeLog	2012-09-13 08:40:00 UTC (rev 128425)
@@ -1,3 +1,21 @@
+2012-09-13  Filip Pizlo  <[email protected]>
+
+        Testing whether indexing type is ArrayWithArrayStorage should not compare against ArrayWithArrayStorage
+        https://bugs.webkit.org/show_bug.cgi?id=96611
+
+        Reviewed by Gavin Barraclough.
+
+        * dfg/DFGRepatch.cpp:
+        (JSC::DFG::tryCacheGetByID):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::checkArray):
+        * jit/JITPropertyAccess.cpp:
+        (JSC::JIT::privateCompilePatchGetArrayLength):
+        * jit/JITPropertyAccess32_64.cpp:
+        (JSC::JIT::privateCompilePatchGetArrayLength):
+        * llint/LowLevelInterpreter32_64.asm:
+        * llint/LowLevelInterpreter64.asm:
+
 2012-09-09  Filip Pizlo  <[email protected]>
 
         JSC should have property butterflies

Modified: trunk/Source/_javascript_Core/dfg/DFGRepatch.cpp (128424 => 128425)


--- trunk/Source/_javascript_Core/dfg/DFGRepatch.cpp	2012-09-13 08:38:23 UTC (rev 128424)
+++ trunk/Source/_javascript_Core/dfg/DFGRepatch.cpp	2012-09-13 08:40:00 UTC (rev 128425)
@@ -254,7 +254,9 @@
         MacroAssembler::JumpList failureCases;
        
         stubJit.loadPtr(MacroAssembler::Address(baseGPR, JSCell::structureOffset()), scratchGPR); 
-        failureCases.append(stubJit.branch8(MacroAssembler::NotEqual, MacroAssembler::Address(baseGPR, Structure::indexingTypeOffset()), MacroAssembler::TrustedImm32(ArrayWithArrayStorage)));
+        stubJit.load8(MacroAssembler::Address(scratchGPR, Structure::indexingTypeOffset()), scratchGPR);
+        failureCases.append(stubJit.branchTest32(MacroAssembler::Zero, scratchGPR, MacroAssembler::TrustedImm32(IsArray)));
+        failureCases.append(stubJit.branchTest32(MacroAssembler::Zero, scratchGPR, MacroAssembler::TrustedImm32(HasArrayStorage)));
         
         stubJit.loadPtr(MacroAssembler::Address(baseGPR, JSObject::butterflyOffset()), scratchGPR);
         stubJit.load32(MacroAssembler::Address(scratchGPR, ArrayStorage::lengthOffset()), scratchGPR);

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (128424 => 128425)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2012-09-13 08:38:23 UTC (rev 128424)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2012-09-13 08:40:00 UTC (rev 128425)
@@ -331,14 +331,21 @@
     }
     case ARRAY_WITH_ARRAY_STORAGE_MODES: {
         GPRTemporary temp(this);
+        GPRReg tempGPR = temp.gpr();
         m_jit.loadPtr(
-            MacroAssembler::Address(baseReg, JSCell::structureOffset()), temp.gpr());
+            MacroAssembler::Address(baseReg, JSCell::structureOffset()), tempGPR);
+        m_jit.load8(MacroAssembler::Address(tempGPR, Structure::indexingTypeOffset()), tempGPR);
+        // FIXME: This can be turned into a single branch. But we currently have no evidence
+        // that doing so would be profitable, nor do I feel comfortable with the present test
+        // coverage for this code path.
         speculationCheck(
             Uncountable, JSValueRegs(), NoNode,
-            m_jit.branch8(
-                MacroAssembler::NotEqual,
-                MacroAssembler::Address(temp.gpr(), Structure::indexingTypeOffset()),
-                MacroAssembler::TrustedImm32(ArrayWithArrayStorage)));
+            m_jit.branchTest32(
+                MacroAssembler::Zero, tempGPR, MacroAssembler::TrustedImm32(IsArray)));
+        speculationCheck(
+            Uncountable, JSValueRegs(), NoNode,
+            m_jit.branchTest32(
+                MacroAssembler::Zero, tempGPR, MacroAssembler::TrustedImm32(HasArrayStorage)));
         
         noResult(m_compileIndex);
         return;

Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp (128424 => 128425)


--- trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp	2012-09-13 08:38:23 UTC (rev 128424)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp	2012-09-13 08:40:00 UTC (rev 128425)
@@ -660,12 +660,14 @@
 #if ENABLE(VALUE_PROFILER)
     storePtr(regT3, m_codeBlock->getOrAddArrayProfile(stubInfo->bytecodeIndex)->addressOfLastSeenStructure());
 #endif
-    Jump failureCases1 = branch8(NotEqual, Address(regT3, Structure::indexingTypeOffset()), TrustedImm32(ArrayWithArrayStorage));
+    load8(Address(regT3, Structure::indexingTypeOffset()), regT3);
+    Jump failureCases1 = branchTest32(Zero, regT3, TrustedImm32(IsArray));
+    Jump failureCases2 = branchTest32(Zero, regT3, TrustedImm32(HasArrayStorage));
 
     // Checks out okay! - get the length from the storage
     loadPtr(Address(regT0, JSObject::butterflyOffset()), regT3);
     load32(Address(regT3, ArrayStorage::lengthOffset()), regT2);
-    Jump failureCases2 = branch32(LessThan, regT2, TrustedImm32(0));
+    Jump failureCases3 = branch32(LessThan, regT2, TrustedImm32(0));
 
     emitFastArithIntToImmNoCheck(regT2, regT0);
     Jump success = jump();
@@ -676,6 +678,7 @@
     CodeLocationLabel slowCaseBegin = stubInfo->callReturnLocation.labelAtOffset(-stubInfo->patch.baseline.u.get.coldPathBegin);
     patchBuffer.link(failureCases1, slowCaseBegin);
     patchBuffer.link(failureCases2, slowCaseBegin);
+    patchBuffer.link(failureCases3, slowCaseBegin);
 
     // On success return back to the hot patch code, at a point it will perform the store to dest for us.
     patchBuffer.link(success, stubInfo->hotPathBegin.labelAtOffset(stubInfo->patch.baseline.u.get.putResult));

Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp (128424 => 128425)


--- trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp	2012-09-13 08:38:23 UTC (rev 128424)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp	2012-09-13 08:40:00 UTC (rev 128425)
@@ -620,13 +620,15 @@
 #if ENABLE(VALUE_PROFILER)
     storePtr(regT2, m_codeBlock->getOrAddArrayProfile(stubInfo->bytecodeIndex)->addressOfLastSeenStructure());
 #endif
-    Jump failureCases1 = branch8(NotEqual, Address(regT2, Structure::indexingTypeOffset()), TrustedImm32(ArrayWithArrayStorage));
+    load8(Address(regT2, Structure::indexingTypeOffset()), regT3);
+    Jump failureCases1 = branchTest32(Zero, regT2, TrustedImm32(IsArray));
+    Jump failureCases2 = branchTest32(Zero, regT2, TrustedImm32(HasArrayStorage));
     
     // Checks out okay! - get the length from the storage
     loadPtr(Address(regT0, JSArray::butterflyOffset()), regT2);
     load32(Address(regT2, ArrayStorage::lengthOffset()), regT2);
     
-    Jump failureCases2 = branch32(Above, regT2, TrustedImm32(INT_MAX));
+    Jump failureCases3 = branch32(Above, regT2, TrustedImm32(INT_MAX));
     move(regT2, regT0);
     move(TrustedImm32(JSValue::Int32Tag), regT1);
     Jump success = jump();
@@ -637,6 +639,7 @@
     CodeLocationLabel slowCaseBegin = stubInfo->callReturnLocation.labelAtOffset(-stubInfo->patch.baseline.u.get.coldPathBegin);
     patchBuffer.link(failureCases1, slowCaseBegin);
     patchBuffer.link(failureCases2, slowCaseBegin);
+    patchBuffer.link(failureCases3, slowCaseBegin);
     
     // On success return back to the hot patch code, at a point it will perform the store to dest for us.
     patchBuffer.link(success, stubInfo->hotPathBegin.labelAtOffset(stubInfo->patch.baseline.u.get.putResult));

Modified: trunk/Source/_javascript_Core/llint/LowLevelInterpreter32_64.asm (128424 => 128425)


--- trunk/Source/_javascript_Core/llint/LowLevelInterpreter32_64.asm	2012-09-13 08:38:23 UTC (rev 128424)
+++ trunk/Source/_javascript_Core/llint/LowLevelInterpreter32_64.asm	2012-09-13 08:40:00 UTC (rev 128425)
@@ -1177,7 +1177,9 @@
     if VALUE_PROFILER
         storep t2, ArrayProfile::m_lastSeenStructure[t1]
     end
-    bbneq Structure::m_indexingType[t2], IsArray | HasArrayStorage, .opGetArrayLengthSlow
+    loadb Structure::m_indexingType[t2], t1
+    btiz t1, IsArray, .opGetArrayLengthSlow
+    btiz t1, HasArrayStorage, .opGetArrayLengthSlow
     loadi 4[PC], t1
     loadp 32[PC], t2
     loadp JSObject::m_butterfly[t3], t0

Modified: trunk/Source/_javascript_Core/llint/LowLevelInterpreter64.asm (128424 => 128425)


--- trunk/Source/_javascript_Core/llint/LowLevelInterpreter64.asm	2012-09-13 08:38:23 UTC (rev 128424)
+++ trunk/Source/_javascript_Core/llint/LowLevelInterpreter64.asm	2012-09-13 08:40:00 UTC (rev 128425)
@@ -1024,7 +1024,9 @@
     if VALUE_PROFILER
         storep t2, ArrayProfile::m_lastSeenStructure[t1]
     end
-    bbneq Structure::m_indexingType[t2], IsArray | HasArrayStorage, .opGetArrayLengthSlow
+    loadb Structure::m_indexingType[t2], t1
+    btiz t1, IsArray, .opGetArrayLengthSlow
+    btiz t1, HasArrayStorage, .opGetArrayLengthSlow
     loadis 8[PB, PC, 8], t1
     loadp 64[PB, PC, 8], t2
     loadp JSObject::m_butterfly[t3], t0
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to