1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/ion/getelem-bounds-hoist.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,83 @@ 1.4 +var a = [1,2,3,4,5]; 1.5 + 1.6 +// Basic overflow in hoisted condition. 1.7 +function foo(x, n) { 1.8 + var v = 0; 1.9 + for (var i = 0; i < n; i++) 1.10 + v += x[i]; 1.11 + return v; 1.12 +} 1.13 +for (var i = 0; i < 15; i++) 1.14 + assertEq(foo(a, 5), 15); 1.15 +assertEq(foo(a, 6), NaN); 1.16 + 1.17 +// Basic underflow in hoisted condition. 1.18 +function foo2(x, m, n) { 1.19 + var v = 0; 1.20 + for (var i = m; i < n; i++) 1.21 + v += x[i]; 1.22 + return v; 1.23 +} 1.24 +for (var i = 0; i < 15; i++) 1.25 + assertEq(foo2(a, 0, 5), 15); 1.26 +assertEq(foo2(a, -1, 5), NaN); 1.27 + 1.28 +// Overflow when hoisting consolidated condition. 1.29 +function foo3(x, m, n) { 1.30 + var v = 0; 1.31 + for (var i = m; i < n; i++) 1.32 + v += x[i] + x[i + 1] + x[i + 2]; 1.33 + return v; 1.34 +} 1.35 +for (var i = 0; i < 15; i++) 1.36 + assertEq(foo3(a, 0, 3), 27); 1.37 +assertEq(foo3(a, 0, 4), NaN); 1.38 + 1.39 +// Underflow when hoisting consolidated condition. 1.40 +function foo4(x, m, n) { 1.41 + var v = 0; 1.42 + for (var i = m; i < n; i++) 1.43 + v += x[i] + x[i - 1] + x[i - 2]; 1.44 + return v; 1.45 +} 1.46 +for (var i = 0; i < 15; i++) 1.47 + assertEq(foo4(a, 2, 5), 27); 1.48 +assertEq(foo4(a, 0, 5), NaN); 1.49 + 1.50 +// Underflow due to decreasing index. 1.51 +function foo5(x, n) { 1.52 + var v = 0; 1.53 + for (var i = 0; i < n; i++) { 1.54 + v += x[i]; 1.55 + if (n == 4) 1.56 + i -= 2; 1.57 + if (i == -5) 1.58 + break; 1.59 + } 1.60 + return v; 1.61 +} 1.62 +for (var i = 0; i < 15; i++) 1.63 + assertEq(foo5(a, 5), 15); 1.64 +assertEq(foo5(a, 4), NaN); 1.65 + 1.66 +// Overflow after access at constant offset. 1.67 +function foo6(x, m, n) { 1.68 + var v = 0; 1.69 + for (var i = m; i < n; i++) 1.70 + v += x[i + 10]; 1.71 + return v; 1.72 +} 1.73 +for (var i = 0; i < 15; i++) 1.74 + assertEq(foo6(a, -10, -5), 15); 1.75 +assertEq(foo6(a, -10, -4), NaN); 1.76 + 1.77 +// Underflow after access at constant offset. 1.78 +function foo7(x, m, n) { 1.79 + var v = 0; 1.80 + for (var i = m; i < n; i++) 1.81 + v += x[i + 10]; 1.82 + return v; 1.83 +} 1.84 +for (var i = 0; i < 15; i++) 1.85 + assertEq(foo7(a, -10, -5), 15); 1.86 +assertEq(foo7(a, -11, -5), NaN);