Chromium Code Reviews| Index: src/hydrogen-instructions.cc |
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc |
| index c66a7a137d5cbe67b9c76166d84997f77c4ec8ef..f495eeef0f838faf8209efed205b19554ad2e1f3 100644 |
| --- a/src/hydrogen-instructions.cc |
| +++ b/src/hydrogen-instructions.cc |
| @@ -522,8 +522,23 @@ void HValue::RemoveLastAddedRange() { |
| void HValue::ComputeInitialRange(Zone* zone) { |
| + ASSERT(CheckFlag(kHasPreinitializedRange) || !HasRange()); |
| + Range* new_range = InferRange(zone); |
| + if (CheckFlag(kHasPreinitializedRange)) { |
| + range_->Intersect(new_range); |
| + ClearFlag(kHasPreinitializedRange); |
| + } else { |
| + range_ = new_range; |
| + } |
| + ASSERT(HasRange()); |
| +} |
| + |
| + |
| +void HValue::PreinitializeRange(Zone* zone) { |
| ASSERT(!HasRange()); |
| - range_ = InferRange(zone); |
| + range_ = new(zone) Range(); |
| + range_->set_can_be_minus_zero(true); |
| + SetFlag(kHasPreinitializedRange); |
| ASSERT(HasRange()); |
| } |
| @@ -861,11 +876,15 @@ HValue* HBitwise::Canonicalize() { |
| if (left()->IsConstant() && |
| HConstant::cast(left())->HasInteger32Value() && |
| HConstant::cast(left())->Integer32Value() == nop_constant) { |
| + right()->PreinitializeRange(block()->zone()); |
| + right()->range()->set_can_be_minus_zero(false); |
|
Vyacheslav Egorov (Chromium)
2012/05/18 17:39:05
I don't think this is correct. Consider code like:
|
| return right(); |
| } |
| if (right()->IsConstant() && |
| HConstant::cast(right())->HasInteger32Value() && |
| HConstant::cast(right())->Integer32Value() == nop_constant) { |
| + left()->PreinitializeRange(block()->zone()); |
| + left()->range()->set_can_be_minus_zero(false); |
| return left(); |
| } |
| return this; |