Chromium Code Reviews| Index: src/hydrogen-check-elimination.cc |
| diff --git a/src/hydrogen-check-elimination.cc b/src/hydrogen-check-elimination.cc |
| index bbd3042fb7af6659f4107fffb7127e1298000593..a79c76bdfa8e80f32d24306020a266e2261599c3 100644 |
| --- a/src/hydrogen-check-elimination.cc |
| +++ b/src/hydrogen-check-elimination.cc |
| @@ -127,9 +127,14 @@ class HCheckTable : public ZoneObject { |
| new_entry->check_ = NULL; |
| new_entry->maps_ = old_entry->maps_->Copy(phase_->zone()); |
| } |
| - if (succ->predecessors()->length() == 1) { |
| - HControlInstruction* end = succ->predecessors()->at(0)->end(); |
| - if (end->IsCompareMap() && end->SuccessorAt(0) == succ) { |
| + copy->cursor_ = cursor_; |
| + copy->size_ = size_; |
|
titzer
2013/12/05 15:45:00
Note that I missed these two lines before. Which m
|
| + |
| + // Branch-sensitive analysis for certain comparisons may add more facts |
| + // to the state for the successor on the true branch. |
| + HControlInstruction* end = succ->predecessors()->at(0)->end(); |
| + if (succ->predecessors()->length() == 1 && end->SuccessorAt(0) == succ) { |
| + if (end->IsCompareMap()) { |
| // Learn on the true branch of if(CompareMap(x)). |
| HCompareMap* cmp = HCompareMap::cast(end); |
| HValue* object = cmp->value()->ActualValue(); |
| @@ -141,9 +146,28 @@ class HCheckTable : public ZoneObject { |
| list->Add(cmp->map(), phase_->zone()); |
| entry->maps_ = list; |
| } |
| + } else if (end->IsCompareObjectEqAndBranch()) { |
| + // Learn on the true branch of if(CmpObjectEq(x, y)). |
| + HCompareObjectEqAndBranch* cmp = |
| + HCompareObjectEqAndBranch::cast(end); |
| + HValue* left = cmp->left()->ActualValue(); |
| + HValue* right = cmp->right()->ActualValue(); |
| + HCheckTableEntry* le = copy->Find(left), *re = copy->Find(right); |
|
mvstanton
2013/12/06 09:46:16
nit: I prefer variable initialization on their own
|
| + if (le == NULL) { |
| + if (re != NULL) { |
| + copy->Insert(left, NULL, re->maps_->Copy(zone)); |
| + } |
| + } else if (re == NULL) { |
| + copy->Insert(right, NULL, le->maps_->Copy(zone)); |
| + } else { |
| + MapSet intersect = le->maps_->Intersect(re->maps_, zone); |
| + le->maps_ = intersect; |
| + re->maps_ = intersect->Copy(zone); |
| + } |
| } |
| - // TODO(titzer): is it worthwhile to learn on false branch too? |
| + // Learning on false branches requires storing negative facts. |
| } |
| + |
| return copy; |
| } |