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/dart_entry.h" | 9 #include "vm/dart_entry.h" |
10 #include "vm/flow_graph_builder.h" | 10 #include "vm/flow_graph_builder.h" |
(...skipping 3613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3624 // For every catch-block: Iterate over all call instructions inside the | 3624 // For every catch-block: Iterate over all call instructions inside the |
3625 // corresponding try-block and figure out for each environment value if it | 3625 // corresponding try-block and figure out for each environment value if it |
3626 // is the same constant at all calls. If yes, replace the initial definition | 3626 // is the same constant at all calls. If yes, replace the initial definition |
3627 // at the catch-entry with this constant. | 3627 // at the catch-entry with this constant. |
3628 const GrowableArray<CatchBlockEntryInstr*>& catch_entries = | 3628 const GrowableArray<CatchBlockEntryInstr*>& catch_entries = |
3629 flow_graph->graph_entry()->catch_entries(); | 3629 flow_graph->graph_entry()->catch_entries(); |
3630 intptr_t base = kFirstLocalSlotFromFp + flow_graph->num_non_copied_params(); | 3630 intptr_t base = kFirstLocalSlotFromFp + flow_graph->num_non_copied_params(); |
3631 for (intptr_t catch_idx = 0; | 3631 for (intptr_t catch_idx = 0; |
3632 catch_idx < catch_entries.length(); | 3632 catch_idx < catch_entries.length(); |
3633 ++catch_idx) { | 3633 ++catch_idx) { |
3634 CatchBlockEntryInstr* cb = catch_entries[catch_idx]; | 3634 CatchBlockEntryInstr* catch_entry = catch_entries[catch_idx]; |
3635 CatchEntryInstr* catch_entry = cb->next()->AsCatchEntry(); | |
3636 | 3635 |
3637 // Initialize cdefs with the original initial definitions (ParameterInstr). | 3636 // Initialize cdefs with the original initial definitions (ParameterInstr). |
3638 // The following representation is used: | 3637 // The following representation is used: |
3639 // ParameterInstr => unknown | 3638 // ParameterInstr => unknown |
3640 // ConstantInstr => known constant | 3639 // ConstantInstr => known constant |
3641 // NULL => non-constant | 3640 // NULL => non-constant |
3642 GrowableArray<Definition*>* idefs = cb->initial_definitions(); | 3641 GrowableArray<Definition*>* idefs = catch_entry->initial_definitions(); |
3643 GrowableArray<Definition*> cdefs(idefs->length()); | 3642 GrowableArray<Definition*> cdefs(idefs->length()); |
3644 cdefs.AddArray(*idefs); | 3643 cdefs.AddArray(*idefs); |
3645 | 3644 |
3646 // exception_var and stacktrace_var are never constant. | 3645 // exception_var and stacktrace_var are never constant. |
3647 intptr_t ex_idx = base - catch_entry->exception_var().index(); | 3646 intptr_t ex_idx = base - catch_entry->exception_var().index(); |
3648 intptr_t st_idx = base - catch_entry->stacktrace_var().index(); | 3647 intptr_t st_idx = base - catch_entry->stacktrace_var().index(); |
3649 cdefs[ex_idx] = cdefs[st_idx] = NULL; | 3648 cdefs[ex_idx] = cdefs[st_idx] = NULL; |
3650 | 3649 |
3651 for (BlockIterator block_it = flow_graph->reverse_postorder_iterator(); | 3650 for (BlockIterator block_it = flow_graph->reverse_postorder_iterator(); |
3652 !block_it.Done(); | 3651 !block_it.Done(); |
3653 block_it.Advance()) { | 3652 block_it.Advance()) { |
3654 BlockEntryInstr* block = block_it.Current(); | 3653 BlockEntryInstr* block = block_it.Current(); |
3655 if (block->try_index() == cb->catch_try_index()) { | 3654 if (block->try_index() == catch_entry->catch_try_index()) { |
3656 for (ForwardInstructionIterator instr_it(block); | 3655 for (ForwardInstructionIterator instr_it(block); |
3657 !instr_it.Done(); | 3656 !instr_it.Done(); |
3658 instr_it.Advance()) { | 3657 instr_it.Advance()) { |
3659 Instruction* current = instr_it.Current(); | 3658 Instruction* current = instr_it.Current(); |
3660 if (current->MayThrow()) { | 3659 if (current->MayThrow()) { |
3661 Environment* env = current->env(); | 3660 Environment* env = current->env(); |
3662 for (intptr_t env_idx = 0; env_idx < cdefs.length(); ++env_idx) { | 3661 for (intptr_t env_idx = 0; env_idx < cdefs.length(); ++env_idx) { |
3663 if (cdefs[env_idx] != NULL && | 3662 if (cdefs[env_idx] != NULL && |
3664 env->ValueAt(env_idx)->BindsToConstant()) { | 3663 env->ValueAt(env_idx)->BindsToConstant()) { |
3665 cdefs[env_idx] = env->ValueAt(env_idx)->definition(); | 3664 cdefs[env_idx] = env->ValueAt(env_idx)->definition(); |
(...skipping 2053 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5719 } | 5718 } |
5720 } | 5719 } |
5721 | 5720 |
5722 | 5721 |
5723 // -------------------------------------------------------------------------- | 5722 // -------------------------------------------------------------------------- |
5724 // Analysis of non-definition instructions. They do not have values so they | 5723 // Analysis of non-definition instructions. They do not have values so they |
5725 // cannot have constant values. | 5724 // cannot have constant values. |
5726 void ConstantPropagator::VisitStoreContext(StoreContextInstr* instr) { } | 5725 void ConstantPropagator::VisitStoreContext(StoreContextInstr* instr) { } |
5727 | 5726 |
5728 | 5727 |
5729 void ConstantPropagator::VisitCatchEntry(CatchEntryInstr* instr) { } | |
5730 | |
5731 | |
5732 void ConstantPropagator::VisitCheckStackOverflow( | 5728 void ConstantPropagator::VisitCheckStackOverflow( |
5733 CheckStackOverflowInstr* instr) { } | 5729 CheckStackOverflowInstr* instr) { } |
5734 | 5730 |
5735 | 5731 |
5736 void ConstantPropagator::VisitCheckClass(CheckClassInstr* instr) { } | 5732 void ConstantPropagator::VisitCheckClass(CheckClassInstr* instr) { } |
5737 | 5733 |
5738 void ConstantPropagator::VisitGuardField(GuardFieldInstr* instr) { } | 5734 void ConstantPropagator::VisitGuardField(GuardFieldInstr* instr) { } |
5739 | 5735 |
5740 void ConstantPropagator::VisitCheckSmi(CheckSmiInstr* instr) { } | 5736 void ConstantPropagator::VisitCheckSmi(CheckSmiInstr* instr) { } |
5741 | 5737 |
(...skipping 1671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7413 } | 7409 } |
7414 | 7410 |
7415 // Insert materializations at environment uses. | 7411 // Insert materializations at environment uses. |
7416 for (intptr_t i = 0; i < exits.length(); i++) { | 7412 for (intptr_t i = 0; i < exits.length(); i++) { |
7417 CreateMaterializationAt(exits[i], alloc, alloc->cls(), *fields); | 7413 CreateMaterializationAt(exits[i], alloc, alloc->cls(), *fields); |
7418 } | 7414 } |
7419 } | 7415 } |
7420 | 7416 |
7421 | 7417 |
7422 } // namespace dart | 7418 } // namespace dart |
OLD | NEW |