Reviewers: Toon Verwaest,

Description:
Eliminate HCheckHeapObject instructions in check elimination.
BUG=

Please review this at https://codereview.chromium.org/95263005/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+28, -9 lines):
  M src/hydrogen-check-elimination.h
  M src/hydrogen-check-elimination.cc


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
Index: src/hydrogen-check-elimination.h
diff --git a/src/hydrogen-check-elimination.h b/src/hydrogen-check-elimination.h index f38e6152fb139a31321b0d99c73bc6b108ecb65b..50d9908db1f2b8bdc3447af38c1f8e853164a4bc 100644
--- a/src/hydrogen-check-elimination.h
+++ b/src/hydrogen-check-elimination.h
@@ -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_;


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to