//------------------------------------------------------------------------------------------------------- | |
// Copyright (C) Microsoft. All rights reserved. | |
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
//------------------------------------------------------------------------------------------------------- | |
function test0() { | |
var a = 0x3fffffff << 1; | |
var b = a + 0.1; | |
for(var i = 0; i < 2; ++i) { | |
for(var j = 0; j < 2; ++j) { | |
a &= b; | |
-a | 0; | |
} | |
} | |
} | |
test0(); | |
test0(); | |
// - In the loop prepass, by the inner loop's back-edge, 'a' is live as a lossless int32 | |
// - On the merge after the inner loop, the value of 'a' is turned into a number value when aggressive int type specialization | |
// is disabled, because it changed inside the loop. This is not strictly necessary because the only change to 'a' inside the | |
// loop is assigning to it the result of a bitwise and operation, which always produces an int32. However, we don't track that | |
// in the values, so we have to assume that any change inside the loop could eventually and make it not an int32. | |
// - When the value of 'a' is turned into a number value, it is then invalid for the lossless int version of 'a' to be live | |
function test1() { | |
var a = 1; | |
for(var i = 0; i < 1; ++i) { | |
for(var j = 0; j < 1; ++j) { | |
if(1) | |
a &= 1; | |
a & 255; | |
} | |
} | |
}; | |
test1(); | |
test1(); | |
function test2() { | |
return (2147483648 + 1) | 0; | |
}; | |
test2(); | |
test2(); | |
function test3() { | |
var a = 0; | |
var b = 0; | |
var c = 0; | |
for(var i = 0; i < 2; ++i) { | |
if(a) { | |
b = ~a; | |
test0a(); | |
} | |
c &= b; | |
} | |
function test3a() { a; } | |
}; | |
test3(); | |
test3(); | |
function test4() { | |
var obj0 = { prop1: 0 }; | |
var b = 1; | |
prop0 = new Float64Array(1)[0]; | |
var x = 0; | |
for(var i = 0; i < 2; ++i) { | |
++x; | |
if(obj0.prop1 === prop0) { | |
for(var j = 0; j < 1; ++j) { | |
if(1.1) | |
obj0 = {}; | |
else { | |
var k = 0; | |
do { | |
if(k > 0) break; | |
++k; | |
++b; | |
} while(1); | |
} | |
} | |
} | |
} | |
return x; | |
function test4a() { b; } | |
}; | |
WScript.Echo("test4: " + test4()); | |
WScript.Echo("test4: " + test4()); | |
function test5(b) { | |
var o = {}; | |
var a = -2147483646; | |
for(var i = 0; o.p && i < 1; ++i) { | |
if(1 === 1) { | |
if(1) | |
a = b; | |
[a]; | |
} | |
} | |
}; | |
test5(1); | |
test5({}); |