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_inliner.h" | 5 #include "vm/flow_graph_inliner.h" |
6 | 6 |
| 7 #include "vm/assert.h" |
7 #include "vm/compiler.h" | 8 #include "vm/compiler.h" |
8 #include "vm/flags.h" | 9 #include "vm/flags.h" |
9 #include "vm/flow_graph.h" | 10 #include "vm/flow_graph.h" |
10 #include "vm/flow_graph_builder.h" | 11 #include "vm/flow_graph_builder.h" |
11 #include "vm/flow_graph_optimizer.h" | 12 #include "vm/flow_graph_optimizer.h" |
12 #include "vm/il_printer.h" | 13 #include "vm/il_printer.h" |
13 #include "vm/intrinsifier.h" | 14 #include "vm/intrinsifier.h" |
14 #include "vm/longjump.h" | 15 #include "vm/longjump.h" |
15 #include "vm/object.h" | 16 #include "vm/object.h" |
16 #include "vm/object_store.h" | 17 #include "vm/object_store.h" |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 } | 139 } |
139 | 140 |
140 // TODO(zerny): If result is more than size threshold then abort. | 141 // TODO(zerny): If result is more than size threshold then abort. |
141 | 142 |
142 // TODO(zerny): If effort is less than threshold then inline recursively. | 143 // TODO(zerny): If effort is less than threshold then inline recursively. |
143 | 144 |
144 // Plug result in the caller graph. | 145 // Plug result in the caller graph. |
145 caller_graph_->InlineCall(call, callee_graph); | 146 caller_graph_->InlineCall(call, callee_graph); |
146 next_ssa_temp_index_ = caller_graph_->max_virtual_register_number(); | 147 next_ssa_temp_index_ = caller_graph_->max_virtual_register_number(); |
147 | 148 |
148 // Check that inlining maintains use lists. | |
149 DEBUG_ASSERT(caller_graph_->ValidateUseLists()); | |
150 | |
151 // Remove push arguments of the call. | 149 // Remove push arguments of the call. |
152 for (intptr_t i = 0; i < call->ArgumentCount(); ++i) { | 150 for (intptr_t i = 0; i < call->ArgumentCount(); ++i) { |
153 PushArgumentInstr* push = call->ArgumentAt(i); | 151 PushArgumentInstr* push = call->ArgumentAt(i); |
154 push->ReplaceUsesWith(push->value()->definition()); | 152 push->ReplaceUsesWith(push->value()->definition()); |
155 push->RemoveFromGraph(); | 153 push->RemoveFromGraph(); |
156 } | 154 } |
157 | 155 |
158 // Replace formal parameters with actuals. | 156 // Replace formal parameters with actuals. |
159 intptr_t arg_index = 0; | 157 intptr_t arg_index = 0; |
160 GrowableArray<Definition*>* defns = | 158 GrowableArray<Definition*>* defns = |
161 callee_graph->graph_entry()->initial_definitions(); | 159 callee_graph->graph_entry()->initial_definitions(); |
162 for (intptr_t i = 0; i < defns->length(); ++i) { | 160 for (intptr_t i = 0; i < defns->length(); ++i) { |
163 ParameterInstr* param = (*defns)[i]->AsParameter(); | 161 ParameterInstr* param = (*defns)[i]->AsParameter(); |
164 if (param != NULL) { | 162 if (param != NULL) { |
165 param->ReplaceUsesWith((*arguments)[arg_index++]->definition()); | 163 param->ReplaceUsesWith((*arguments)[arg_index++]->definition()); |
166 } | 164 } |
167 } | 165 } |
168 ASSERT(arg_index == arguments->length()); | 166 ASSERT(arg_index == arguments->length()); |
169 | 167 |
170 // Replace callee's null constant with caller's null constant. | 168 // Replace callee's null constant with caller's null constant. |
171 callee_graph->graph_entry()->constant_null()->ReplaceUsesWith( | 169 callee_graph->graph_entry()->constant_null()->ReplaceUsesWith( |
172 caller_graph_->graph_entry()->constant_null()); | 170 caller_graph_->graph_entry()->constant_null()); |
173 | 171 |
174 TRACE_INLINING(OS::Print(" Success\n")); | 172 TRACE_INLINING(OS::Print(" Success\n")); |
175 | 173 |
| 174 // Check that inlining maintains use lists. |
| 175 SLOW_ASSERT(caller_graph_->ValidateUseLists()); |
| 176 |
176 // Build succeeded so we restore the bailout jump. | 177 // Build succeeded so we restore the bailout jump. |
177 inlined_ = true; | 178 inlined_ = true; |
178 isolate->set_long_jump_base(base); | 179 isolate->set_long_jump_base(base); |
179 isolate->set_deopt_id(prev_deopt_id); | 180 isolate->set_deopt_id(prev_deopt_id); |
180 isolate->set_ic_data_array(prev_ic_data.raw()); | 181 isolate->set_ic_data_array(prev_ic_data.raw()); |
181 return true; | 182 return true; |
182 } else { | 183 } else { |
183 Error& error = Error::Handle(); | 184 Error& error = Error::Handle(); |
184 error = isolate->object_store()->sticky_error(); | 185 error = isolate->object_store()->sticky_error(); |
185 isolate->object_store()->clear_sticky_error(); | 186 isolate->object_store()->clear_sticky_error(); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 if (FLAG_trace_inlining && FLAG_print_flow_graph) { | 272 if (FLAG_trace_inlining && FLAG_print_flow_graph) { |
272 OS::Print("After Inlining of %s\n", flow_graph_-> | 273 OS::Print("After Inlining of %s\n", flow_graph_-> |
273 parsed_function().function().ToFullyQualifiedCString()); | 274 parsed_function().function().ToFullyQualifiedCString()); |
274 FlowGraphPrinter printer(*flow_graph_); | 275 FlowGraphPrinter printer(*flow_graph_); |
275 printer.PrintBlocks(); | 276 printer.PrintBlocks(); |
276 } | 277 } |
277 } | 278 } |
278 } | 279 } |
279 | 280 |
280 } // namespace dart | 281 } // namespace dart |
OLD | NEW |