put-local-conservative.js   [plain text]


function foo(o, a, b, c) {
    // Don't do anything real but have some control flow. This causes the PutLocals for a,
    // b, and c to survive into SSA form. But we don't have any effects, so sinking will be
    // successful.
    if (o.f)
        return 42;
    else
        return 0;
}

function bar(o, y) {
    var a = y;
    var b = y + 1;
    var c = y + 2;
    var d = y + 3;
    var e = y + 4;
    var f = y + 5;
    var g = y + 6;
    var h = y + 7;
    var i = y + 8;
    var j = y + 9;
    var k = y + 10;
    var result = function(p, q) {
        var x = a + b + c + d + e + f + g + h + i + j + k;
        if (q) {
            // Make it appear that it's possible to clobber those closure variables, so that we
            // load from them again down below.
            a = b = c = d = e = f = g = h = i = j = k = 42;
        }
        if (p)
            x = foo(o, 1, 2, 3)
        else
            x = 5;
        return x + a + b + c + d + e + f + g + h + i + j + k;
    };
    noInline(result);
    return result;
}

var o = {f: 42};

for (var i = 0; i < 100000; ++i) {
    var result = bar(o, i)(true, false);
    if (result != 42 + 11 * i + 55)
        throw "Error: bad result: " + result;
}