| 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/ast.h" | 5 #include "src/ast.h" |
| 6 #include "src/ast-numbering.h" | 6 #include "src/ast-numbering.h" |
| 7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" |
| 8 #include "src/compiler/ast-graph-builder.h" | 8 #include "src/compiler/ast-graph-builder.h" |
| 9 #include "src/compiler/common-operator.h" | 9 #include "src/compiler/common-operator.h" |
| 10 #include "src/compiler/generic-node-inl.h" | 10 #include "src/compiler/generic-node-inl.h" |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 void Inlinee::UnifyReturn(JSGraph* jsgraph) { | 112 void Inlinee::UnifyReturn(JSGraph* jsgraph) { |
| 113 Graph* graph = jsgraph->graph(); | 113 Graph* graph = jsgraph->graph(); |
| 114 | 114 |
| 115 Node* final_merge = NodeProperties::GetControlInput(graph->end(), 0); | 115 Node* final_merge = NodeProperties::GetControlInput(graph->end(), 0); |
| 116 if (final_merge->opcode() == IrOpcode::kReturn) { | 116 if (final_merge->opcode() == IrOpcode::kReturn) { |
| 117 // nothing to do | 117 // nothing to do |
| 118 return; | 118 return; |
| 119 } | 119 } |
| 120 DCHECK_EQ(IrOpcode::kMerge, final_merge->opcode()); | 120 DCHECK_EQ(IrOpcode::kMerge, final_merge->opcode()); |
| 121 | 121 |
| 122 int predecessors = | 122 int predecessors = final_merge->op()->ControlInputCount(); |
| 123 OperatorProperties::GetControlInputCount(final_merge->op()); | |
| 124 | 123 |
| 125 const Operator* op_phi = jsgraph->common()->Phi(kMachAnyTagged, predecessors); | 124 const Operator* op_phi = jsgraph->common()->Phi(kMachAnyTagged, predecessors); |
| 126 const Operator* op_ephi = jsgraph->common()->EffectPhi(predecessors); | 125 const Operator* op_ephi = jsgraph->common()->EffectPhi(predecessors); |
| 127 | 126 |
| 128 NodeVector values(jsgraph->zone()); | 127 NodeVector values(jsgraph->zone()); |
| 129 NodeVector effects(jsgraph->zone()); | 128 NodeVector effects(jsgraph->zone()); |
| 130 // Iterate over all control flow predecessors, | 129 // Iterate over all control flow predecessors, |
| 131 // which must be return statements. | 130 // which must be return statements. |
| 132 InputIter iter = final_merge->inputs().begin(); | 131 InputIter iter = final_merge->inputs().begin(); |
| 133 while (iter != final_merge->inputs().end()) { | 132 while (iter != final_merge->inputs().end()) { |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 SimplifiedOperatorBuilder simplified(jsgraph->zone()); | 237 SimplifiedOperatorBuilder simplified(jsgraph->zone()); |
| 239 Node* context = jsgraph->graph()->NewNode( | 238 Node* context = jsgraph->graph()->NewNode( |
| 240 simplified.LoadField(AccessBuilder::ForJSFunctionContext()), | 239 simplified.LoadField(AccessBuilder::ForJSFunctionContext()), |
| 241 NodeProperties::GetValueInput(call, 0), | 240 NodeProperties::GetValueInput(call, 0), |
| 242 NodeProperties::GetEffectInput(call), control); | 241 NodeProperties::GetEffectInput(call), control); |
| 243 | 242 |
| 244 // Context is last argument. | 243 // Context is last argument. |
| 245 int inlinee_context_index = static_cast<int>(total_parameters()) - 1; | 244 int inlinee_context_index = static_cast<int>(total_parameters()) - 1; |
| 246 // {inliner_inputs} counts JSFunction, Receiver, arguments, but not | 245 // {inliner_inputs} counts JSFunction, Receiver, arguments, but not |
| 247 // context, effect, control. | 246 // context, effect, control. |
| 248 int inliner_inputs = OperatorProperties::GetValueInputCount(call->op()); | 247 int inliner_inputs = call->op()->ValueInputCount(); |
| 249 // Iterate over all uses of the start node. | 248 // Iterate over all uses of the start node. |
| 250 UseIter iter = start_->uses().begin(); | 249 UseIter iter = start_->uses().begin(); |
| 251 while (iter != start_->uses().end()) { | 250 while (iter != start_->uses().end()) { |
| 252 Node* use = *iter; | 251 Node* use = *iter; |
| 253 switch (use->opcode()) { | 252 switch (use->opcode()) { |
| 254 case IrOpcode::kParameter: { | 253 case IrOpcode::kParameter: { |
| 255 int index = 1 + OpParameter<int>(use->op()); | 254 int index = 1 + OpParameter<int>(use->op()); |
| 256 if (index < inliner_inputs && index < inlinee_context_index) { | 255 if (index < inliner_inputs && index < inlinee_context_index) { |
| 257 // There is an input from the call, and the index is a value | 256 // There is an input from the call, and the index is a value |
| 258 // projection but not the context, so rewire the input. | 257 // projection but not the context, so rewire the input. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 | 300 |
| 302 Node* receiver() { return call_->InputAt(1); } | 301 Node* receiver() { return call_->InputAt(1); } |
| 303 | 302 |
| 304 Node* formal_argument(size_t index) { | 303 Node* formal_argument(size_t index) { |
| 305 DCHECK(index < formal_arguments()); | 304 DCHECK(index < formal_arguments()); |
| 306 return call_->InputAt(static_cast<int>(2 + index)); | 305 return call_->InputAt(static_cast<int>(2 + index)); |
| 307 } | 306 } |
| 308 | 307 |
| 309 size_t formal_arguments() { | 308 size_t formal_arguments() { |
| 310 // {value_inputs} includes jsfunction and receiver. | 309 // {value_inputs} includes jsfunction and receiver. |
| 311 size_t value_inputs = OperatorProperties::GetValueInputCount(call_->op()); | 310 size_t value_inputs = call_->op()->ValueInputCount(); |
| 312 DCHECK_GE(call_->InputCount(), 2); | 311 DCHECK_GE(call_->InputCount(), 2); |
| 313 return value_inputs - 2; | 312 return value_inputs - 2; |
| 314 } | 313 } |
| 315 | 314 |
| 316 Node* frame_state() { return NodeProperties::GetFrameStateInput(call_); } | 315 Node* frame_state() { return NodeProperties::GetFrameStateInput(call_); } |
| 317 | 316 |
| 318 private: | 317 private: |
| 319 Node* call_; | 318 Node* call_; |
| 320 }; | 319 }; |
| 321 | 320 |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 explicit JSCallRuntimeAccessor(Node* call) : call_(call) { | 433 explicit JSCallRuntimeAccessor(Node* call) : call_(call) { |
| 435 DCHECK_EQ(IrOpcode::kJSCallRuntime, call->opcode()); | 434 DCHECK_EQ(IrOpcode::kJSCallRuntime, call->opcode()); |
| 436 } | 435 } |
| 437 | 436 |
| 438 Node* formal_argument(size_t index) { | 437 Node* formal_argument(size_t index) { |
| 439 DCHECK(index < formal_arguments()); | 438 DCHECK(index < formal_arguments()); |
| 440 return call_->InputAt(static_cast<int>(index)); | 439 return call_->InputAt(static_cast<int>(index)); |
| 441 } | 440 } |
| 442 | 441 |
| 443 size_t formal_arguments() { | 442 size_t formal_arguments() { |
| 444 size_t value_inputs = OperatorProperties::GetValueInputCount(call_->op()); | 443 size_t value_inputs = call_->op()->ValueInputCount(); |
| 445 return value_inputs; | 444 return value_inputs; |
| 446 } | 445 } |
| 447 | 446 |
| 448 Node* frame_state() const { | 447 Node* frame_state() const { |
| 449 return NodeProperties::GetFrameStateInput(call_); | 448 return NodeProperties::GetFrameStateInput(call_); |
| 450 } | 449 } |
| 451 Node* context() const { return NodeProperties::GetContextInput(call_); } | 450 Node* context() const { return NodeProperties::GetContextInput(call_); } |
| 452 Node* control() const { return NodeProperties::GetControlInput(call_); } | 451 Node* control() const { return NodeProperties::GetControlInput(call_); } |
| 453 Node* effect() const { return NodeProperties::GetEffectInput(call_); } | 452 Node* effect() const { return NodeProperties::GetEffectInput(call_); } |
| 454 | 453 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 info_->shared_info()->DebugName()->ToCString().get()); | 488 info_->shared_info()->DebugName()->ToCString().get()); |
| 490 } | 489 } |
| 491 NodeProperties::ReplaceWithValue(call_node, r.first, r.second); | 490 NodeProperties::ReplaceWithValue(call_node, r.first, r.second); |
| 492 call_node->RemoveAllInputs(); | 491 call_node->RemoveAllInputs(); |
| 493 DCHECK_EQ(0, call_node->UseCount()); | 492 DCHECK_EQ(0, call_node->UseCount()); |
| 494 } | 493 } |
| 495 } | 494 } |
| 496 } | 495 } |
| 497 } | 496 } |
| 498 } // namespace v8::internal::compiler | 497 } // namespace v8::internal::compiler |
| OLD | NEW |