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 |