| Index: src/hydrogen-check-elimination.cc
|
| diff --git a/src/hydrogen-check-elimination.cc b/src/hydrogen-check-elimination.cc
|
| index 53332215b3b1cec5d31354a7cddff0d72688a6c7..bf8257c83d913e0ebc5f0f98081d7a8de99e546f 100644
|
| --- a/src/hydrogen-check-elimination.cc
|
| +++ b/src/hydrogen-check-elimination.cc
|
| @@ -97,6 +97,10 @@ class HCheckTable : public ZoneObject {
|
| ReduceCheckMapValue(HCheckMapValue::cast(instr));
|
| break;
|
| }
|
| + case HValue::kCheckHeapObject: {
|
| + ReduceCheckHeapObject(HCheckHeapObject::cast(instr));
|
| + break;
|
| + }
|
| default: {
|
| // If the instruction changes maps uncontrollably, drop everything.
|
| if (instr->CheckGVNFlag(kChangesMaps) ||
|
| @@ -105,7 +109,8 @@ class HCheckTable : public ZoneObject {
|
| }
|
| }
|
| // Improvements possible:
|
| - // - eliminate HCheckSmi and HCheckHeapObject
|
| + // - eliminate redundant HCheckSmi, HCheckInstanceType instructions
|
| + // - track which values have been HCheckHeapObject'd
|
| }
|
|
|
| return this;
|
| @@ -236,6 +241,14 @@ class HCheckTable : public ZoneObject {
|
| }
|
| }
|
|
|
| + void ReduceCheckHeapObject(HCheckHeapObject* instr) {
|
| + if (FindMaps(instr->value()->ActualValue()) != NULL) {
|
| + // If the object has known maps, it's definitely a heap object.
|
| + instr->DeleteAndReplaceWith(instr->value());
|
| + INC_STAT(removed_cho_);
|
| + }
|
| + }
|
| +
|
| void ReduceStoreNamedField(HStoreNamedField* instr) {
|
| HValue* object = instr->object()->ActualValue();
|
| if (instr->has_transition()) {
|
| @@ -488,15 +501,19 @@ void HCheckEliminationPhase::Run() {
|
| // Are we eliminated yet?
|
| void HCheckEliminationPhase::PrintStats() {
|
| #if DEBUG
|
| - if (redundant_ > 0) PrintF(" redundant = %2d\n", redundant_);
|
| - if (removed_ > 0) PrintF(" removed = %2d\n", removed_);
|
| - if (narrowed_ > 0) PrintF(" narrowed = %2d\n", narrowed_);
|
| - if (loads_ > 0) PrintF(" loads = %2d\n", loads_);
|
| - if (empty_ > 0) PrintF(" empty = %2d\n", empty_);
|
| - if (compares_true_ > 0) PrintF(" cmp_true = %2d\n", compares_true_);
|
| - if (compares_false_ > 0) PrintF(" cmp_false = %2d\n", compares_false_);
|
| - if (transitions_ > 0) PrintF(" transitions = %2d\n", transitions_);
|
| + #define PRINT_STAT(x) if (x##_ > 0) PrintF(" %-16s = %2d\n", #x, x##_)
|
| +#else
|
| + #define PRINT_STAT(x)
|
| #endif
|
| + PRINT_STAT(redundant);
|
| + PRINT_STAT(removed);
|
| + PRINT_STAT(removed_cho);
|
| + PRINT_STAT(narrowed);
|
| + PRINT_STAT(loads);
|
| + PRINT_STAT(empty);
|
| + PRINT_STAT(compares_true);
|
| + PRINT_STAT(compares_false);
|
| + PRINT_STAT(transitions);
|
| }
|
|
|
| } } // namespace v8::internal
|
|
|