| Index: src/hydrogen-instructions.cc
|
| ===================================================================
|
| --- src/hydrogen-instructions.cc (revision 8755)
|
| +++ src/hydrogen-instructions.cc (working copy)
|
| @@ -481,6 +481,7 @@
|
|
|
| void HValue::AddNewRange(Range* r) {
|
| if (!HasRange()) ComputeInitialRange();
|
| + if (!HasRange()) range_ = new Range();
|
| ASSERT(HasRange());
|
| r->StackUpon(range_);
|
| range_ = r;
|
| @@ -861,22 +862,27 @@
|
|
|
|
|
| Range* HValue::InferRange() {
|
| - if (representation().IsInteger32()) {
|
| - // Untagged integer32 cannot be -0.
|
| - return new Range ();
|
| - } else {
|
| - // Tagged values, untagged doubles, and values with unknown representation
|
| - // can contain -0.
|
| + if (representation().IsTagged()) {
|
| + // Tagged values are always in int32 range when converted to integer,
|
| + // but they can contain -0.
|
| Range* result = new Range();
|
| result->set_can_be_minus_zero(true);
|
| return result;
|
| + } else if (representation().IsNone()) {
|
| + return NULL;
|
| + } else {
|
| + // Untagged integer32 cannot be -0 and we don't compute ranges for
|
| + // untagged doubles.
|
| + return new Range();
|
| }
|
| }
|
|
|
|
|
| Range* HConstant::InferRange() {
|
| if (has_int32_value_) {
|
| - return new Range(int32_value_, int32_value_);
|
| + Range* result = new Range(int32_value_, int32_value_);
|
| + result->set_can_be_minus_zero(false);
|
| + return result;
|
| }
|
| return HValue::InferRange();
|
| }
|
| @@ -885,7 +891,8 @@
|
| Range* HPhi::InferRange() {
|
| if (representation().IsInteger32()) {
|
| if (block()->IsLoopHeader()) {
|
| - return new Range();
|
| + Range* range = new Range(kMinInt, kMaxInt);
|
| + return range;
|
| } else {
|
| Range* range = OperandAt(0)->range()->Copy();
|
| for (int i = 1; i < OperandCount(); ++i) {
|
|
|