Index: runtime/vm/intermediate_language.cc |
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc |
index cb1ed6f25e7b06495c70471598ae2ed39fd5974b..8e3400b410ee7a57bf068d4a40d40b5a0eeb9a91 100644 |
--- a/runtime/vm/intermediate_language.cc |
+++ b/runtime/vm/intermediate_language.cc |
@@ -1392,8 +1392,9 @@ bool BinaryInt32OpInstr::ComputeCanDeoptimize() const { |
return false; |
case Token::kSHL: |
- return can_overflow() || |
- !RangeUtils::IsPositive(right()->definition()->range()); |
+ // Currently only shifts by in range constant are supported, see |
+ // BinaryInt32OpInstr::IsSupported. |
+ return can_overflow(); |
case Token::kMOD: { |
UNREACHABLE(); |
@@ -1413,22 +1414,25 @@ bool BinarySmiOpInstr::ComputeCanDeoptimize() const { |
return false; |
case Token::kSHR: |
- return !RangeUtils::IsPositive(right()->definition()->range()); |
+ return !RangeUtils::IsPositive(right_range()); |
case Token::kSHL: |
- return can_overflow() || |
- !RangeUtils::IsPositive(right()->definition()->range()); |
+ return can_overflow() || !RangeUtils::IsPositive(right_range()); |
+ |
+ case Token::kMOD: |
+ return RangeUtils::CanBeZero(right_range()); |
- case Token::kMOD: { |
- Range* right_range = this->right()->definition()->range(); |
- return (right_range == NULL) || right_range->Overlaps(0, 0); |
- } |
default: |
return can_overflow(); |
} |
} |
+bool ShiftMintOpInstr::has_shift_count_check() const { |
+ return !RangeUtils::IsWithin(shift_range(), 0, kMintShiftCountLimit); |
+} |
+ |
+ |
bool BinaryIntegerOpInstr::RightIsPowerOfTwoConstant() const { |
if (!right()->definition()->IsConstant()) return false; |
const Object& constant = right()->definition()->AsConstant()->value(); |
@@ -4244,33 +4248,14 @@ const RuntimeEntry& CaseInsensitiveCompareUC16Instr::TargetFunction() const { |
} |
-MergedMathInstr::MergedMathInstr(ZoneGrowableArray<Value*>* inputs, |
- intptr_t deopt_id, |
- MergedMathInstr::Kind kind) |
- : PureDefinition(deopt_id), inputs_(inputs), kind_(kind) { |
- ASSERT(inputs_->length() == InputCountFor(kind_)); |
- for (intptr_t i = 0; i < inputs_->length(); ++i) { |
- ASSERT((*inputs)[i] != NULL); |
- (*inputs)[i]->set_instruction(this); |
- (*inputs)[i]->set_use_index(i); |
- } |
-} |
- |
- |
-intptr_t MergedMathInstr::OutputIndexOf(MethodRecognizer::Kind kind) { |
- switch (kind) { |
- case MethodRecognizer::kMathSin: |
- return 1; |
- case MethodRecognizer::kMathCos: |
- return 0; |
- default: |
- UNIMPLEMENTED(); |
- return -1; |
- } |
+TruncDivModInstr::TruncDivModInstr(Value* lhs, Value* rhs, intptr_t deopt_id) |
+ : TemplateDefinition(deopt_id) { |
+ SetInputAt(0, lhs); |
+ SetInputAt(1, rhs); |
} |
-intptr_t MergedMathInstr::OutputIndexOf(Token::Kind token) { |
+intptr_t TruncDivModInstr::OutputIndexOf(Token::Kind token) { |
switch (token) { |
case Token::kTRUNCDIV: |
return 0; |