Bug 527512 - ExprFilter missing trivial optimizations for ugt, ult (r=edwsmith,nnethercote)

--HG--
extra : convert_revision : 9bdc25ecdb1b5b3b6a81705df3ae573b812bc990
This commit is contained in:
Steven Johnson 2010-06-03 10:35:26 -07:00
parent 4e076c0bf0
commit 38b8e72eb0

View File

@ -811,7 +811,11 @@ namespace nanojit
return oprnd1; return oprnd1;
case LIR_andi: case LIR_andi:
case LIR_muli: case LIR_muli:
case LIR_ltui: // unsigned < 0 -> always false
// note that we know that oprnd2 == insImmI(0), so just return that
return oprnd2; return oprnd2;
case LIR_gtui: // unsigned >= 0 -> always true
return insImmI(1);
case LIR_eqi: case LIR_eqi:
if (oprnd1->isop(LIR_ori) && if (oprnd1->isop(LIR_ori) &&
oprnd1->oprnd2()->isImmI() && oprnd1->oprnd2()->isImmI() &&
@ -822,19 +826,40 @@ namespace nanojit
default: default:
; ;
} }
} else if (c == -1 || (c == 1 && oprnd1->isCmp())) { } else if (c == -1) {
switch (v) { switch (v) {
case LIR_ori: case LIR_ori:
// x | -1 = -1, cmp | 1 = 1 // x | -1 = -1
return oprnd2; return oprnd2;
case LIR_andi: case LIR_andi:
// x & -1 = x, cmp & 1 = cmp // x & -1 = x
return oprnd1; return oprnd1;
case LIR_gtui:
// u32 > 0xffffffff -> always false
return insImmI(0);
default: default:
; ;
} }
} else if (c == 1 && v == LIR_muli) { } else if (c == 1) {
if (oprnd1->isCmp()) {
switch (v) {
case LIR_ori:
// cmp | 1 = 1
// note that we know that oprnd2 == insImmI(1), so just return that
return oprnd2;
case LIR_andi:
// cmp & 1 = cmp
return oprnd1; return oprnd1;
case LIR_gtui:
// (0|1) > 1 -> always false
return insImmI(0);
default:
;
}
} else if (v == LIR_muli) {
// x * 1 = x
return oprnd1;
}
} }
} }