Index: runtime/vm/intermediate_language.cc |
=================================================================== |
--- runtime/vm/intermediate_language.cc (revision 14103) |
+++ runtime/vm/intermediate_language.cc (working copy) |
@@ -2187,26 +2187,43 @@ |
switch (op_kind()) { |
case Token::kADD: |
new_min = |
- RangeBoundary::Add(Range::ConstantMin(left_range), |
- Range::ConstantMin(right_range), |
- RangeBoundary::OverflowedMinSmi()); |
+ RangeBoundary::Add(Range::ConstantMin(left_range), |
+ Range::ConstantMin(right_range), |
+ RangeBoundary::OverflowedMinSmi()); |
new_max = |
- RangeBoundary::Add(Range::ConstantMax(left_range), |
- Range::ConstantMax(right_range), |
- RangeBoundary::OverflowedMaxSmi()); |
+ RangeBoundary::Add(Range::ConstantMax(left_range), |
+ Range::ConstantMax(right_range), |
+ RangeBoundary::OverflowedMaxSmi()); |
break; |
case Token::kSUB: |
new_min = |
- RangeBoundary::Sub(Range::ConstantMin(left_range), |
- Range::ConstantMax(right_range), |
- RangeBoundary::OverflowedMinSmi()); |
+ RangeBoundary::Sub(Range::ConstantMin(left_range), |
+ Range::ConstantMax(right_range), |
+ RangeBoundary::OverflowedMinSmi()); |
new_max = |
- RangeBoundary::Sub(Range::ConstantMax(left_range), |
- Range::ConstantMin(right_range), |
- RangeBoundary::OverflowedMaxSmi()); |
+ RangeBoundary::Sub(Range::ConstantMax(left_range), |
+ Range::ConstantMin(right_range), |
+ RangeBoundary::OverflowedMaxSmi()); |
break; |
+ case Token::kBIT_AND: |
+ if (Range::ConstantMin(right_range).value() >= 0) { |
+ new_min = RangeBoundary::FromConstant(0); |
+ new_max = Range::ConstantMax(right_range); |
+ break; |
+ } |
+ if (Range::ConstantMin(left_range).value() >= 0) { |
+ new_min = RangeBoundary::FromConstant(0); |
+ new_max = Range::ConstantMax(left_range); |
+ break; |
+ } |
+ |
+ if (range_ == NULL) { |
+ range_ = Range::Unknown(); |
+ } |
+ return; |
+ |
default: |
if (range_ == NULL) { |
range_ = Range::Unknown(); |
@@ -2221,6 +2238,14 @@ |
} |
+// Inclusive. |
+bool Range::IsWithin(intptr_t min_int, intptr_t max_int) const { |
+ if (!min().IsConstant() || (min().value() < min_int)) return false; |
Vyacheslav Egorov (Google)
2012/10/26 12:21:42
I suggest using LowerBound() and UpperBound() here
srdjan
2012/10/30 18:21:13
Done.
|
+ if (!max().IsConstant() || (max().value() > max_int)) return false; |
+ return true; |
+} |
+ |
+ |
#undef __ |
} // namespace dart |