]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - tests/stress/put-local-conservative.js
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / tests / stress / put-local-conservative.js
diff --git a/tests/stress/put-local-conservative.js b/tests/stress/put-local-conservative.js
new file mode 100644 (file)
index 0000000..c63a0c1
--- /dev/null
@@ -0,0 +1,47 @@
+function foo(o, a, b, c) {
+    // Don't do anything real but have some control flow. This causes the PutLocals for a,
+    // b, and c to survive into SSA form. But we don't have any effects, so sinking will be
+    // successful.
+    if (o.f)
+        return 42;
+    else
+        return 0;
+}
+
+function bar(o, y) {
+    var a = y;
+    var b = y + 1;
+    var c = y + 2;
+    var d = y + 3;
+    var e = y + 4;
+    var f = y + 5;
+    var g = y + 6;
+    var h = y + 7;
+    var i = y + 8;
+    var j = y + 9;
+    var k = y + 10;
+    var result = function(p, q) {
+        var x = a + b + c + d + e + f + g + h + i + j + k;
+        if (q) {
+            // Make it appear that it's possible to clobber those closure variables, so that we
+            // load from them again down below.
+            a = b = c = d = e = f = g = h = i = j = k = 42;
+        }
+        if (p)
+            x = foo(o, 1, 2, 3)
+        else
+            x = 5;
+        return x + a + b + c + d + e + f + g + h + i + j + k;
+    };
+    noInline(result);
+    return result;
+}
+
+var o = {f: 42};
+
+for (var i = 0; i < 100000; ++i) {
+    var result = bar(o, i)(true, false);
+    if (result != 42 + 11 * i + 55)
+        throw "Error: bad result: " + result;
+}
+