| 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_inliner.h" | 5 #include "vm/flow_graph_inliner.h" |
| 6 | 6 |
| 7 #include "vm/aot_optimizer.h" | 7 #include "vm/aot_optimizer.h" |
| 8 #include "vm/block_scheduler.h" | 8 #include "vm/block_scheduler.h" |
| 9 #include "vm/branch_optimizer.h" | 9 #include "vm/branch_optimizer.h" |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| (...skipping 2029 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2040 // Quick access to the current one. | 2040 // Quick access to the current one. |
| 2041 #undef Z | 2041 #undef Z |
| 2042 #define Z (flow_graph->zone()) | 2042 #define Z (flow_graph->zone()) |
| 2043 | 2043 |
| 2044 static intptr_t PrepareInlineIndexedOp(FlowGraph* flow_graph, | 2044 static intptr_t PrepareInlineIndexedOp(FlowGraph* flow_graph, |
| 2045 Instruction* call, | 2045 Instruction* call, |
| 2046 intptr_t array_cid, | 2046 intptr_t array_cid, |
| 2047 Definition** array, | 2047 Definition** array, |
| 2048 Definition* index, | 2048 Definition* index, |
| 2049 Instruction** cursor) { | 2049 Instruction** cursor) { |
| 2050 // Insert index smi check. |
| 2051 *cursor = flow_graph->AppendTo( |
| 2052 *cursor, |
| 2053 new(Z) CheckSmiInstr(new(Z) Value(index), |
| 2054 call->deopt_id(), |
| 2055 call->token_pos()), |
| 2056 call->env(), |
| 2057 FlowGraph::kEffect); |
| 2058 |
| 2050 // Insert array length load and bounds check. | 2059 // Insert array length load and bounds check. |
| 2051 LoadFieldInstr* length = | 2060 LoadFieldInstr* length = |
| 2052 new(Z) LoadFieldInstr( | 2061 new(Z) LoadFieldInstr( |
| 2053 new(Z) Value(*array), | 2062 new(Z) Value(*array), |
| 2054 CheckArrayBoundInstr::LengthOffsetFor(array_cid), | 2063 CheckArrayBoundInstr::LengthOffsetFor(array_cid), |
| 2055 Type::ZoneHandle(Z, Type::SmiType()), | 2064 Type::ZoneHandle(Z, Type::SmiType()), |
| 2056 call->token_pos()); | 2065 call->token_pos()); |
| 2057 length->set_is_immutable( | 2066 length->set_is_immutable( |
| 2058 CheckArrayBoundInstr::IsFixedLengthArrayType(array_cid)); | 2067 CheckArrayBoundInstr::IsFixedLengthArrayType(array_cid)); |
| 2059 length->set_result_cid(kSmiCid); | 2068 length->set_result_cid(kSmiCid); |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2504 | 2513 |
| 2505 | 2514 |
| 2506 static intptr_t PrepareInlineByteArrayBaseOp( | 2515 static intptr_t PrepareInlineByteArrayBaseOp( |
| 2507 FlowGraph* flow_graph, | 2516 FlowGraph* flow_graph, |
| 2508 Instruction* call, | 2517 Instruction* call, |
| 2509 intptr_t array_cid, | 2518 intptr_t array_cid, |
| 2510 intptr_t view_cid, | 2519 intptr_t view_cid, |
| 2511 Definition** array, | 2520 Definition** array, |
| 2512 Definition* byte_index, | 2521 Definition* byte_index, |
| 2513 Instruction** cursor) { | 2522 Instruction** cursor) { |
| 2523 // Insert byte_index smi check. |
| 2524 *cursor = flow_graph->AppendTo(*cursor, |
| 2525 new(Z) CheckSmiInstr( |
| 2526 new(Z) Value(byte_index), |
| 2527 call->deopt_id(), |
| 2528 call->token_pos()), |
| 2529 call->env(), |
| 2530 FlowGraph::kEffect); |
| 2531 |
| 2514 LoadFieldInstr* length = | 2532 LoadFieldInstr* length = |
| 2515 new(Z) LoadFieldInstr( | 2533 new(Z) LoadFieldInstr( |
| 2516 new(Z) Value(*array), | 2534 new(Z) Value(*array), |
| 2517 CheckArrayBoundInstr::LengthOffsetFor(array_cid), | 2535 CheckArrayBoundInstr::LengthOffsetFor(array_cid), |
| 2518 Type::ZoneHandle(Z, Type::SmiType()), | 2536 Type::ZoneHandle(Z, Type::SmiType()), |
| 2519 call->token_pos()); | 2537 call->token_pos()); |
| 2520 length->set_is_immutable(true); | 2538 length->set_is_immutable(true); |
| 2521 length->set_result_cid(kSmiCid); | 2539 length->set_result_cid(kSmiCid); |
| 2522 length->set_recognized_kind( | 2540 length->set_recognized_kind( |
| 2523 LoadFieldInstr::RecognizedKindFromArrayCid(array_cid)); | 2541 LoadFieldInstr::RecognizedKindFromArrayCid(array_cid)); |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2804 | 2822 |
| 2805 | 2823 |
| 2806 // Returns the LoadIndexedInstr. | 2824 // Returns the LoadIndexedInstr. |
| 2807 static Definition* PrepareInlineStringIndexOp( | 2825 static Definition* PrepareInlineStringIndexOp( |
| 2808 FlowGraph* flow_graph, | 2826 FlowGraph* flow_graph, |
| 2809 Instruction* call, | 2827 Instruction* call, |
| 2810 intptr_t cid, | 2828 intptr_t cid, |
| 2811 Definition* str, | 2829 Definition* str, |
| 2812 Definition* index, | 2830 Definition* index, |
| 2813 Instruction* cursor) { | 2831 Instruction* cursor) { |
| 2832 |
| 2833 cursor = flow_graph->AppendTo(cursor, |
| 2834 new(Z) CheckSmiInstr( |
| 2835 new(Z) Value(index), |
| 2836 call->deopt_id(), |
| 2837 call->token_pos()), |
| 2838 call->env(), |
| 2839 FlowGraph::kEffect); |
| 2840 |
| 2814 // Load the length of the string. | 2841 // Load the length of the string. |
| 2815 // Treat length loads as mutable (i.e. affected by side effects) to avoid | 2842 // Treat length loads as mutable (i.e. affected by side effects) to avoid |
| 2816 // hoisting them since we can't hoist the preceding class-check. This | 2843 // hoisting them since we can't hoist the preceding class-check. This |
| 2817 // is because of externalization of strings that affects their class-id. | 2844 // is because of externalization of strings that affects their class-id. |
| 2818 LoadFieldInstr* length = new(Z) LoadFieldInstr( | 2845 LoadFieldInstr* length = new(Z) LoadFieldInstr( |
| 2819 new(Z) Value(str), | 2846 new(Z) Value(str), |
| 2820 String::length_offset(), | 2847 String::length_offset(), |
| 2821 Type::ZoneHandle(Z, Type::SmiType()), | 2848 Type::ZoneHandle(Z, Type::SmiType()), |
| 2822 str->token_pos()); | 2849 str->token_pos()); |
| 2823 length->set_result_cid(kSmiCid); | 2850 length->set_result_cid(kSmiCid); |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3227 call, entry, last); | 3254 call, entry, last); |
| 3228 case MethodRecognizer::kSmi_bitAndFromSmi: | 3255 case MethodRecognizer::kSmi_bitAndFromSmi: |
| 3229 return InlineSmiBitAndFromSmi(flow_graph, call, entry, last); | 3256 return InlineSmiBitAndFromSmi(flow_graph, call, entry, last); |
| 3230 default: | 3257 default: |
| 3231 return false; | 3258 return false; |
| 3232 } | 3259 } |
| 3233 } | 3260 } |
| 3234 | 3261 |
| 3235 | 3262 |
| 3236 } // namespace dart | 3263 } // namespace dart |
| OLD | NEW |