OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #if !defined(DART_PRECOMPILED_RUNTIME) | 5 #if !defined(DART_PRECOMPILED_RUNTIME) |
6 | 6 |
7 #include "vm/constant_propagator.h" | 7 #include "vm/constant_propagator.h" |
8 | 8 |
9 #include "vm/bit_vector.h" | 9 #include "vm/bit_vector.h" |
10 #include "vm/flow_graph_builder.h" | 10 #include "vm/flow_graph_builder.h" |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 } | 282 } |
283 } | 283 } |
284 if (!SetValue(instr, value) && | 284 if (!SetValue(instr, value) && |
285 marked_phis_->Contains(instr->ssa_temp_index())) { | 285 marked_phis_->Contains(instr->ssa_temp_index())) { |
286 marked_phis_->Remove(instr->ssa_temp_index()); | 286 marked_phis_->Remove(instr->ssa_temp_index()); |
287 definition_worklist_.Add(instr); | 287 definition_worklist_.Add(instr); |
288 } | 288 } |
289 } | 289 } |
290 | 290 |
291 void ConstantPropagator::VisitRedefinition(RedefinitionInstr* instr) { | 291 void ConstantPropagator::VisitRedefinition(RedefinitionInstr* instr) { |
292 // Ensure that we never remove redefinition of a constant unless we are also | |
293 // are guaranteed to fold away code paths that correspond to non-matching | |
294 // class ids. Otherwise LICM might potentially hoist incorrect code. | |
295 const Object& value = instr->value()->definition()->constant_value(); | 292 const Object& value = instr->value()->definition()->constant_value(); |
296 if (IsConstant(value) && !Field::IsExternalizableCid(value.GetClassId())) { | 293 if (IsConstant(value)) { |
297 SetValue(instr, value); | 294 SetValue(instr, value); |
298 } else { | 295 } else { |
299 SetValue(instr, non_constant_); | 296 SetValue(instr, non_constant_); |
300 } | 297 } |
301 } | 298 } |
302 | 299 |
303 void ConstantPropagator::VisitParameter(ParameterInstr* instr) { | 300 void ConstantPropagator::VisitParameter(ParameterInstr* instr) { |
304 SetValue(instr, non_constant_); | 301 SetValue(instr, non_constant_); |
305 } | 302 } |
306 | 303 |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 void ConstantPropagator::VisitLoadClassId(LoadClassIdInstr* instr) { | 726 void ConstantPropagator::VisitLoadClassId(LoadClassIdInstr* instr) { |
730 intptr_t cid = instr->object()->Type()->ToCid(); | 727 intptr_t cid = instr->object()->Type()->ToCid(); |
731 if (cid != kDynamicCid) { | 728 if (cid != kDynamicCid) { |
732 SetValue(instr, Smi::ZoneHandle(Z, Smi::New(cid))); | 729 SetValue(instr, Smi::ZoneHandle(Z, Smi::New(cid))); |
733 return; | 730 return; |
734 } | 731 } |
735 | 732 |
736 const Object& object = instr->object()->definition()->constant_value(); | 733 const Object& object = instr->object()->definition()->constant_value(); |
737 if (IsConstant(object)) { | 734 if (IsConstant(object)) { |
738 cid = object.GetClassId(); | 735 cid = object.GetClassId(); |
739 if (!Field::IsExternalizableCid(cid)) { | 736 SetValue(instr, Smi::ZoneHandle(Z, Smi::New(cid))); |
740 SetValue(instr, Smi::ZoneHandle(Z, Smi::New(cid))); | 737 return; |
741 return; | |
742 } | |
743 } | 738 } |
744 SetValue(instr, non_constant_); | 739 SetValue(instr, non_constant_); |
745 } | 740 } |
746 | 741 |
747 void ConstantPropagator::VisitLoadField(LoadFieldInstr* instr) { | 742 void ConstantPropagator::VisitLoadField(LoadFieldInstr* instr) { |
748 Value* instance = instr->instance(); | 743 Value* instance = instr->instance(); |
749 if ((instr->recognized_kind() == MethodRecognizer::kObjectArrayLength) && | 744 if ((instr->recognized_kind() == MethodRecognizer::kObjectArrayLength) && |
750 instance->definition()->OriginalDefinition()->IsCreateArray()) { | 745 instance->definition()->OriginalDefinition()->IsCreateArray()) { |
751 Value* num_elements = instance->definition() | 746 Value* num_elements = instance->definition() |
752 ->OriginalDefinition() | 747 ->OriginalDefinition() |
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1581 | 1576 |
1582 if (FLAG_trace_constant_propagation && | 1577 if (FLAG_trace_constant_propagation && |
1583 FlowGraphPrinter::ShouldPrint(graph_->function())) { | 1578 FlowGraphPrinter::ShouldPrint(graph_->function())) { |
1584 FlowGraphPrinter::PrintGraph("After CP", graph_); | 1579 FlowGraphPrinter::PrintGraph("After CP", graph_); |
1585 } | 1580 } |
1586 } | 1581 } |
1587 | 1582 |
1588 } // namespace dart | 1583 } // namespace dart |
1589 | 1584 |
1590 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 1585 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |