| 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-alias-analysis.h" | 5 #include "src/hydrogen-alias-analysis.h" |
| 6 #include "src/hydrogen-load-elimination.h" | 6 #include "src/hydrogen-load-elimination.h" |
| 7 #include "src/hydrogen-instructions.h" | 7 #include "src/hydrogen-instructions.h" |
| 8 #include "src/hydrogen-flow-engine.h" | 8 #include "src/hydrogen-flow-engine.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| 11 namespace internal { | 11 namespace internal { |
| 12 | 12 |
| 13 #define GLOBAL true | 13 #define GLOBAL true |
| 14 #define TRACE(x) if (FLAG_trace_load_elimination) PrintF x | 14 #define TRACE(x) if (FLAG_trace_load_elimination) PrintF x |
| 15 | 15 |
| 16 static const int kMaxTrackedFields = 16; | 16 static const int kMaxTrackedFields = 16; |
| 17 static const int kMaxTrackedObjects = 5; | 17 static const int kMaxTrackedObjects = 5; |
| 18 | 18 |
| 19 // An element in the field approximation list. | 19 // An element in the field approximation list. |
| 20 class HFieldApproximation : public ZoneObject { | 20 class HFieldApproximation : public ZoneObject { |
| 21 public: // Just a data blob. | 21 public: // Just a data blob. |
| 22 HValue* object_; | 22 HValue* object_; |
| 23 HValue* last_value_; | 23 HValue* last_value_; |
| 24 HFieldApproximation* next_; | 24 HFieldApproximation* next_; |
| 25 | 25 |
| 26 // Recursively copy the entire linked list of field approximations. | 26 // Recursively copy the entire linked list of field approximations. |
| 27 HFieldApproximation* Copy(Zone* zone) { | 27 HFieldApproximation* Copy(Zone* zone) { |
| 28 if (this == NULL) return NULL; | |
| 29 HFieldApproximation* copy = new(zone) HFieldApproximation(); | 28 HFieldApproximation* copy = new(zone) HFieldApproximation(); |
| 30 copy->object_ = this->object_; | 29 copy->object_ = this->object_; |
| 31 copy->last_value_ = this->last_value_; | 30 copy->last_value_ = this->last_value_; |
| 32 copy->next_ = this->next_->Copy(zone); | 31 copy->next_ = this->next_ == NULL ? NULL : this->next_->Copy(zone); |
| 33 return copy; | 32 return copy; |
| 34 } | 33 } |
| 35 }; | 34 }; |
| 36 | 35 |
| 37 | 36 |
| 38 // The main datastructure used during load/store elimination. Each in-object | 37 // The main datastructure used during load/store elimination. Each in-object |
| 39 // field is tracked separately. For each field, store a list of known field | 38 // field is tracked separately. For each field, store a list of known field |
| 40 // values for known objects. | 39 // values for known objects. |
| 41 class HLoadEliminationTable : public ZoneObject { | 40 class HLoadEliminationTable : public ZoneObject { |
| 42 public: | 41 public: |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 } | 140 } |
| 142 | 141 |
| 143 private: | 142 private: |
| 144 // Copy state to successor block. | 143 // Copy state to successor block. |
| 145 HLoadEliminationTable* Copy(HBasicBlock* succ, HBasicBlock* from_block, | 144 HLoadEliminationTable* Copy(HBasicBlock* succ, HBasicBlock* from_block, |
| 146 Zone* zone) { | 145 Zone* zone) { |
| 147 HLoadEliminationTable* copy = | 146 HLoadEliminationTable* copy = |
| 148 new(zone) HLoadEliminationTable(zone, aliasing_); | 147 new(zone) HLoadEliminationTable(zone, aliasing_); |
| 149 copy->EnsureFields(fields_.length()); | 148 copy->EnsureFields(fields_.length()); |
| 150 for (int i = 0; i < fields_.length(); i++) { | 149 for (int i = 0; i < fields_.length(); i++) { |
| 151 copy->fields_[i] = fields_[i]->Copy(zone); | 150 copy->fields_[i] = fields_[i] == NULL ? NULL : fields_[i]->Copy(zone); |
| 152 } | 151 } |
| 153 if (FLAG_trace_load_elimination) { | 152 if (FLAG_trace_load_elimination) { |
| 154 TRACE((" copy-to B%d\n", succ->block_id())); | 153 TRACE((" copy-to B%d\n", succ->block_id())); |
| 155 copy->Print(); | 154 copy->Print(); |
| 156 } | 155 } |
| 157 return copy; | 156 return copy; |
| 158 } | 157 } |
| 159 | 158 |
| 160 // Merge this state with the other incoming state. | 159 // Merge this state with the other incoming state. |
| 161 HLoadEliminationTable* Merge(HBasicBlock* succ, HLoadEliminationTable* that, | 160 HLoadEliminationTable* Merge(HBasicBlock* succ, HLoadEliminationTable* that, |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 } else { | 502 } else { |
| 504 // Perform only local analysis. | 503 // Perform only local analysis. |
| 505 for (int i = 0; i < graph()->blocks()->length(); i++) { | 504 for (int i = 0; i < graph()->blocks()->length(); i++) { |
| 506 table->Kill(); | 505 table->Kill(); |
| 507 engine.AnalyzeOneBlock(graph()->blocks()->at(i), table); | 506 engine.AnalyzeOneBlock(graph()->blocks()->at(i), table); |
| 508 } | 507 } |
| 509 } | 508 } |
| 510 } | 509 } |
| 511 | 510 |
| 512 } } // namespace v8::internal | 511 } } // namespace v8::internal |
| OLD | NEW |