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.