| //------------------------------------------------------------------------------------------------------- |
| // Copyright (C) Microsoft. All rights reserved. |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| //------------------------------------------------------------------------------------------------------- |
| |
| |
| |
| var stackAlloc = true; |
| |
| var g; |
| function Ctor() |
| { |
| |
| } |
| |
| function test(p) |
| { |
| var a; |
| if (stackAlloc) |
| { |
| a = new Ctor(); |
| a.z = p + 0.1; // stack number |
| a.escape = p + 0.2; // non stack number |
| } |
| else |
| { |
| a = new Ctor(); |
| g = a; |
| a.z = p + 0.1 // non stack number |
| a.escape = p + 0.2; // non stack number |
| } |
| |
| |
| a.x = a.z + 0.2; // non stack number |
| var c; |
| if (stackAlloc) |
| { |
| c = a; // alias |
| } |
| else |
| { |
| c = new Ctor(); |
| } |
| c.y = p + 0.3; // Still non stack number |
| |
| return a.escape; |
| } |
| |
| WScript.Echo(test(0.1)); |
| stackAlloc = false; |
| WScript.Echo(test(0.1)); |
| WScript.Echo(g.z); |
| WScript.Echo(g.x); |
| WScript.Echo(g.y); |
| |
| stackAlloc = true; |
| WScript.Echo(test(0.1)); |
| stackAlloc = false; |
| WScript.Echo(test(0.1)); |
| WScript.Echo(g.z); |
| WScript.Echo(g.x); |
| WScript.Echo(g.y); |
| |
| |
| function test2(p) |
| { |
| var a; |
| if (stackAlloc) |
| { |
| a = new Ctor(); |
| a.x = 1.1 + p; // stack number |
| } |
| else |
| { |
| a = new Ctor(); |
| a.x = 1.2 + p; // stack number |
| } |
| |
| a.y = 1.3 + p; // stack number |
| |
| |
| var c = a; |
| c.z = 1.4 + p; // stack number |
| } |
| |
| |
| WScript.Echo("Test 2"); |
| stackAlloc = true; |
| test2(0.1); |
| stackAlloc = false; |
| test2(0.1); |
| |
| stackAlloc = true; |
| test2(0.1); |
| stackAlloc = false; |
| test2(0.1); |
| |
| function test3(p) |
| { |
| // Test loop dependencies |
| var a = new Ctor(); |
| a.x = p + 1.1; // stack number |
| a.y = p + 1.2; // stack number |
| |
| for (var i = 0; i < 2; i++) |
| { |
| var n = a.x; |
| a.x = n + 1.1; // stack number; |
| |
| |
| var q = a.y; |
| a.y = i + 1.4; // not stack number, because q is a reference to this number and it is still live |
| a.z = q; |
| WScript.Echo("kill field hoist/copy prop"); |
| } |
| var temp = a.y + 1.3; |
| var temp2 = a.z + 1.3; |
| WScript.Echo(temp); |
| WScript.Echo(temp2); |
| } |
| |
| |
| WScript.Echo("Test 3"); |
| test3(0.1); |
| test3(0.1); |
| test3(0.1); |
| |
| |
| var name = "y"; |
| function test4(p) |
| { |
| // Test array load escape |
| var a = new Ctor(); |
| a.x = p + 1.1; // non-stack number since we don't know what name is |
| a.y = a.x + 1.1; // non-stack number since we don't know what name is |
| return a[name]; |
| } |
| |
| WScript.Echo("Test 4"); |
| WScript.Echo(test4(0.1)); |
| WScript.Echo(test4(0.1)); |
| WScript.Echo(test4(0.1)); |
| WScript.Echo("Test 5"); |
| function test5(p) |
| { |
| // Test array load not escape |
| var a = new Ctor(); |
| a.x = p + 1.1; // stack number |
| a.y = a.x + 1.1; // stack number |
| a[0] = p + 1.2; // not stack number |
| WScript.Echo(a[0]); // non-escape use (as array index is known int |
| return a[name] + 1.1; |
| } |
| |
| WScript.Echo(test5(0.1)); |
| WScript.Echo(test5(0.1)); |
| WScript.Echo(test5(0.1)); |
| |
| |
| WScript.Echo("Test 6"); |
| function test6(p) |
| { |
| var a = new Ctor(); |
| |
| // theoretically these can be mark temp, but the dependencies in the loop confuses the algorithm |
| a.x = p + 1.1; |
| a.y = p + 1.2; |
| |
| for (var i = 0; i < 2; i++) |
| { |
| var n = a[name]; |
| a.y = i + 1.4; // not stack number, because n |
| a.z = n; |
| } |
| WScript.Echo(a.z + 0.1); |
| } |
| |
| test6(0.1); |
| test6(0.1); |
| test6(0.1); |
| |
| |
| WScript.Echo("Test 7"); |
| var func = function (p) |
| { |
| return p+4.4; |
| } |
| function test7(p) |
| { |
| var lit = { prop1: p + 1.1, "14": 4.4, prop2: p+2.2, prop1: p+ 0.1, prop5: func(p), prop3: p+3.3 }; // stack numbers |
| return lit.prop1 + lit.prop5; |
| } |
| |
| WScript.Echo(test7(1)); |
| WScript.Echo(test7(1)); |
| |
| var func = function(p) |
| { |
| return p + 5.5; |
| } |
| WScript.Echo(test7(1)); |
| |
| |
| |
| WScript.Echo("Test 8") |
| var obj = {}; |
| var func = function(p) |
| { |
| var alias = obj; |
| var lit = { prop1: p + 0.1 }; // temp object and number |
| var prop1; |
| for (var i = 0;i < 1; i++) |
| { |
| prop1 = lit.prop1; // hoisted field load, escape store |
| } |
| alias.prop1 = prop1; |
| |
| } |
| |
| func(0.1); |
| func(0.1); |
| func(0.1); |
| WScript.Echo(obj.prop1); |
| |