| OLD | NEW | 
|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/hydrogen-check-elimination.h" | 5 #include "src/hydrogen-check-elimination.h" | 
| 6 | 6 | 
| 7 #include "src/hydrogen-alias-analysis.h" | 7 #include "src/hydrogen-alias-analysis.h" | 
| 8 #include "src/hydrogen-flow-engine.h" | 8 #include "src/hydrogen-flow-engine.h" | 
| 9 | 9 | 
| 10 #define GLOBAL 1 | 10 #define GLOBAL 1 | 
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 366       HGraph* graph = instr->block()->graph(); | 366       HGraph* graph = instr->block()->graph(); | 
| 367       if (entry->maps_->IsSubset(instr->maps())) { | 367       if (entry->maps_->IsSubset(instr->maps())) { | 
| 368         // The first check is more strict; the second is redundant. | 368         // The first check is more strict; the second is redundant. | 
| 369         if (entry->check_ != NULL) { | 369         if (entry->check_ != NULL) { | 
| 370           DCHECK_NE(HCheckTableEntry::UNCHECKED_STABLE, entry->state_); | 370           DCHECK_NE(HCheckTableEntry::UNCHECKED_STABLE, entry->state_); | 
| 371           TRACE(("Replacing redundant CheckMaps #%d at B%d with #%d\n", | 371           TRACE(("Replacing redundant CheckMaps #%d at B%d with #%d\n", | 
| 372               instr->id(), instr->block()->block_id(), entry->check_->id())); | 372               instr->id(), instr->block()->block_id(), entry->check_->id())); | 
| 373           instr->DeleteAndReplaceWith(entry->check_); | 373           instr->DeleteAndReplaceWith(entry->check_); | 
| 374           INC_STAT(redundant_); | 374           INC_STAT(redundant_); | 
| 375         } else if (entry->state_ == HCheckTableEntry::UNCHECKED_STABLE) { | 375         } else if (entry->state_ == HCheckTableEntry::UNCHECKED_STABLE) { | 
| 376           DCHECK_EQ(NULL, entry->check_); | 376           DCHECK_NULL(entry->check_); | 
| 377           TRACE(("Marking redundant CheckMaps #%d at B%d as stability check\n", | 377           TRACE(("Marking redundant CheckMaps #%d at B%d as stability check\n", | 
| 378                  instr->id(), instr->block()->block_id())); | 378                  instr->id(), instr->block()->block_id())); | 
| 379           instr->set_maps(entry->maps_->Copy(graph->zone())); | 379           instr->set_maps(entry->maps_->Copy(graph->zone())); | 
| 380           instr->MarkAsStabilityCheck(); | 380           instr->MarkAsStabilityCheck(); | 
| 381           entry->state_ = HCheckTableEntry::CHECKED_STABLE; | 381           entry->state_ = HCheckTableEntry::CHECKED_STABLE; | 
| 382         } else if (!instr->IsStabilityCheck()) { | 382         } else if (!instr->IsStabilityCheck()) { | 
| 383           TRACE(("Marking redundant CheckMaps #%d at B%d as dead\n", | 383           TRACE(("Marking redundant CheckMaps #%d at B%d as dead\n", | 
| 384               instr->id(), instr->block()->block_id())); | 384               instr->id(), instr->block()->block_id())); | 
| 385           // Mark check as dead but leave it in the graph as a checkpoint for | 385           // Mark check as dead but leave it in the graph as a checkpoint for | 
| 386           // subsequent checks. | 386           // subsequent checks. | 
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 677       } | 677       } | 
| 678     } | 678     } | 
| 679     if (compact) Compact(); | 679     if (compact) Compact(); | 
| 680   } | 680   } | 
| 681 | 681 | 
| 682   // Kill everything in the table that may alias {object}. | 682   // Kill everything in the table that may alias {object}. | 
| 683   void Kill(HValue* object) { | 683   void Kill(HValue* object) { | 
| 684     bool compact = false; | 684     bool compact = false; | 
| 685     for (int i = 0; i < size_; i++) { | 685     for (int i = 0; i < size_; i++) { | 
| 686       HCheckTableEntry* entry = &entries_[i]; | 686       HCheckTableEntry* entry = &entries_[i]; | 
| 687       DCHECK(entry->object_ != NULL); | 687       DCHECK_NOT_NULL(entry->object_); | 
| 688       if (phase_->aliasing_->MayAlias(entry->object_, object)) { | 688       if (phase_->aliasing_->MayAlias(entry->object_, object)) { | 
| 689         entry->object_ = NULL; | 689         entry->object_ = NULL; | 
| 690         compact = true; | 690         compact = true; | 
| 691       } | 691       } | 
| 692     } | 692     } | 
| 693     if (compact) Compact(); | 693     if (compact) Compact(); | 
| 694     DCHECK(Find(object) == NULL); | 694     DCHECK_NULL(Find(object)); | 
| 695   } | 695   } | 
| 696 | 696 | 
| 697   void Compact() { | 697   void Compact() { | 
| 698     // First, compact the array in place. | 698     // First, compact the array in place. | 
| 699     int max = size_, dest = 0, old_cursor = cursor_; | 699     int max = size_, dest = 0, old_cursor = cursor_; | 
| 700     for (int i = 0; i < max; i++) { | 700     for (int i = 0; i < max; i++) { | 
| 701       if (entries_[i].object_ != NULL) { | 701       if (entries_[i].object_ != NULL) { | 
| 702         if (dest != i) entries_[dest] = entries_[i]; | 702         if (dest != i) entries_[dest] = entries_[i]; | 
| 703         dest++; | 703         dest++; | 
| 704       } else { | 704       } else { | 
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 894   PRINT_STAT(removed_cit); | 894   PRINT_STAT(removed_cit); | 
| 895   PRINT_STAT(narrowed); | 895   PRINT_STAT(narrowed); | 
| 896   PRINT_STAT(loads); | 896   PRINT_STAT(loads); | 
| 897   PRINT_STAT(empty); | 897   PRINT_STAT(empty); | 
| 898   PRINT_STAT(compares_true); | 898   PRINT_STAT(compares_true); | 
| 899   PRINT_STAT(compares_false); | 899   PRINT_STAT(compares_false); | 
| 900   PRINT_STAT(transitions); | 900   PRINT_STAT(transitions); | 
| 901 } | 901 } | 
| 902 | 902 | 
| 903 } }  // namespace v8::internal | 903 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|