Eliminate HCheckHeapObject instructions in check elimination.
authortitzer@chromium.org <titzer@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 29 Nov 2013 12:37:35 +0000 (12:37 +0000)
committertitzer@chromium.org <titzer@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 29 Nov 2013 12:37:35 +0000 (12:37 +0000)
BUG=
R=verwaest@chromium.org

Review URL: https://codereview.chromium.org/95263005

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18160 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/hydrogen-check-elimination.cc
src/hydrogen-check-elimination.h

index 5333221..bf8257c 100644 (file)
@@ -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
index f38e615..50d9908 100644 (file)
@@ -43,6 +43,7 @@ class HCheckEliminationPhase : public HPhase {
       aliasing_(),
       redundant_(0),
       removed_(0),
+      removed_cho_(0),
       narrowed_(0),
       loads_(0),
       empty_(0),
@@ -60,6 +61,7 @@ class HCheckEliminationPhase : public HPhase {
   HAliasAnalyzer* aliasing_;
   int redundant_;
   int removed_;
+  int removed_cho_;
   int narrowed_;
   int loads_;
   int empty_;