| Index: src/crankshaft/hydrogen-instructions.cc
|
| diff --git a/src/crankshaft/hydrogen-instructions.cc b/src/crankshaft/hydrogen-instructions.cc
|
| index 0e56d757fdd77b847b0c2b21ba75c66d469d588d..3a0aaa70e7345947537314a806bbcf1a855e8b80 100644
|
| --- a/src/crankshaft/hydrogen-instructions.cc
|
| +++ b/src/crankshaft/hydrogen-instructions.cc
|
| @@ -259,7 +259,11 @@ bool Range::AddAndCheckOverflow(const Representation& r, Range* other) {
|
| bool may_overflow = false;
|
| lower_ = AddWithoutOverflow(r, lower_, other->lower(), &may_overflow);
|
| upper_ = AddWithoutOverflow(r, upper_, other->upper(), &may_overflow);
|
| - KeepOrder();
|
| + if (may_overflow) {
|
| + Clear();
|
| + } else {
|
| + KeepOrder();
|
| + }
|
| #ifdef DEBUG
|
| Verify();
|
| #endif
|
| @@ -271,13 +275,21 @@ bool Range::SubAndCheckOverflow(const Representation& r, Range* other) {
|
| bool may_overflow = false;
|
| lower_ = SubWithoutOverflow(r, lower_, other->upper(), &may_overflow);
|
| upper_ = SubWithoutOverflow(r, upper_, other->lower(), &may_overflow);
|
| - KeepOrder();
|
| + if (may_overflow) {
|
| + Clear();
|
| + } else {
|
| + KeepOrder();
|
| + }
|
| #ifdef DEBUG
|
| Verify();
|
| #endif
|
| return may_overflow;
|
| }
|
|
|
| +void Range::Clear() {
|
| + lower_ = kMinInt;
|
| + upper_ = kMaxInt;
|
| +}
|
|
|
| void Range::KeepOrder() {
|
| if (lower_ > upper_) {
|
| @@ -301,8 +313,12 @@ bool Range::MulAndCheckOverflow(const Representation& r, Range* other) {
|
| int v2 = MulWithoutOverflow(r, lower_, other->upper(), &may_overflow);
|
| int v3 = MulWithoutOverflow(r, upper_, other->lower(), &may_overflow);
|
| int v4 = MulWithoutOverflow(r, upper_, other->upper(), &may_overflow);
|
| - lower_ = Min(Min(v1, v2), Min(v3, v4));
|
| - upper_ = Max(Max(v1, v2), Max(v3, v4));
|
| + if (may_overflow) {
|
| + Clear();
|
| + } else {
|
| + lower_ = Min(Min(v1, v2), Min(v3, v4));
|
| + upper_ = Max(Max(v1, v2), Max(v3, v4));
|
| + }
|
| #ifdef DEBUG
|
| Verify();
|
| #endif
|
|
|