| 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; |
| } |
| |