blob: ab1a1928f9fe65a4b851655e3d31594981cc2564 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// 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);