Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(831)

Unified Diff: runtime/vm/intermediate_language.cc

Issue 2891713002: Cleanup: Make CheckClassId instruction more general so it (Closed)
Patch Set: Feedback from Martin Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | runtime/vm/intermediate_language_arm.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
}
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | runtime/vm/intermediate_language_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698