| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler.h" | 5 #include "src/compiler.h" |
| 6 #include "src/compiler/all-nodes.h" | 6 #include "src/compiler/all-nodes.h" |
| 7 #include "src/compiler/common-operator.h" | 7 #include "src/compiler/common-operator.h" |
| 8 #include "src/compiler/common-operator-reducer.h" | 8 #include "src/compiler/common-operator-reducer.h" |
| 9 #include "src/compiler/dead-code-elimination.h" | 9 #include "src/compiler/dead-code-elimination.h" |
| 10 #include "src/compiler/frame.h" | 10 #include "src/compiler/frame.h" |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 TRACE(" ---- #%d:%s\n", loop_header->id(), loop_header->op()->mnemonic()); | 230 TRACE(" ---- #%d:%s\n", loop_header->id(), loop_header->op()->mnemonic()); |
| 231 } | 231 } |
| 232 | 232 |
| 233 // Merge the ends of the graph copies. | 233 // Merge the ends of the graph copies. |
| 234 Node* const end = graph->end(); | 234 Node* const end = graph->end(); |
| 235 int const input_count = end->InputCount(); | 235 int const input_count = end->InputCount(); |
| 236 for (int i = 0; i < input_count; ++i) { | 236 for (int i = 0; i < input_count; ++i) { |
| 237 NodeId const id = end->InputAt(i)->id(); | 237 NodeId const id = end->InputAt(i)->id(); |
| 238 for (NodeVector* const copy : copies) { | 238 for (NodeVector* const copy : copies) { |
| 239 end->AppendInput(graph->zone(), copy->at(id)); | 239 end->AppendInput(graph->zone(), copy->at(id)); |
| 240 end->set_op(common->End(end->InputCount())); | 240 NodeProperties::ChangeOp(end, common->End(end->InputCount())); |
| 241 } | 241 } |
| 242 } | 242 } |
| 243 | 243 |
| 244 if (FLAG_trace_turbo_graph) { // Simple textual RPO. | 244 if (FLAG_trace_turbo_graph) { // Simple textual RPO. |
| 245 OFStream os(stdout); | 245 OFStream os(stdout); |
| 246 os << "-- Graph after OSR duplication -- " << std::endl; | 246 os << "-- Graph after OSR duplication -- " << std::endl; |
| 247 os << AsRPO(*graph); | 247 os << AsRPO(*graph); |
| 248 } | 248 } |
| 249 } | 249 } |
| 250 | 250 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 osr_normal_entry->ReplaceUses(dead); | 294 osr_normal_entry->ReplaceUses(dead); |
| 295 osr_normal_entry->Kill(); | 295 osr_normal_entry->Kill(); |
| 296 osr_loop_entry->ReplaceUses(graph->start()); | 296 osr_loop_entry->ReplaceUses(graph->start()); |
| 297 osr_loop_entry->Kill(); | 297 osr_loop_entry->Kill(); |
| 298 | 298 |
| 299 // Remove the first input to the {osr_loop}. | 299 // Remove the first input to the {osr_loop}. |
| 300 int const live_input_count = osr_loop->InputCount() - 1; | 300 int const live_input_count = osr_loop->InputCount() - 1; |
| 301 CHECK_NE(0, live_input_count); | 301 CHECK_NE(0, live_input_count); |
| 302 for (Node* const use : osr_loop->uses()) { | 302 for (Node* const use : osr_loop->uses()) { |
| 303 if (NodeProperties::IsPhi(use)) { | 303 if (NodeProperties::IsPhi(use)) { |
| 304 use->set_op(common->ResizeMergeOrPhi(use->op(), live_input_count)); | |
| 305 use->RemoveInput(0); | 304 use->RemoveInput(0); |
| 305 NodeProperties::ChangeOp( |
| 306 use, common->ResizeMergeOrPhi(use->op(), live_input_count)); |
| 306 } | 307 } |
| 307 } | 308 } |
| 308 osr_loop->set_op(common->ResizeMergeOrPhi(osr_loop->op(), live_input_count)); | |
| 309 osr_loop->RemoveInput(0); | 309 osr_loop->RemoveInput(0); |
| 310 NodeProperties::ChangeOp( |
| 311 osr_loop, common->ResizeMergeOrPhi(osr_loop->op(), live_input_count)); |
| 310 | 312 |
| 311 // Run control reduction and graph trimming. | 313 // Run control reduction and graph trimming. |
| 312 // TODO(bmeurer): The OSR deconstruction could be a regular reducer and play | 314 // TODO(bmeurer): The OSR deconstruction could be a regular reducer and play |
| 313 // nice together with the rest, instead of having this custom stuff here. | 315 // nice together with the rest, instead of having this custom stuff here. |
| 314 GraphReducer graph_reducer(tmp_zone, graph); | 316 GraphReducer graph_reducer(tmp_zone, graph); |
| 315 DeadCodeElimination dce(&graph_reducer, graph, common); | 317 DeadCodeElimination dce(&graph_reducer, graph, common); |
| 316 CommonOperatorReducer cor(&graph_reducer, graph, common, jsgraph->machine()); | 318 CommonOperatorReducer cor(&graph_reducer, graph, common, jsgraph->machine()); |
| 317 graph_reducer.AddReducer(&dce); | 319 graph_reducer.AddReducer(&dce); |
| 318 graph_reducer.AddReducer(&cor); | 320 graph_reducer.AddReducer(&cor); |
| 319 graph_reducer.ReduceGraph(); | 321 graph_reducer.ReduceGraph(); |
| 320 GraphTrimmer trimmer(tmp_zone, graph); | 322 GraphTrimmer trimmer(tmp_zone, graph); |
| 321 NodeVector roots(tmp_zone); | 323 NodeVector roots(tmp_zone); |
| 322 jsgraph->GetCachedNodes(&roots); | 324 jsgraph->GetCachedNodes(&roots); |
| 323 trimmer.TrimGraph(roots.begin(), roots.end()); | 325 trimmer.TrimGraph(roots.begin(), roots.end()); |
| 324 } | 326 } |
| 325 | 327 |
| 326 | 328 |
| 327 void OsrHelper::SetupFrame(Frame* frame) { | 329 void OsrHelper::SetupFrame(Frame* frame) { |
| 328 // The optimized frame will subsume the unoptimized frame. Do so by reserving | 330 // The optimized frame will subsume the unoptimized frame. Do so by reserving |
| 329 // the first spill slots. | 331 // the first spill slots. |
| 330 frame->ReserveSpillSlots(UnoptimizedFrameSlots()); | 332 frame->ReserveSpillSlots(UnoptimizedFrameSlots()); |
| 331 } | 333 } |
| 332 | 334 |
| 333 } // namespace compiler | 335 } // namespace compiler |
| 334 } // namespace internal | 336 } // namespace internal |
| 335 } // namespace v8 | 337 } // namespace v8 |
| OLD | NEW |