mirror of https://github.com/tc39/test262.git
46 lines
1.1 KiB
JavaScript
46 lines
1.1 KiB
JavaScript
//@ skip if $architecture == "x86"
|
|
|
|
function sumOfArithSeries(limit) {
|
|
return limit * (limit + 1) / 2;
|
|
}
|
|
|
|
var n = 10000000;
|
|
|
|
function bar() { }
|
|
|
|
function verify(q, i) {
|
|
if (q.f == q.g)
|
|
throw "Error: q.f == q.g";
|
|
if (q.f.f != q.g.f)
|
|
throw "Error: q.f.f != q.g.f";
|
|
if (q.f.f.f != i)
|
|
throw "Error: q.f.f.f != i";
|
|
}
|
|
|
|
function foo() {
|
|
var result = 0;
|
|
for (var i = 0; i < n; ++i) {
|
|
var leaf = {f:i};
|
|
var o = {f:leaf};
|
|
var p = {f:leaf};
|
|
var q = {f:o, g:p};
|
|
result += q.f.f.f;
|
|
if (i >= n - 100) {
|
|
// We want the materialization to happen in the exit. So, before calling the thing that
|
|
// causes the materialization, we call bar(). We've never profiled this call at the time
|
|
// of FTL compilation, so this should be an exit.
|
|
bar();
|
|
verify(q, i);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
noInline(foo);
|
|
noInline(verify);
|
|
noInline(bar);
|
|
|
|
var result = foo();
|
|
if (result != sumOfArithSeries(n - 1))
|
|
throw "Error: bad result: " + result;
|