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