mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1090424: IonMonkey: Improve range on when to fold MCompare, r=sunfish
This commit is contained in:
parent
35ba0aa3f1
commit
7bdb656ede
55
js/src/jit-test/tests/ion/bug1090424.js
Normal file
55
js/src/jit-test/tests/ion/bug1090424.js
Normal file
@ -0,0 +1,55 @@
|
||||
|
||||
let w
|
||||
(function() {
|
||||
testgt1 = function(x) {
|
||||
return (-0x80000000 >= (x | 0))
|
||||
}
|
||||
testgt2 = function(x) {
|
||||
return (+0x7fffffff >= (x | 0))
|
||||
}
|
||||
testgt3 = function(x) {
|
||||
return ((x | 0) >= -0x80000000)
|
||||
}
|
||||
testgt4 = function(x) {
|
||||
return ((x | 0) >= +0x7fffffff)
|
||||
}
|
||||
|
||||
testlt1 = function(x) {
|
||||
return (-0x80000000 <= (x | 0))
|
||||
}
|
||||
testlt2 = function(x) {
|
||||
return (+0x7fffffff <= (x | 0))
|
||||
}
|
||||
testlt3 = function(x) {
|
||||
return ((x | 0) <= -0x80000000)
|
||||
}
|
||||
testlt4 = function(x) {
|
||||
return ((x | 0) <= +0x7fffffff)
|
||||
}
|
||||
|
||||
})()
|
||||
assertEq(testgt1(-0x80000000), true);
|
||||
assertEq(testgt1(-0x80000000), true);
|
||||
assertEq(testgt1(0), false);
|
||||
assertEq(testgt2(0x7fffffff), true);
|
||||
assertEq(testgt2(0x7fffffff), true);
|
||||
assertEq(testgt2(0), true);
|
||||
assertEq(testgt3(-0x80000000), true);
|
||||
assertEq(testgt3(-0x80000000), true);
|
||||
assertEq(testgt3(0), true);
|
||||
assertEq(testgt4(0x7fffffff), true);
|
||||
assertEq(testgt4(0x7fffffff), true);
|
||||
assertEq(testgt4(0), false);
|
||||
|
||||
assertEq(testlt1(-0x80000000), true);
|
||||
assertEq(testlt1(-0x80000000), true);
|
||||
assertEq(testlt1(0), true);
|
||||
assertEq(testlt2(0x7fffffff), true);
|
||||
assertEq(testlt2(0x7fffffff), true);
|
||||
assertEq(testlt2(0), false);
|
||||
assertEq(testlt3(-0x80000000), true);
|
||||
assertEq(testlt3(-0x80000000), true);
|
||||
assertEq(testlt3(0), false);
|
||||
assertEq(testlt4(0x7fffffff), true);
|
||||
assertEq(testlt4(0x7fffffff), true);
|
||||
assertEq(testlt4(0), true);
|
@ -1870,7 +1870,7 @@ MMinMax::foldsTo(TempAllocator &alloc)
|
||||
}
|
||||
|
||||
// max(int32, cte <= INT32_MIN) = int32
|
||||
if (val.isDouble() && val.toDouble() < INT32_MIN && isMax()) {
|
||||
if (val.isDouble() && val.toDouble() <= INT32_MIN && isMax()) {
|
||||
MLimitedTruncate *limit =
|
||||
MLimitedTruncate::New(alloc, operand->getOperand(0), MDefinition::NoTruncate);
|
||||
block()->insertBefore(this, limit);
|
||||
@ -3059,9 +3059,16 @@ MCompare::evaluateConstantOperands(TempAllocator &alloc, bool *result)
|
||||
}
|
||||
break;
|
||||
case JSOP_LE:
|
||||
if (cte >= INT32_MAX || cte <= INT32_MIN) {
|
||||
*result = !((constant == lhs()) ^ (cte <= INT32_MIN));
|
||||
replaced = true;
|
||||
if (constant == lhs()) {
|
||||
if (cte > INT32_MAX || cte <= INT32_MIN) {
|
||||
*result = (cte <= INT32_MIN);
|
||||
replaced = true;
|
||||
}
|
||||
} else {
|
||||
if (cte >= INT32_MAX || cte < INT32_MIN) {
|
||||
*result = (cte >= INT32_MIN);
|
||||
replaced = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case JSOP_GT:
|
||||
@ -3071,9 +3078,16 @@ MCompare::evaluateConstantOperands(TempAllocator &alloc, bool *result)
|
||||
}
|
||||
break;
|
||||
case JSOP_GE:
|
||||
if (cte >= INT32_MAX || cte <= INT32_MIN) {
|
||||
*result = !((constant == rhs()) ^ (cte <= INT32_MIN));
|
||||
replaced = true;
|
||||
if (constant == lhs()) {
|
||||
if (cte >= INT32_MAX || cte < INT32_MIN) {
|
||||
*result = (cte >= INT32_MAX);
|
||||
replaced = true;
|
||||
}
|
||||
} else {
|
||||
if (cte > INT32_MAX || cte <= INT32_MIN) {
|
||||
*result = (cte <= INT32_MIN);
|
||||
replaced = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case JSOP_STRICTEQ: // Fall through.
|
||||
|
Loading…
Reference in New Issue
Block a user