js/src/jit-test/tests/ion/getelem-bounds-hoist.js

changeset 0
6474c204b198
     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);

mercurial