Index: src/hydrogen-check-elimination.cc |
diff --git a/src/hydrogen-check-elimination.cc b/src/hydrogen-check-elimination.cc |
index bbd3042fb7af6659f4107fffb7127e1298000593..ae11042ba1e449b3c33b2d036ca36477165142d6 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_; |
+ |
+ // 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,29 @@ 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); |
+ HCheckTableEntry* re = copy->Find(right); |
+ 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; |
} |