| 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 | 
|---|