| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/cha.h" | 7 #include "vm/cha.h" |
| 8 #include "vm/flow_graph_builder.h" | 8 #include "vm/flow_graph_builder.h" |
| 9 #include "vm/hash_map.h" | 9 #include "vm/hash_map.h" |
| 10 #include "vm/il_printer.h" | 10 #include "vm/il_printer.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 BlockEntryInstr* entry = block_order_[i]; | 31 BlockEntryInstr* entry = block_order_[i]; |
| 32 entry->Accept(this); | 32 entry->Accept(this); |
| 33 for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) { | 33 for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) { |
| 34 Definition* defn = it.Current()->AsDefinition(); | 34 Definition* defn = it.Current()->AsDefinition(); |
| 35 if (defn != NULL) { | 35 if (defn != NULL) { |
| 36 Definition* result = defn->Canonicalize(); | 36 Definition* result = defn->Canonicalize(); |
| 37 if (result != defn) { | 37 if (result != defn) { |
| 38 if (result != NULL) { | 38 if (result != NULL) { |
| 39 defn->ReplaceUsesWith(result); | 39 defn->ReplaceUsesWith(result); |
| 40 if (FLAG_trace_optimization) { | 40 if (FLAG_trace_optimization) { |
| 41 OS::Print("Replacing v%d with v%d\n", | 41 OS::Print("Replacing v%"Pd" with v%"Pd"\n", |
| 42 defn->ssa_temp_index(), | 42 defn->ssa_temp_index(), |
| 43 result->ssa_temp_index()); | 43 result->ssa_temp_index()); |
| 44 } | 44 } |
| 45 } else if (FLAG_trace_optimization) { | 45 } else if (FLAG_trace_optimization) { |
| 46 OS::Print("Removing v%d.\n", defn->ssa_temp_index()); | 46 OS::Print("Removing v%"Pd".\n", defn->ssa_temp_index()); |
| 47 } | 47 } |
| 48 it.RemoveCurrentFromGraph(); | 48 it.RemoveCurrentFromGraph(); |
| 49 } | 49 } |
| 50 } | 50 } |
| 51 } | 51 } |
| 52 } | 52 } |
| 53 } | 53 } |
| 54 | 54 |
| 55 | 55 |
| 56 static Definition* CreateConversion(Representation from, | 56 static Definition* CreateConversion(Representation from, |
| (...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 910 | 910 |
| 911 Value* use = instr->value(); | 911 Value* use = instr->value(); |
| 912 ASSERT(use != NULL); | 912 ASSERT(use != NULL); |
| 913 Definition* result = use->definition(); | 913 Definition* result = use->definition(); |
| 914 ASSERT(result != NULL); | 914 ASSERT(result != NULL); |
| 915 // Replace uses and remove the current instruction via the iterator. | 915 // Replace uses and remove the current instruction via the iterator. |
| 916 instr->ReplaceUsesWith(result); | 916 instr->ReplaceUsesWith(result); |
| 917 ASSERT(current_iterator()->Current() == instr); | 917 ASSERT(current_iterator()->Current() == instr); |
| 918 current_iterator()->RemoveCurrentFromGraph(); | 918 current_iterator()->RemoveCurrentFromGraph(); |
| 919 if (FLAG_trace_optimization) { | 919 if (FLAG_trace_optimization) { |
| 920 OS::Print("Replacing v%d with v%d\n", | 920 OS::Print("Replacing v%"Pd" with v%"Pd"\n", |
| 921 instr->ssa_temp_index(), | 921 instr->ssa_temp_index(), |
| 922 result->ssa_temp_index()); | 922 result->ssa_temp_index()); |
| 923 } | 923 } |
| 924 | 924 |
| 925 if (FLAG_trace_type_check_elimination) { | 925 if (FLAG_trace_type_check_elimination) { |
| 926 FlowGraphPrinter::PrintTypeCheck(parsed_function(), | 926 FlowGraphPrinter::PrintTypeCheck(parsed_function(), |
| 927 instr->token_pos(), | 927 instr->token_pos(), |
| 928 instr->value(), | 928 instr->value(), |
| 929 instr->dst_type(), | 929 instr->dst_type(), |
| 930 instr->dst_name(), | 930 instr->dst_name(), |
| (...skipping 20 matching lines...) Expand all Loading... |
| 951 instr->eliminate(); | 951 instr->eliminate(); |
| 952 | 952 |
| 953 Value* use = instr->value(); | 953 Value* use = instr->value(); |
| 954 Definition* result = use->definition(); | 954 Definition* result = use->definition(); |
| 955 ASSERT(result != NULL); | 955 ASSERT(result != NULL); |
| 956 // Replace uses and remove the current instruction via the iterator. | 956 // Replace uses and remove the current instruction via the iterator. |
| 957 instr->ReplaceUsesWith(result); | 957 instr->ReplaceUsesWith(result); |
| 958 ASSERT(current_iterator()->Current() == instr); | 958 ASSERT(current_iterator()->Current() == instr); |
| 959 current_iterator()->RemoveCurrentFromGraph(); | 959 current_iterator()->RemoveCurrentFromGraph(); |
| 960 if (FLAG_trace_optimization) { | 960 if (FLAG_trace_optimization) { |
| 961 OS::Print("Replacing v%d with v%d\n", | 961 OS::Print("Replacing v%"Pd" with v%"Pd"\n", |
| 962 instr->ssa_temp_index(), | 962 instr->ssa_temp_index(), |
| 963 result->ssa_temp_index()); | 963 result->ssa_temp_index()); |
| 964 } | 964 } |
| 965 | 965 |
| 966 if (FLAG_trace_type_check_elimination) { | 966 if (FLAG_trace_type_check_elimination) { |
| 967 const String& name = String::Handle(Symbols::New("boolean expression")); | 967 const String& name = String::Handle(Symbols::New("boolean expression")); |
| 968 FlowGraphPrinter::PrintTypeCheck(parsed_function(), | 968 FlowGraphPrinter::PrintTypeCheck(parsed_function(), |
| 969 instr->token_pos(), | 969 instr->token_pos(), |
| 970 instr->value(), | 970 instr->value(), |
| 971 Type::Handle(Type::BoolType()), | 971 Type::Handle(Type::BoolType()), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 990 !instr->value()->BindsToConstantNull() && | 990 !instr->value()->BindsToConstantNull() && |
| 991 instr->value()->CompileTypeIsMoreSpecificThan(instr->type())) { | 991 instr->value()->CompileTypeIsMoreSpecificThan(instr->type())) { |
| 992 Value* use = instr->value(); | 992 Value* use = instr->value(); |
| 993 Definition* result = use->definition(); | 993 Definition* result = use->definition(); |
| 994 ASSERT(result != NULL); | 994 ASSERT(result != NULL); |
| 995 // Replace uses and remove the current instruction via the iterator. | 995 // Replace uses and remove the current instruction via the iterator. |
| 996 instr->ReplaceUsesWith(result); | 996 instr->ReplaceUsesWith(result); |
| 997 ASSERT(current_iterator()->Current() == instr); | 997 ASSERT(current_iterator()->Current() == instr); |
| 998 current_iterator()->RemoveCurrentFromGraph(); | 998 current_iterator()->RemoveCurrentFromGraph(); |
| 999 if (FLAG_trace_optimization) { | 999 if (FLAG_trace_optimization) { |
| 1000 OS::Print("Replacing v%d with v%d\n", | 1000 OS::Print("Replacing v%"Pd" with v%"Pd"\n", |
| 1001 instr->ssa_temp_index(), | 1001 instr->ssa_temp_index(), |
| 1002 result->ssa_temp_index()); | 1002 result->ssa_temp_index()); |
| 1003 } | 1003 } |
| 1004 | 1004 |
| 1005 if (FLAG_trace_type_check_elimination) { | 1005 if (FLAG_trace_type_check_elimination) { |
| 1006 const String& name = String::Handle(Symbols::New("InstanceOf")); | 1006 const String& name = String::Handle(Symbols::New("InstanceOf")); |
| 1007 FlowGraphPrinter::PrintTypeCheck(parsed_function(), | 1007 FlowGraphPrinter::PrintTypeCheck(parsed_function(), |
| 1008 instr->token_pos(), | 1008 instr->token_pos(), |
| 1009 instr->value(), | 1009 instr->value(), |
| 1010 instr->type(), | 1010 instr->type(), |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1160 if ((defn == NULL) || defn->HasSideEffect()) continue; | 1160 if ((defn == NULL) || defn->HasSideEffect()) continue; |
| 1161 Definition* result = map->Lookup(defn); | 1161 Definition* result = map->Lookup(defn); |
| 1162 if (result == NULL) { | 1162 if (result == NULL) { |
| 1163 map->Insert(defn); | 1163 map->Insert(defn); |
| 1164 continue; | 1164 continue; |
| 1165 } | 1165 } |
| 1166 // Replace current with lookup result. | 1166 // Replace current with lookup result. |
| 1167 defn->ReplaceUsesWith(result); | 1167 defn->ReplaceUsesWith(result); |
| 1168 it.RemoveCurrentFromGraph(); | 1168 it.RemoveCurrentFromGraph(); |
| 1169 if (FLAG_trace_optimization) { | 1169 if (FLAG_trace_optimization) { |
| 1170 OS::Print("Replacing v%d with v%d\n", | 1170 OS::Print("Replacing v%"Pd" with v%"Pd"\n", |
| 1171 defn->ssa_temp_index(), | 1171 defn->ssa_temp_index(), |
| 1172 result->ssa_temp_index()); | 1172 result->ssa_temp_index()); |
| 1173 } | 1173 } |
| 1174 } | 1174 } |
| 1175 | 1175 |
| 1176 // Process children in the dominator tree recursively. | 1176 // Process children in the dominator tree recursively. |
| 1177 intptr_t num_children = block->dominated_blocks().length(); | 1177 intptr_t num_children = block->dominated_blocks().length(); |
| 1178 for (intptr_t i = 0; i < num_children; ++i) { | 1178 for (intptr_t i = 0; i < num_children; ++i) { |
| 1179 BlockEntryInstr* child = block->dominated_blocks()[i]; | 1179 BlockEntryInstr* child = block->dominated_blocks()[i]; |
| 1180 if (i < num_children - 1) { | 1180 if (i < num_children - 1) { |
| 1181 DirectChainedHashMap<Definition*> child_map(*map); // Copy map. | 1181 DirectChainedHashMap<Definition*> child_map(*map); // Copy map. |
| 1182 OptimizeRecursive(child, &child_map); | 1182 OptimizeRecursive(child, &child_map); |
| 1183 } else { | 1183 } else { |
| 1184 OptimizeRecursive(child, map); // Reuse map for the last child. | 1184 OptimizeRecursive(child, map); // Reuse map for the last child. |
| 1185 } | 1185 } |
| 1186 } | 1186 } |
| 1187 } | 1187 } |
| 1188 | 1188 |
| 1189 | 1189 |
| 1190 } // namespace dart | 1190 } // namespace dart |
| OLD | NEW |