Index: runtime/vm/intermediate_language.cc |
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc |
index cb1ed6f25e7b06495c70471598ae2ed39fd5974b..5c2e48518441ad27b49fcd3de7b65b091cf436b5 100644 |
--- a/runtime/vm/intermediate_language.cc |
+++ b/runtime/vm/intermediate_language.cc |
@@ -144,8 +144,8 @@ bool Value::Equals(Value* other) const { |
static int OrderById(CidRange* const* a, CidRange* const* b) { |
// Negative if 'a' should sort before 'b'. |
- ASSERT((*a)->cid_start == (*a)->cid_end); |
- ASSERT((*b)->cid_start == (*b)->cid_end); |
+ ASSERT((*a)->IsSingleCid()); |
+ ASSERT((*b)->IsSingleCid()); |
return (*a)->cid_start - (*b)->cid_start; |
} |
@@ -203,7 +203,7 @@ intptr_t Cids::ComputeHighestCid() const { |
bool Cids::HasClassId(intptr_t cid) const { |
for (int i = 0; i < length(); i++) { |
- if (cid_ranges_[i]->cid_start <= cid && cid <= cid_ranges_[i]->cid_end) { |
+ if (cid_ranges_[i]->Contains(cid)) { |
return true; |
} |
} |
@@ -277,7 +277,7 @@ void Cids::CreateHelper(Zone* zone, |
bool Cids::IsMonomorphic() const { |
if (length() != 1) return false; |
- return cid_ranges_[0]->cid_start == cid_ranges_[0]->cid_end; |
+ return cid_ranges_[0]->IsSingleCid(); |
} |
@@ -301,7 +301,7 @@ CheckClassInstr::CheckClassInstr(Value* value, |
ASSERT(number_of_checks > 0); |
SetInputAt(0, value); |
// Otherwise use CheckSmiInstr. |
- ASSERT(number_of_checks != 1 || cids[0].cid_start != cids[0].cid_end || |
+ ASSERT(number_of_checks != 1 || !cids[0].IsSingleCid() || |
cids[0].cid_start != kSmiCid); |
} |
@@ -322,8 +322,10 @@ EffectSet CheckClassInstr::Dependencies() const { |
EffectSet CheckClassIdInstr::Dependencies() const { |
// Externalization of strings via the API can change the class-id. |
- return Field::IsExternalizableCid(cid_) ? EffectSet::Externalization() |
- : EffectSet::None(); |
+ for (intptr_t i = cids_.cid_start; i <= cids_.cid_end; i++) { |
+ if (Field::IsExternalizableCid(i)) return EffectSet::Externalization(); |
+ } |
+ return EffectSet::None(); |
} |
@@ -376,16 +378,14 @@ intptr_t CheckClassInstr::ComputeCidMask() const { |
intptr_t min = cids_.ComputeLowestCid(); |
intptr_t mask = 0; |
for (intptr_t i = 0; i < cids_.length(); ++i) { |
- intptr_t cid_start = cids_[i].cid_start; |
- intptr_t cid_end = cids_[i].cid_end; |
intptr_t run; |
- uintptr_t range = 1ul + cid_end - cid_start; |
+ uintptr_t range = 1ul + cids_[i].Extent(); |
if (range >= kBitsPerWord) { |
run = -1; |
} else { |
run = (1 << range) - 1; |
} |
- mask |= run << (cid_start - min); |
+ mask |= run << (cids_[i].cid_start - min); |
} |
return mask; |
} |
@@ -2688,7 +2688,8 @@ Instruction* CheckClassInstr::Canonicalize(FlowGraph* flow_graph) { |
Instruction* CheckClassIdInstr::Canonicalize(FlowGraph* flow_graph) { |
if (value()->BindsToConstant()) { |
const Object& constant_value = value()->BoundConstant(); |
- if (constant_value.IsSmi() && Smi::Cast(constant_value).Value() == cid_) { |
+ if (constant_value.IsSmi() && |
+ cids_.Contains(Smi::Cast(constant_value).Value())) { |
return NULL; |
} |
} |