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/common-operator-reducer.h" | 5 #include "src/compiler/common-operator-reducer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "src/compiler/common-operator.h" | 9 #include "src/compiler/common-operator.h" |
10 #include "src/compiler/graph.h" | 10 #include "src/compiler/graph.h" |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 if (input != value) return NoChange(); | 277 if (input != value) return NoChange(); |
278 } | 278 } |
279 // We might now be able to further reduce the {merge} node. | 279 // We might now be able to further reduce the {merge} node. |
280 Revisit(merge); | 280 Revisit(merge); |
281 return Replace(value); | 281 return Replace(value); |
282 } | 282 } |
283 | 283 |
284 | 284 |
285 Reduction CommonOperatorReducer::ReduceReturn(Node* node) { | 285 Reduction CommonOperatorReducer::ReduceReturn(Node* node) { |
286 DCHECK_EQ(IrOpcode::kReturn, node->opcode()); | 286 DCHECK_EQ(IrOpcode::kReturn, node->opcode()); |
287 Node* const value = node->InputAt(0); | 287 Node* const value = node->InputAt(1); |
288 Node* effect = NodeProperties::GetEffectInput(node); | 288 Node* effect = NodeProperties::GetEffectInput(node); |
289 Node* const control = NodeProperties::GetControlInput(node); | 289 Node* const control = NodeProperties::GetControlInput(node); |
290 bool changed = false; | 290 bool changed = false; |
291 if (effect->opcode() == IrOpcode::kCheckpoint) { | 291 if (effect->opcode() == IrOpcode::kCheckpoint) { |
292 // Any {Return} node can never be used to insert a deoptimization point, | 292 // Any {Return} node can never be used to insert a deoptimization point, |
293 // hence checkpoints can be cut out of the effect chain flowing into it. | 293 // hence checkpoints can be cut out of the effect chain flowing into it. |
294 effect = NodeProperties::GetEffectInput(effect); | 294 effect = NodeProperties::GetEffectInput(effect); |
295 NodeProperties::ReplaceEffectInput(node, effect); | 295 NodeProperties::ReplaceEffectInput(node, effect); |
296 changed = true; | 296 changed = true; |
297 } | 297 } |
298 if (value->opcode() == IrOpcode::kPhi && | 298 if (value->opcode() == IrOpcode::kPhi && |
299 NodeProperties::GetControlInput(value) == control && | 299 NodeProperties::GetControlInput(value) == control && |
300 effect->opcode() == IrOpcode::kEffectPhi && | 300 effect->opcode() == IrOpcode::kEffectPhi && |
301 NodeProperties::GetControlInput(effect) == control && | 301 NodeProperties::GetControlInput(effect) == control && |
302 control->opcode() == IrOpcode::kMerge) { | 302 control->opcode() == IrOpcode::kMerge) { |
303 int const control_input_count = control->InputCount(); | 303 int const control_input_count = control->InputCount(); |
304 DCHECK_NE(0, control_input_count); | 304 DCHECK_NE(0, control_input_count); |
305 DCHECK_EQ(control_input_count, value->InputCount() - 1); | 305 DCHECK_EQ(control_input_count, value->InputCount() - 1); |
306 DCHECK_EQ(control_input_count, effect->InputCount() - 1); | 306 DCHECK_EQ(control_input_count, effect->InputCount() - 1); |
307 DCHECK_EQ(IrOpcode::kEnd, graph()->end()->opcode()); | 307 DCHECK_EQ(IrOpcode::kEnd, graph()->end()->opcode()); |
308 DCHECK_NE(0, graph()->end()->InputCount()); | 308 DCHECK_NE(0, graph()->end()->InputCount()); |
309 for (int i = 0; i < control_input_count; ++i) { | 309 for (int i = 0; i < control_input_count; ++i) { |
310 // Create a new {Return} and connect it to {end}. We don't need to mark | 310 // Create a new {Return} and connect it to {end}. We don't need to mark |
311 // {end} as revisit, because we mark {node} as {Dead} below, which was | 311 // {end} as revisit, because we mark {node} as {Dead} below, which was |
312 // previously connected to {end}, so we know for sure that at some point | 312 // previously connected to {end}, so we know for sure that at some point |
313 // the reducer logic will visit {end} again. | 313 // the reducer logic will visit {end} again. |
314 Node* ret = graph()->NewNode(common()->Return(), value->InputAt(i), | 314 Node* ret = graph()->NewNode(common()->Return(), node->InputAt(0), |
315 effect->InputAt(i), control->InputAt(i)); | 315 value->InputAt(i), effect->InputAt(i), |
| 316 control->InputAt(i)); |
316 NodeProperties::MergeControlToEnd(graph(), common(), ret); | 317 NodeProperties::MergeControlToEnd(graph(), common(), ret); |
317 } | 318 } |
318 // Mark the merge {control} and return {node} as {dead}. | 319 // Mark the merge {control} and return {node} as {dead}. |
319 Replace(control, dead()); | 320 Replace(control, dead()); |
320 return Replace(dead()); | 321 return Replace(dead()); |
321 } | 322 } |
322 return changed ? Changed(node) : NoChange(); | 323 return changed ? Changed(node) : NoChange(); |
323 } | 324 } |
324 | 325 |
325 | 326 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 node->ReplaceInput(0, a); | 382 node->ReplaceInput(0, a); |
382 node->ReplaceInput(1, b); | 383 node->ReplaceInput(1, b); |
383 node->TrimInputCount(2); | 384 node->TrimInputCount(2); |
384 NodeProperties::ChangeOp(node, op); | 385 NodeProperties::ChangeOp(node, op); |
385 return Changed(node); | 386 return Changed(node); |
386 } | 387 } |
387 | 388 |
388 } // namespace compiler | 389 } // namespace compiler |
389 } // namespace internal | 390 } // namespace internal |
390 } // namespace v8 | 391 } // namespace v8 |
OLD | NEW |