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/control-reducer.h" | 8 #include "src/compiler/control-reducer.h" |
9 #include "src/compiler/frame.h" | 9 #include "src/compiler/frame.h" |
10 #include "src/compiler/graph.h" | 10 #include "src/compiler/graph.h" |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 // Kill the outer loops in the original graph. | 221 // Kill the outer loops in the original graph. |
222 TRACE("Killing outer loop headers...\n"); | 222 TRACE("Killing outer loop headers...\n"); |
223 for (LoopTree::Loop* outer = osr_loop->parent(); outer; | 223 for (LoopTree::Loop* outer = osr_loop->parent(); outer; |
224 outer = outer->parent()) { | 224 outer = outer->parent()) { |
225 Node* loop_header = loop_tree->HeaderNode(outer); | 225 Node* loop_header = loop_tree->HeaderNode(outer); |
226 loop_header->ReplaceUses(dead); | 226 loop_header->ReplaceUses(dead); |
227 TRACE(" ---- #%d:%s\n", loop_header->id(), loop_header->op()->mnemonic()); | 227 TRACE(" ---- #%d:%s\n", loop_header->id(), loop_header->op()->mnemonic()); |
228 } | 228 } |
229 | 229 |
230 // Merge the ends of the graph copies. | 230 // Merge the ends of the graph copies. |
231 Node* end = graph->end(); | 231 Node* const end = graph->end(); |
232 tmp_inputs.clear(); | 232 int const input_count = end->InputCount(); |
233 for (int i = -1; i < static_cast<int>(copies.size()); i++) { | 233 for (int i = 0; i < input_count; ++i) { |
234 Node* input = end->InputAt(0); | 234 NodeId const id = end->InputAt(i)->id(); |
235 if (i >= 0) input = copies[i]->at(input->id()); | 235 for (NodeVector* const copy : copies) { |
236 if (input->opcode() == IrOpcode::kMerge) { | 236 end->AppendInput(graph->zone(), copy->at(id)); |
237 for (Node* node : input->inputs()) tmp_inputs.push_back(node); | 237 end->set_op(common->End(end->InputCount())); |
238 } else { | |
239 tmp_inputs.push_back(input); | |
240 } | 238 } |
241 } | 239 } |
242 int count = static_cast<int>(tmp_inputs.size()); | |
243 Node* merge = graph->NewNode(common->Merge(count), count, &tmp_inputs[0]); | |
244 end->ReplaceInput(0, merge); | |
245 | 240 |
246 if (FLAG_trace_turbo_graph) { // Simple textual RPO. | 241 if (FLAG_trace_turbo_graph) { // Simple textual RPO. |
247 OFStream os(stdout); | 242 OFStream os(stdout); |
248 os << "-- Graph after OSR duplication -- " << std::endl; | 243 os << "-- Graph after OSR duplication -- " << std::endl; |
249 os << AsRPO(*graph); | 244 os << AsRPO(*graph); |
250 } | 245 } |
251 } | 246 } |
252 | 247 |
253 | 248 |
254 static void TransferOsrValueTypesFromLoopPhis(Zone* zone, Node* osr_loop_entry, | 249 static void TransferOsrValueTypesFromLoopPhis(Zone* zone, Node* osr_loop_entry, |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 // the first spill slots. | 348 // the first spill slots. |
354 frame->ReserveSpillSlots(UnoptimizedFrameSlots()); | 349 frame->ReserveSpillSlots(UnoptimizedFrameSlots()); |
355 // The frame needs to be adjusted by the number of unoptimized frame slots. | 350 // The frame needs to be adjusted by the number of unoptimized frame slots. |
356 frame->SetOsrStackSlotCount(static_cast<int>(UnoptimizedFrameSlots())); | 351 frame->SetOsrStackSlotCount(static_cast<int>(UnoptimizedFrameSlots())); |
357 } | 352 } |
358 | 353 |
359 | 354 |
360 } // namespace compiler | 355 } // namespace compiler |
361 } // namespace internal | 356 } // namespace internal |
362 } // namespace v8 | 357 } // namespace v8 |
OLD | NEW |