Crashing under JSC::DFG::SpeculativeJIT::spill visiting citicards.com
authorfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Sep 2013 23:27:51 +0000 (23:27 +0000)
committerfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Sep 2013 23:27:51 +0000 (23:27 +0000)
https://bugs.webkit.org/show_bug.cgi?id=121844

Source/JavaScriptCore:

Reviewed by Mark Hahnenberg.

Fix some int52 bugs that caused this.

* bytecode/ValueRecovery.h:
(JSC::ValueRecovery::dumpInContext): There's no such thing as int53.
* dfg/DFGSpeculativeJIT.h:
(JSC::DFG::SpeculativeJIT::spill): Actually spill int52's, instead of hitting an assert and crashing.
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal): Use the right format (from before when we clobber it).

Tools:

Reviewed by Mark Hahnenberg.

* Scripts/run-javascriptcore-tests: Be more clear about what test suite failed.

LayoutTests:

Reviewed by Mark Hahnenberg.

* js/dfg-int52-spill-expected.txt: Added.
* js/dfg-int52-spill-trickier-expected.txt: Added.
* js/dfg-int52-spill-trickier.html: Added.
* js/dfg-int52-spill.html: Added.
* js/script-tests/dfg-int52-spill-trickier.js: Added.
(foo):
* js/script-tests/dfg-int52-spill.js: Added.
(foo):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@156371 268f45cc-cd09-0410-ab3c-d52691b4dbfc

13 files changed:
LayoutTests/ChangeLog
LayoutTests/js/dfg-int52-spill-expected.txt [new file with mode: 0644]
LayoutTests/js/dfg-int52-spill-trickier-expected.txt [new file with mode: 0644]
LayoutTests/js/dfg-int52-spill-trickier.html [new file with mode: 0644]
LayoutTests/js/dfg-int52-spill.html [new file with mode: 0644]
LayoutTests/js/script-tests/dfg-int52-spill-trickier.js [new file with mode: 0644]
LayoutTests/js/script-tests/dfg-int52-spill.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecode/ValueRecovery.h
Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
Tools/ChangeLog
Tools/Scripts/run-javascriptcore-tests

index b0ad15c..9d33c16 100644 (file)
@@ -1,3 +1,19 @@
+2013-09-24  Filip Pizlo  <fpizlo@apple.com>
+
+        Crashing under JSC::DFG::SpeculativeJIT::spill visiting citicards.com
+        https://bugs.webkit.org/show_bug.cgi?id=121844
+
+        Reviewed by Mark Hahnenberg.
+
+        * js/dfg-int52-spill-expected.txt: Added.
+        * js/dfg-int52-spill-trickier-expected.txt: Added.
+        * js/dfg-int52-spill-trickier.html: Added.
+        * js/dfg-int52-spill.html: Added.
+        * js/script-tests/dfg-int52-spill-trickier.js: Added.
+        (foo):
+        * js/script-tests/dfg-int52-spill.js: Added.
+        (foo):
+
 2013-09-24  Alexey Proskuryakov  <ap@apple.com>
 
         Flaky Test: compositing/reflections/load-video-in-reflection.html
diff --git a/LayoutTests/js/dfg-int52-spill-expected.txt b/LayoutTests/js/dfg-int52-spill-expected.txt
new file mode 100644 (file)
index 0000000..f76e570
--- /dev/null
@@ -0,0 +1,10 @@
+Tests that spilling an int52 works.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS foo(2000000000, array) is 209000001908 on all iterations including after DFG tier-up.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/js/dfg-int52-spill-trickier-expected.txt b/LayoutTests/js/dfg-int52-spill-trickier-expected.txt
new file mode 100644 (file)
index 0000000..1c68c87
--- /dev/null
@@ -0,0 +1,10 @@
+Tests that spilling an int52 works for a program that is more tricky and wouldn't be subject to reassociation.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS foo(2000000000, array) is 120000003788 on all iterations including after DFG tier-up.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/js/dfg-int52-spill-trickier.html b/LayoutTests/js/dfg-int52-spill-trickier.html
new file mode 100644 (file)
index 0000000..3316b84
--- /dev/null
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../resources/js-test-pre.js"></script>
+</head>
+<body>
+<script src="script-tests/dfg-int52-spill-trickier.js"></script>
+<script src="../resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/js/dfg-int52-spill.html b/LayoutTests/js/dfg-int52-spill.html
new file mode 100644 (file)
index 0000000..11e44e9
--- /dev/null
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../resources/js-test-pre.js"></script>
+</head>
+<body>
+<script src="script-tests/dfg-int52-spill.js"></script>
+<script src="../resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/js/script-tests/dfg-int52-spill-trickier.js b/LayoutTests/js/script-tests/dfg-int52-spill-trickier.js
new file mode 100644 (file)
index 0000000..7337238
--- /dev/null
@@ -0,0 +1,103 @@
+description(
+"Tests that spilling an int52 works for a program that is more tricky and wouldn't be subject to reassociation."
+);
+
+function foo(x, a) {
+    var y0 = a[47 + 0] + 3000000000;
+    var y1 = a[47 + 1] + 3000000000;
+    var y2 = a[47 + 2] + 3000000000;
+    var y3 = a[47 + 3] + 3000000000;
+    var y4 = a[47 + 4] + 3000000000;
+    var y5 = a[47 + 5] + 3000000000;
+    var y6 = a[47 + 6] + 3000000000;
+    var y7 = a[47 + 7] + 3000000000;
+    var y8 = a[47 + 8] + 3000000000;
+    var y9 = a[47 + 9] + 3000000000;
+    var y10 = a[47 + 10] + 3000000000;
+    var y11 = a[47 + 11] + 3000000000;
+    var y12 = a[47 + 12] + 3000000000;
+    var y13 = a[47 + 13] + 3000000000;
+    var y14 = a[47 + 14] + 3000000000;
+    var y15 = a[47 + 15] + 3000000000;
+    var y16 = a[47 + 16] + 3000000000;
+    var y17 = a[47 + 17] + 3000000000;
+    var y18 = a[47 + 18] + 3000000000;
+    var y19 = a[47 + 19] + 3000000000;
+    var y20 = a[47 + 20] + 3000000000;
+    var y21 = a[47 + 21] + 3000000000;
+    var y22 = a[47 + 22] + 3000000000;
+    var y23 = a[47 + 23] + 3000000000;
+    var y24 = a[47 + 24] + 3000000000;
+    var y25 = a[47 + 25] + 3000000000;
+    var y26 = a[47 + 26] + 3000000000;
+    var y27 = a[47 + 27] + 3000000000;
+    var y28 = a[47 + 28] + 3000000000;
+    var y29 = a[47 + 29] + 3000000000;
+    var y30 = a[47 + 30] + 3000000000;
+    var y31 = a[47 + 31] + 3000000000;
+    var y32 = a[47 + 32] + 3000000000;
+    var y33 = a[47 + 33] + 3000000000;
+    var y34 = a[47 + 34] + 3000000000;
+    var y35 = a[47 + 35] + 3000000000;
+    var y36 = a[47 + 36] + 3000000000;
+    var y37 = a[47 + 37] + 3000000000;
+    var y38 = a[47 + 38] + 3000000000;
+    var y39 = a[47 + 39] + 3000000000;
+
+    var b = a[1];
+    var c = a[2];
+    var d = a[3];
+    var e = a[4];
+    var f = a[5];
+    var g = a[6];
+    var h = a[7];
+    var i = a[8];
+    var j = a[9];
+    var k = a[10];
+    var l = a[11];
+    var m = a[12];
+    var n = a[13];
+    var o = a[14];
+    var p = a[15];
+    var q = a[16];
+    var r = a[17];
+    var s = a[18];
+    var t = a[19];
+    var u = a[20];
+    var v = a[21];
+    var w = a[22];
+    var A = a[23];
+    var B = a[24];
+    var C = a[25];
+    var D = a[26];
+    var E = a[27];
+    var F = a[28];
+    var G = a[29];
+    var H = a[30];
+    var I = a[31];
+    var J = a[32];
+    var K = a[33];
+    var L = a[34];
+    var M = a[35];
+    var N = a[36];
+    var O = a[37];
+    var P = a[38];
+    var Q = a[39];
+    var R = a[40];
+    var S = a[41];
+    var T = a[42];
+    var U = a[43];
+    var V = a[44];
+    var W = a[45];
+    var X = a[46];
+    var Y = a[47];
+    var Z = a[0];
+    
+    return b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z + y0 + y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8 + y9 + y10 + y11 + y12 + y13 + y14 + y15 + y16 + y17 + y18 + y19 + y20 + y21 + y22 + y23 + y24 + y25 + y26 + y27 + y28 + y29 + y30 + y31 + y32 + y33 + y34 + y35 + y36 + y37 + y38 + y39;
+}
+
+var array = [];
+for (var i = 0; i < 100; ++i)
+    array[i] = i;
+
+dfgShouldBe(foo, "foo(2000000000, array)", "120000003788");
diff --git a/LayoutTests/js/script-tests/dfg-int52-spill.js b/LayoutTests/js/script-tests/dfg-int52-spill.js
new file mode 100644 (file)
index 0000000..aae2c61
--- /dev/null
@@ -0,0 +1,104 @@
+description(
+"Tests that spilling an int52 works."
+);
+
+function foo(x, a) {
+    var y = x + 3000000000;
+    var y0 = y + 0;
+    var y1 = y + 1;
+    var y2 = y + 2;
+    var y3 = y + 3;
+    var y4 = y + 4;
+    var y5 = y + 5;
+    var y6 = y + 6;
+    var y7 = y + 7;
+    var y8 = y + 8;
+    var y9 = y + 9;
+    var y10 = y + 10;
+    var y11 = y + 11;
+    var y12 = y + 12;
+    var y13 = y + 13;
+    var y14 = y + 14;
+    var y15 = y + 15;
+    var y16 = y + 16;
+    var y17 = y + 17;
+    var y18 = y + 18;
+    var y19 = y + 19;
+    var y20 = y + 20;
+    var y21 = y + 21;
+    var y22 = y + 22;
+    var y23 = y + 23;
+    var y24 = y + 24;
+    var y25 = y + 25;
+    var y26 = y + 26;
+    var y27 = y + 27;
+    var y28 = y + 28;
+    var y29 = y + 29;
+    var y30 = y + 30;
+    var y31 = y + 31;
+    var y32 = y + 32;
+    var y33 = y + 33;
+    var y34 = y + 34;
+    var y35 = y + 35;
+    var y36 = y + 36;
+    var y37 = y + 37;
+    var y38 = y + 38;
+    var y39 = y + 39;
+
+    var b = a[1];
+    var c = a[2];
+    var d = a[3];
+    var e = a[4];
+    var f = a[5];
+    var g = a[6];
+    var h = a[7];
+    var i = a[8];
+    var j = a[9];
+    var k = a[10];
+    var l = a[11];
+    var m = a[12];
+    var n = a[13];
+    var o = a[14];
+    var p = a[15];
+    var q = a[16];
+    var r = a[17];
+    var s = a[18];
+    var t = a[19];
+    var u = a[20];
+    var v = a[21];
+    var w = a[22];
+    var A = a[23];
+    var B = a[24];
+    var C = a[25];
+    var D = a[26];
+    var E = a[27];
+    var F = a[28];
+    var G = a[29];
+    var H = a[30];
+    var I = a[31];
+    var J = a[32];
+    var K = a[33];
+    var L = a[34];
+    var M = a[35];
+    var N = a[36];
+    var O = a[37];
+    var P = a[38];
+    var Q = a[39];
+    var R = a[40];
+    var S = a[41];
+    var T = a[42];
+    var U = a[43];
+    var V = a[44];
+    var W = a[45];
+    var X = a[46];
+    var Y = a[47];
+    var Z = a[0];
+    
+    return y + 4000000000 + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z + y0 + y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8 + y9 + y10 + y11 + y12 + y13 + y14 + y15 + y16 + y17 + y18 + y19 + y20 + y21 + y22 + y23 + y24 + y25 + y26 + y27 + y28 + y29 + y30 + y31 + y32 + y33 + y34 + y35 + y36 + y37 + y38 + y39;
+}
+
+var array = [];
+for (var i = 0; i < 48; ++i)
+    array[i] = i;
+
+dfgShouldBe(foo, "foo(2000000000, array)", "209000001908");
index b998d39..f75a7a8 100644 (file)
@@ -1,3 +1,19 @@
+2013-09-24  Filip Pizlo  <fpizlo@apple.com>
+
+        Crashing under JSC::DFG::SpeculativeJIT::spill visiting citicards.com
+        https://bugs.webkit.org/show_bug.cgi?id=121844
+
+        Reviewed by Mark Hahnenberg.
+        
+        Fix some int52 bugs that caused this.
+
+        * bytecode/ValueRecovery.h:
+        (JSC::ValueRecovery::dumpInContext): There's no such thing as int53.
+        * dfg/DFGSpeculativeJIT.h:
+        (JSC::DFG::SpeculativeJIT::spill): Actually spill int52's, instead of hitting an assert and crashing.
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal): Use the right format (from before when we clobber it).
+
 2013-09-24  Mark Rowe  <mrowe@apple.com>
 
         <rdar://problem/14971518> WebKit should build against the Xcode default toolchain when targeting OS X 10.8
index c668a23..0bad4ac 100644 (file)
@@ -331,7 +331,7 @@ public:
             out.print("int32(", gpr(), ")");
             return;
         case UnboxedInt52InGPR:
-            out.print("int53(", gpr(), ")");
+            out.print("int52(", gpr(), ")");
             return;
         case UnboxedStrictInt52InGPR:
             out.print("strictInt52(", gpr(), ")");
index 3b4432c..4ab5404 100644 (file)
@@ -513,6 +513,13 @@ public:
             info.spill(*m_stream, spillMe, DataFormatDouble);
             return;
         }
+
+        case DataFormatInt52:
+        case DataFormatStrictInt52: {
+            m_jit.store64(info.gpr(), JITCompiler::addressFor(spillMe));
+            info.spill(*m_stream, spillMe, spillFormat);
+            return;
+        }
             
         default:
             // The following code handles JSValues, int32s, and cells.
index 843433f..538f58a 100644 (file)
@@ -919,6 +919,7 @@ GPRReg SpeculativeJIT::fillSpeculateInt32Internal(Edge edge, DataFormat& returnF
     case DataFormatInt52: {
         GPRReg gpr = info.gpr();
         GPRReg result;
+        DataFormat oldFormat = info.registerFormat();
         if (m_gprs.isLocked(gpr)) {
             result = allocate();
             m_jit.move(gpr, result);
@@ -928,7 +929,7 @@ GPRReg SpeculativeJIT::fillSpeculateInt32Internal(Edge edge, DataFormat& returnF
             result = gpr;
         }
         RELEASE_ASSERT(!(type & ~SpecMachineInt));
-        if (info.registerFormat() == DataFormatInt52)
+        if (oldFormat == DataFormatInt52)
             m_jit.rshift64(TrustedImm32(JSValue::int52ShiftAmount), result);
         if (type & SpecInt52) {
             GPRReg temp = allocate();
index a59393c..c3dd9c2 100644 (file)
@@ -1,3 +1,12 @@
+2013-09-24  Filip Pizlo  <fpizlo@apple.com>
+
+        Crashing under JSC::DFG::SpeculativeJIT::spill visiting citicards.com
+        https://bugs.webkit.org/show_bug.cgi?id=121844
+
+        Reviewed by Mark Hahnenberg.
+
+        * Scripts/run-javascriptcore-tests: Be more clear about what test suite failed.
+
 2013-09-24  Alexey Proskuryakov  <ap@apple.com>
 
         [Mac][WK2] Multiple font tests fail is there is a global setting for font antialiasing threshold
index 5143767..f83078d 100755 (executable)
@@ -306,13 +306,13 @@ my $numJSFailures = @layoutJSFailList;
 my $numJSCrashes = @layoutJSCrashList;
 
 if ($numJSFailures) {
-    print "\n** The following js test failures have been introduced:\n";
+    print "\n** The following LayoutTests/js test failures have been introduced:\n";
     foreach my $testFailure (@layoutJSFailList) {
         print "\t$testFailure";
     }
 }
 if ($numJSCrashes) {
-    print "\n** The following js test crashes have been introduced:\n";
+    print "\n** The following LayoutTests/js test crashes have been introduced:\n";
     foreach my $testCrash (@layoutJSCrashList) {
         print "\t$testCrash";
     }