Source code

Revision control

Copy as Markdown

Other Tools

function expensive() {
with({}) {}
}
function phi_merge_0(i) {
// These computations can overflow, if the output is not truncated.
i = i | 0;
var a0 = i + i;
var a1 = i + i;
if ((a1 | 0) - ((2 * i) | 0)) {
// Good candidate for branch pruning, which marks only a1 as having
// removed uses.
expensive();
expensive();
expensive();
expensive();
expensive();
}
// Simple branch made to let GVN merge the Phi instructions.
if (a1 % 3 == 1) {
a1 = 2 * i;
a0 = 2 * i;
}
// a0 is never used, but a1 is truncated.
return a1 | 0;
}
function phi_merge_1(i) {
// These computations can overflow, if the output is not truncated.
i = i | 0;
var a1 = i + i;
var a0 = i + i;
if ((a1 | 0) - ((2 * i) | 0)) {
// Good candidate for branch pruning, which marks only a1 as having
// removed uses.
expensive();
expensive();
expensive();
expensive();
expensive();
}
// Simple branch made to let GVN merge the Phi instructions.
if (a1 % 3 == 1) {
a1 = 2 * i;
a0 = 2 * i;
}
// a0 is never used, but a1 is truncated.
return a1 | 0;
}
for (var j = 0; j < 300; j++) {
for (var i = 1; i == (i | 0); i = 2 * i + 1) {
assertEq(phi_merge_0(i) < 0x80000000, true);
assertEq(phi_merge_1(i) < 0x80000000, true);
}
}