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()); |
} |