Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(134)

Unified Diff: src/hydrogen-check-elimination.cc

Issue 130053007: [Sheriff] Revert "Check elimination temporarily disabled.", "Fix for buildbot failure after r19102.… (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/flag-definitions.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/hydrogen-check-elimination.cc
diff --git a/src/hydrogen-check-elimination.cc b/src/hydrogen-check-elimination.cc
index e393234067095408e1a68bb107212f9ef90903e9..e12f14a13fb16b740fe6f4327970c5d77f7edca2 100644
--- a/src/hydrogen-check-elimination.cc
+++ b/src/hydrogen-check-elimination.cc
@@ -48,12 +48,12 @@ typedef UniqueSet<Map>* MapSet;
struct HCheckTableEntry {
HValue* object_; // The object being approximated. NULL => invalid entry.
- HInstruction* check_; // The last check instruction.
- MapSet maps_; // The set of known maps for the object.
+ HValue* check_; // The last check instruction.
+ MapSet maps_; // The set of known maps for the object.
};
-// The main data structure used during check elimination, which stores a
+// The main datastructure used during check elimination, which stores a
// set of known maps for each object.
class HCheckTable : public ZoneObject {
public:
@@ -130,23 +130,6 @@ class HCheckTable : public ZoneObject {
copy->cursor_ = cursor_;
copy->size_ = size_;
- // Create entries for succ block's phis.
- if (succ->phis()->length() > 0) {
- int pred_index = succ->PredecessorIndexOf(from_block);
- for (int phi_index = 0;
- phi_index < succ->phis()->length();
- ++phi_index) {
- HPhi* phi = succ->phis()->at(phi_index);
- HValue* phi_operand = phi->OperandAt(pred_index);
-
- HCheckTableEntry* pred_entry = copy->Find(phi_operand);
- if (pred_entry != NULL) {
- // Create an entry for a phi in the table.
- copy->Insert(phi, NULL, pred_entry->maps_->Copy(phase_->zone()));
- }
- }
- }
-
// Branch-sensitive analysis for certain comparisons may add more facts
// to the state for the successor on the true branch.
bool learned = false;
@@ -202,28 +185,17 @@ class HCheckTable : public ZoneObject {
// Global analysis: Merge this state with the other incoming state.
HCheckTable* Merge(HBasicBlock* succ, HCheckTable* that,
- HBasicBlock* pred_block, Zone* zone) {
- if (pred_block->IsReachable()) {
+ HBasicBlock* that_block, Zone* zone) {
+ if (that_block->IsReachable()) {
if (that->size_ == 0) {
// If the other state is empty, simply reset.
size_ = 0;
cursor_ = 0;
} else {
- int pred_index = succ->PredecessorIndexOf(pred_block);
bool compact = false;
for (int i = 0; i < size_; i++) {
HCheckTableEntry* this_entry = &entries_[i];
- HCheckTableEntry* that_entry;
- if (this_entry->object_->IsPhi() &&
- this_entry->object_->block() == succ) {
- HPhi* phi = HPhi::cast(this_entry->object_);
- HValue* phi_operand = phi->OperandAt(pred_index);
- that_entry = that->Find(phi_operand);
-
- } else {
- that_entry = that->Find(this_entry->object_);
- }
-
+ HCheckTableEntry* that_entry = that->Find(this_entry->object_);
if (that_entry == NULL) {
this_entry->object_ = NULL;
compact = true;
@@ -241,7 +213,7 @@ class HCheckTable : public ZoneObject {
}
if (FLAG_trace_check_elimination) {
PrintF("B%d checkmaps-table merged with B%d table:\n",
- succ->block_id(), pred_block->block_id());
+ succ->block_id(), that_block->block_id());
Print();
}
return this;
@@ -272,43 +244,14 @@ class HCheckTable : public ZoneObject {
}
return;
}
- MapSet intersection = i->Intersect(a, phase_->zone());
- if (intersection->size() == 0) {
+ i = i->Intersect(a, phase_->zone());
+ if (i->size() == 0) {
// Intersection is empty; probably megamorphic, which is likely to
// deopt anyway, so just leave things as they are.
INC_STAT(empty_);
} else {
- // Update set of maps in the entry.
- entry->maps_ = intersection;
- if (intersection->size() != i->size()) {
- // Narrow set of maps in the second check maps instruction.
- HGraph* graph = instr->block()->graph();
- HCheckMaps* new_check_maps =
- HCheckMaps::New(graph->zone(), NULL, instr->value(),
- intersection, instr->typecheck(),
- instr->has_migration_target());
- if (entry->check_ != NULL &&
- entry->check_->block() == instr->block()) {
- // There is a check in the same block so replace it with a more
- // strict check and eliminate the second check entirely.
- new_check_maps->InsertBefore(entry->check_);
- entry->check_->DeleteAndReplaceWith(new_check_maps);
- TRACE(("Check #%d narrowed to #%d\n",
- entry->check_->id(), new_check_maps->id()));
-
- } else {
- new_check_maps->InsertBefore(instr);
- }
- TRACE(("CheckMaps #%d for #%d narrowed to #%d:\n",
- instr->id(), instr->value()->id(), new_check_maps->id()));
- instr->DeleteAndReplaceWith(new_check_maps);
- entry->check_ = new_check_maps;
-
- if (FLAG_trace_check_elimination) {
- Print();
- }
- INC_STAT(narrowed_);
- }
+ // TODO(titzer): replace the first check with a more strict check
+ INC_STAT(narrowed_);
}
} else {
// No entry; insert a new one.
@@ -483,9 +426,7 @@ class HCheckTable : public ZoneObject {
for (int i = 0; i < size_; i++) {
HCheckTableEntry* entry = &entries_[i];
ASSERT(entry->object_ != NULL);
- PrintF(" checkmaps-table @%d: %s #%d ", i,
- entry->object_->IsPhi() ? "phi" : "object",
- entry->object_->id());
+ PrintF(" checkmaps-table @%d: object #%d ", i, entry->object_->id());
if (entry->check_ != NULL) {
PrintF("check #%d ", entry->check_->id());
}
« no previous file with comments | « src/flag-definitions.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698