| 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 #include "vm/flow_graph_optimizer.h" | 5 #include "vm/flow_graph_optimizer.h" |
| 6 | 6 |
| 7 #include "vm/bit_vector.h" | 7 #include "vm/bit_vector.h" |
| 8 #include "vm/cha.h" | 8 #include "vm/cha.h" |
| 9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 } | 304 } |
| 305 | 305 |
| 306 | 306 |
| 307 | 307 |
| 308 // Used by TryMergeDivMod. | 308 // Used by TryMergeDivMod. |
| 309 // Inserts a load-indexed instruction between a TRUNCDIV or MOD instruction, | 309 // Inserts a load-indexed instruction between a TRUNCDIV or MOD instruction, |
| 310 // and the using instruction. This is an intermediate step before merging. | 310 // and the using instruction. This is an intermediate step before merging. |
| 311 void FlowGraphOptimizer::AppendLoadIndexedForMerged(Definition* instr, | 311 void FlowGraphOptimizer::AppendLoadIndexedForMerged(Definition* instr, |
| 312 intptr_t ix, | 312 intptr_t ix, |
| 313 intptr_t cid) { | 313 intptr_t cid) { |
| 314 const intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(cid); | 314 const intptr_t index_scale = Instance::ElementSizeFor(cid); |
| 315 ConstantInstr* index_instr = | 315 ConstantInstr* index_instr = |
| 316 flow_graph()->GetConstant(Smi::Handle(Smi::New(ix))); | 316 flow_graph()->GetConstant(Smi::Handle(Smi::New(ix))); |
| 317 LoadIndexedInstr* load = new LoadIndexedInstr(new Value(instr), | 317 LoadIndexedInstr* load = new LoadIndexedInstr(new Value(instr), |
| 318 new Value(index_instr), | 318 new Value(index_instr), |
| 319 index_scale, | 319 index_scale, |
| 320 cid, | 320 cid, |
| 321 Isolate::kNoDeoptId, | 321 Isolate::kNoDeoptId, |
| 322 instr->token_pos()); | 322 instr->token_pos()); |
| 323 instr->ReplaceUsesWith(load); | 323 instr->ReplaceUsesWith(load); |
| 324 flow_graph()->InsertAfter(instr, load, NULL, FlowGraph::kValue); | 324 flow_graph()->InsertAfter(instr, load, NULL, FlowGraph::kValue); |
| (...skipping 969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1294 | 1294 |
| 1295 if (array_cid == kTypedDataFloat32ArrayCid) { | 1295 if (array_cid == kTypedDataFloat32ArrayCid) { |
| 1296 stored_value = | 1296 stored_value = |
| 1297 new DoubleToFloatInstr(new Value(stored_value), call->deopt_id()); | 1297 new DoubleToFloatInstr(new Value(stored_value), call->deopt_id()); |
| 1298 cursor = flow_graph()->AppendTo(cursor, | 1298 cursor = flow_graph()->AppendTo(cursor, |
| 1299 stored_value, | 1299 stored_value, |
| 1300 NULL, | 1300 NULL, |
| 1301 FlowGraph::kValue); | 1301 FlowGraph::kValue); |
| 1302 } | 1302 } |
| 1303 | 1303 |
| 1304 intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(array_cid); | 1304 const intptr_t index_scale = Instance::ElementSizeFor(array_cid); |
| 1305 *last = new StoreIndexedInstr(new Value(array), | 1305 *last = new StoreIndexedInstr(new Value(array), |
| 1306 new Value(index), | 1306 new Value(index), |
| 1307 new Value(stored_value), | 1307 new Value(stored_value), |
| 1308 needs_store_barrier, | 1308 needs_store_barrier, |
| 1309 index_scale, | 1309 index_scale, |
| 1310 array_cid, | 1310 array_cid, |
| 1311 call->deopt_id(), | 1311 call->deopt_id(), |
| 1312 call->token_pos()); | 1312 call->token_pos()); |
| 1313 flow_graph()->AppendTo(cursor, | 1313 flow_graph()->AppendTo(cursor, |
| 1314 *last, | 1314 *last, |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1646 intptr_t deopt_id = Isolate::kNoDeoptId; | 1646 intptr_t deopt_id = Isolate::kNoDeoptId; |
| 1647 if ((array_cid == kTypedDataInt32ArrayCid) || | 1647 if ((array_cid == kTypedDataInt32ArrayCid) || |
| 1648 (array_cid == kTypedDataUint32ArrayCid)) { | 1648 (array_cid == kTypedDataUint32ArrayCid)) { |
| 1649 // Set deopt_id if we can optimistically assume that the result is Smi. | 1649 // Set deopt_id if we can optimistically assume that the result is Smi. |
| 1650 // Assume mixed Mint/Smi if this instruction caused deoptimization once. | 1650 // Assume mixed Mint/Smi if this instruction caused deoptimization once. |
| 1651 deopt_id = ic_data.HasDeoptReasons() ? | 1651 deopt_id = ic_data.HasDeoptReasons() ? |
| 1652 Isolate::kNoDeoptId : call->deopt_id(); | 1652 Isolate::kNoDeoptId : call->deopt_id(); |
| 1653 } | 1653 } |
| 1654 | 1654 |
| 1655 // Array load and return. | 1655 // Array load and return. |
| 1656 intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(array_cid); | 1656 intptr_t index_scale = Instance::ElementSizeFor(array_cid); |
| 1657 *last = new LoadIndexedInstr(new Value(array), | 1657 *last = new LoadIndexedInstr(new Value(array), |
| 1658 new Value(index), | 1658 new Value(index), |
| 1659 index_scale, | 1659 index_scale, |
| 1660 array_cid, | 1660 array_cid, |
| 1661 deopt_id, | 1661 deopt_id, |
| 1662 call->token_pos()); | 1662 call->token_pos()); |
| 1663 cursor = flow_graph()->AppendTo( | 1663 cursor = flow_graph()->AppendTo( |
| 1664 cursor, | 1664 cursor, |
| 1665 *last, | 1665 *last, |
| 1666 deopt_id != Isolate::kNoDeoptId ? call->env() : NULL, | 1666 deopt_id != Isolate::kNoDeoptId ? call->env() : NULL, |
| (...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2717 cursor = flow_graph()->AppendTo(cursor, | 2717 cursor = flow_graph()->AppendTo(cursor, |
| 2718 new CheckArrayBoundInstr(new Value(length), | 2718 new CheckArrayBoundInstr(new Value(length), |
| 2719 new Value(index), | 2719 new Value(index), |
| 2720 call->deopt_id()), | 2720 call->deopt_id()), |
| 2721 call->env(), | 2721 call->env(), |
| 2722 FlowGraph::kEffect); | 2722 FlowGraph::kEffect); |
| 2723 | 2723 |
| 2724 LoadIndexedInstr* load_indexed = new LoadIndexedInstr( | 2724 LoadIndexedInstr* load_indexed = new LoadIndexedInstr( |
| 2725 new Value(str), | 2725 new Value(str), |
| 2726 new Value(index), | 2726 new Value(index), |
| 2727 FlowGraphCompiler::ElementSizeFor(cid), | 2727 Instance::ElementSizeFor(cid), |
| 2728 cid, | 2728 cid, |
| 2729 Isolate::kNoDeoptId, | 2729 Isolate::kNoDeoptId, |
| 2730 call->token_pos()); | 2730 call->token_pos()); |
| 2731 | 2731 |
| 2732 cursor = flow_graph()->AppendTo(cursor, | 2732 cursor = flow_graph()->AppendTo(cursor, |
| 2733 load_indexed, | 2733 load_indexed, |
| 2734 NULL, | 2734 NULL, |
| 2735 FlowGraph::kValue); | 2735 FlowGraph::kValue); |
| 2736 ASSERT(cursor == load_indexed); | 2736 ASSERT(cursor == load_indexed); |
| 2737 return load_indexed; | 2737 return load_indexed; |
| (...skipping 963 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3701 call->token_pos()); | 3701 call->token_pos()); |
| 3702 length->set_is_immutable(true); | 3702 length->set_is_immutable(true); |
| 3703 length->set_result_cid(kSmiCid); | 3703 length->set_result_cid(kSmiCid); |
| 3704 length->set_recognized_kind( | 3704 length->set_recognized_kind( |
| 3705 LoadFieldInstr::RecognizedKindFromArrayCid(array_cid)); | 3705 LoadFieldInstr::RecognizedKindFromArrayCid(array_cid)); |
| 3706 *cursor = flow_graph()->AppendTo(*cursor, | 3706 *cursor = flow_graph()->AppendTo(*cursor, |
| 3707 length, | 3707 length, |
| 3708 NULL, | 3708 NULL, |
| 3709 FlowGraph::kValue); | 3709 FlowGraph::kValue); |
| 3710 | 3710 |
| 3711 intptr_t element_size = FlowGraphCompiler::ElementSizeFor(array_cid); | 3711 intptr_t element_size = Instance::ElementSizeFor(array_cid); |
| 3712 ConstantInstr* bytes_per_element = | 3712 ConstantInstr* bytes_per_element = |
| 3713 flow_graph()->GetConstant(Smi::Handle(Smi::New(element_size))); | 3713 flow_graph()->GetConstant(Smi::Handle(Smi::New(element_size))); |
| 3714 BinarySmiOpInstr* len_in_bytes = | 3714 BinarySmiOpInstr* len_in_bytes = |
| 3715 new BinarySmiOpInstr(Token::kMUL, | 3715 new BinarySmiOpInstr(Token::kMUL, |
| 3716 new Value(length), | 3716 new Value(length), |
| 3717 new Value(bytes_per_element), | 3717 new Value(bytes_per_element), |
| 3718 call->deopt_id(), call->token_pos()); | 3718 call->deopt_id(), call->token_pos()); |
| 3719 *cursor = flow_graph()->AppendTo(*cursor, len_in_bytes, call->env(), | 3719 *cursor = flow_graph()->AppendTo(*cursor, len_in_bytes, call->env(), |
| 3720 FlowGraph::kValue); | 3720 FlowGraph::kValue); |
| 3721 | 3721 |
| 3722 ConstantInstr* length_adjustment = | 3722 ConstantInstr* length_adjustment = |
| 3723 flow_graph()->GetConstant(Smi::Handle(Smi::New( | 3723 flow_graph()->GetConstant(Smi::Handle(Smi::New( |
| 3724 FlowGraphCompiler::ElementSizeFor(view_cid) - 1))); | 3724 Instance::ElementSizeFor(view_cid) - 1))); |
| 3725 // adjusted_length = len_in_bytes - (element_size - 1). | 3725 // adjusted_length = len_in_bytes - (element_size - 1). |
| 3726 BinarySmiOpInstr* adjusted_length = | 3726 BinarySmiOpInstr* adjusted_length = |
| 3727 new BinarySmiOpInstr(Token::kSUB, | 3727 new BinarySmiOpInstr(Token::kSUB, |
| 3728 new Value(len_in_bytes), | 3728 new Value(len_in_bytes), |
| 3729 new Value(length_adjustment), | 3729 new Value(length_adjustment), |
| 3730 call->deopt_id(), call->token_pos()); | 3730 call->deopt_id(), call->token_pos()); |
| 3731 *cursor = flow_graph()->AppendTo(*cursor, adjusted_length, call->env(), | 3731 *cursor = flow_graph()->AppendTo(*cursor, adjusted_length, call->env(), |
| 3732 FlowGraph::kValue); | 3732 FlowGraph::kValue); |
| 3733 | 3733 |
| 3734 // Check adjusted_length > 0. | 3734 // Check adjusted_length > 0. |
| (...skipping 5963 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9698 } | 9698 } |
| 9699 | 9699 |
| 9700 // Insert materializations at environment uses. | 9700 // Insert materializations at environment uses. |
| 9701 for (intptr_t i = 0; i < exits.length(); i++) { | 9701 for (intptr_t i = 0; i < exits.length(); i++) { |
| 9702 CreateMaterializationAt(exits[i], alloc, alloc->cls(), *slots); | 9702 CreateMaterializationAt(exits[i], alloc, alloc->cls(), *slots); |
| 9703 } | 9703 } |
| 9704 } | 9704 } |
| 9705 | 9705 |
| 9706 | 9706 |
| 9707 } // namespace dart | 9707 } // namespace dart |
| OLD | NEW |