Reviewers: Vyacheslav Egorov,

Message:
Since you opened the issue, could you review this?

Description:
Fix for issue 2132.

BUG=2132
TEST=


Please review this at https://chromiumcodereview.appspot.com/10411016/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/hydrogen-instructions.h
  M src/hydrogen-instructions.cc
  M src/hydrogen.cc


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);
     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;
Index: src/hydrogen-instructions.h
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
index 9d262fc811724c985c6ddc96697c218e6daab976..872e2b7f34e14630bc0f77f92c44eabb0190b527 100644
--- a/src/hydrogen-instructions.h
+++ b/src/hydrogen-instructions.h
@@ -542,6 +542,10 @@ class HValue: public ZoneObject {
// sets this flag, it must implement SetSideEffectDominator() and should
     // indicate which side effects to track by setting GVN flags.
     kTrackSideEffectDominators,
+    // This flag must be set if a phase before range analysis adds range
+    // information, so that range analysis can still assert that it cannot
+    // be run twice on any HValue.
+    kHasPreinitializedRange,
     kCanOverflow,
     kBailoutOnMinusZero,
     kCanBeDivByZero,
@@ -712,6 +716,7 @@ class HValue: public ZoneObject {
   void AddNewRange(Range* r, Zone* zone);
   void RemoveLastAddedRange();
   void ComputeInitialRange(Zone* zone);
+  void PreinitializeRange(Zone* zone);

   // Representation helpers.
   virtual Representation RequiredInputRepresentation(int index) = 0;
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index 3be001e42b79b996f82523d7927b8fd0c412f8a6..13d4427319cd586266820c1e5a1afa505b4aaa3a 100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -1108,7 +1108,8 @@ void HRangeAnalysis::UpdateControlFlowRange(Token::Value op,


 void HRangeAnalysis::InferRange(HValue* value) {
-  ASSERT(!value->HasRange());
+  ASSERT(value->CheckFlag(HValue::kHasPreinitializedRange)
+         || !value->HasRange());
   if (!value->representation().IsNone()) {
     value->ComputeInitialRange(zone_);
     Range* range = value->range();


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to