| 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;
|
| }
|
|
|
|
|