blob: b7c8f53682e5cb6ca4140e1ed8491fcd79b23bae [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.
//-------------------------------------------------------------------------------------------------------
// Conv_Num gets changed to Nop during copy-prop. The Nop instruction should not go through type specialization.
function test0(a) {
a &= 1;
var b = 1 << a;
var c = 0;
if(a)
c = (b = +b) * 1.1;
return ~b;
}
WScript.Echo("test0: " + test0(1));
// - '~o' is not int-specialized but produces an int-range value, though 'a' is available only as a var
// - 'a === 1.1' is float-specialized, so now 'a' is also available as a float64
// - 'a = 1' makes 'a' only available as an int32 in the branch
// - Now we have a.v and a.f live on one side with 'a' having an int value, and a.i on the other side. The merge needs to keep
// a.v live on both sides since due to the int value, 'a' may be int-specialized later (in 'a + 1'). a.v needs to be available
// since a.f cannot be losslessly converted into an int32 (expensive and not supported at the time of this writing).
function test1() {
var o = {};
var a = ~o;
if(a === 1.1)
a = 1;
return a + 1;
}
WScript.Echo("test1: " + test1());
var shouldBailout = false;
function testrem(){
function leaf(x) { return x; };
var obj0 = {};
var func0 = function(p0,p1,p2){
return (g += k);
}
var func1 = function(p0){
// Make sure that we track implicit register kills properly for this type-specialized %.
k -=((((r ^ (++ q)) % (~ 1)) * (1 - ((shouldBailout ? func0 = leaf : 1), func0(1, 1)))) ? 1 : d);
}
var func2 = function(p0,p1,p2){
func0(1, 1, 1, 1, (-- d), 1);
}
obj0.method0 = func2;
var b = 2147483647;
var d = -984599814;
var g = 1;
var k = 1;
var q = 7.26957791630936E+18;
var r = -264469094;
obj0.prop0 = 1;
obj0.length = {prop7: 1, prop6: 1, prop5: 1, prop4: 1, prop3: 1, prop2: 1, prop1: (q += b), prop0: (func1() * obj0.method0(1, 1, 1, 1))};
((obj0.prop0 -= g));
WScript.Echo("obj0.prop0 = " + (obj0.prop0|0));
};
testrem();
testrem();
// VSO bug 5497066
// Hoisting FromVar from a region where it doesn't need a bailout
// to one where it does
function test2() {
var func1 = function (argMath2) {
for (; __loopvar0 != 2 && d < argMath2; ) {
__loopvar0 += 3;
}
};
var i32 = new Int32Array();
var d = -1865727919761880000;
var uniqobj0 = Object();
var __loopvar0 = -1;
var count = 1;
for (; count ? true : func1(uniqobj0); i32[1317940107]) {
count--;
}
uniqobj0;
}
test2();
test2();