844 {
846
850
851 BitVector* kill =
kill_[
i];
853 last_loads->Clear();
854
855
856
857
858
859
860
861 if (block->InsideTryBlock()) {
862 live_in->SetAll();
863 continue;
864 }
865
866
867 for (BackwardInstructionIterator it(block); !it.Done(); it.Advance()) {
868 Instruction* current = it.Current();
869
870 LoadLocalInstr*
load = current->AsLoadLocal();
871 if (
load !=
nullptr) {
872 const intptr_t index = flow_graph_->
EnvIndex(&
load->local());
873 if (index >= live_in->length()) continue;
874 live_in->Add(index);
875 if (!last_loads->Contains(index)) {
876 last_loads->Add(index);
878 }
879 continue;
880 }
881
882 StoreLocalInstr*
store = current->AsStoreLocal();
883 if (
store !=
nullptr) {
884 const intptr_t index = flow_graph_->
EnvIndex(&
store->local());
885 if (index >= live_in->length()) continue;
886 if (kill->Contains(index)) {
887 if (!live_in->Contains(index)) {
889 }
890 } else {
891 if (!live_in->Contains(index)) {
893 }
894 kill->Add(index);
895 }
896 live_in->Remove(index);
897 continue;
898 }
899 }
900
901
902
903 const bool is_function_entry = block->IsFunctionEntry();
904 const bool is_osr_entry = block->IsOsrEntry();
905 const bool is_catch_block_entry = block->IsCatchBlockEntry();
906 if (is_function_entry || is_osr_entry || is_catch_block_entry) {
907 const intptr_t parameter_count =
908 (is_osr_entry || is_catch_block_entry)
911 for (intptr_t
i = 0;
i < parameter_count; ++
i) {
914 }
915 }
916 if (is_function_entry) {
919 live_in->Remove(index);
920 kill->Add(index);
921 }
922 }
923 }
924}
intptr_t ArgumentDescriptorEnvIndex() const
const ParsedFunction & parsed_function() const
intptr_t num_direct_parameters() const
intptr_t variable_count() const
intptr_t EnvIndex(const LocalVariable *variable) const
const intptr_t variable_count_
GrowableArray< BitVector * > kill_
GrowableArray< BitVector * > live_in_
const GrowableArray< BlockEntryInstr * > & postorder_
bool has_arg_desc_var() const