| 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/code-factory.h" | 5 #include "src/code-factory.h" | 
| 6 #include "src/compilation-dependencies.h" | 6 #include "src/compilation-dependencies.h" | 
| 7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" | 
| 8 #include "src/compiler/js-graph.h" | 8 #include "src/compiler/js-graph.h" | 
| 9 #include "src/compiler/js-typed-lowering.h" | 9 #include "src/compiler/js-typed-lowering.h" | 
| 10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" | 
| (...skipping 1214 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1225                NodeProperties::GetValueInput(node, 0), effect, control)); | 1225                NodeProperties::GetValueInput(node, 0), effect, control)); | 
| 1226   } | 1226   } | 
| 1227   node->RemoveInput(2); | 1227   node->RemoveInput(2); | 
| 1228   NodeProperties::ChangeOp( | 1228   NodeProperties::ChangeOp( | 
| 1229       node, | 1229       node, | 
| 1230       simplified()->StoreField(AccessBuilder::ForContextSlot(access.index()))); | 1230       simplified()->StoreField(AccessBuilder::ForContextSlot(access.index()))); | 
| 1231   return Changed(node); | 1231   return Changed(node); | 
| 1232 } | 1232 } | 
| 1233 | 1233 | 
| 1234 | 1234 | 
|  | 1235 Reduction JSTypedLowering::ReduceJSLoadNativeContext(Node* node) { | 
|  | 1236   DCHECK_EQ(IrOpcode::kJSLoadNativeContext, node->opcode()); | 
|  | 1237   Node* const effect = NodeProperties::GetEffectInput(node); | 
|  | 1238   Node* const control = graph()->start(); | 
|  | 1239   node->ReplaceInput(1, effect); | 
|  | 1240   node->ReplaceInput(2, control); | 
|  | 1241   NodeProperties::ChangeOp( | 
|  | 1242       node, | 
|  | 1243       simplified()->LoadField(AccessBuilder::ForJSGlobalObjectNativeContext())); | 
|  | 1244   return Changed(node); | 
|  | 1245 } | 
|  | 1246 | 
|  | 1247 | 
| 1235 Reduction JSTypedLowering::ReduceJSConvertReceiver(Node* node) { | 1248 Reduction JSTypedLowering::ReduceJSConvertReceiver(Node* node) { | 
| 1236   DCHECK_EQ(IrOpcode::kJSConvertReceiver, node->opcode()); | 1249   DCHECK_EQ(IrOpcode::kJSConvertReceiver, node->opcode()); | 
| 1237   ConvertReceiverMode mode = ConvertReceiverModeOf(node->op()); | 1250   ConvertReceiverMode mode = ConvertReceiverModeOf(node->op()); | 
| 1238   Node* receiver = NodeProperties::GetValueInput(node, 0); | 1251   Node* receiver = NodeProperties::GetValueInput(node, 0); | 
| 1239   Type* receiver_type = NodeProperties::GetType(receiver); | 1252   Type* receiver_type = NodeProperties::GetType(receiver); | 
| 1240   Node* context = NodeProperties::GetContextInput(node); | 1253   Node* context = NodeProperties::GetContextInput(node); | 
| 1241   Type* context_type = NodeProperties::GetType(context); | 1254   Type* context_type = NodeProperties::GetType(context); | 
| 1242   Node* frame_state = NodeProperties::GetFrameStateInput(node, 0); | 1255   Node* frame_state = NodeProperties::GetFrameStateInput(node, 0); | 
| 1243   Node* effect = NodeProperties::GetEffectInput(node); | 1256   Node* effect = NodeProperties::GetEffectInput(node); | 
| 1244   Node* control = NodeProperties::GetControlInput(node); | 1257   Node* control = NodeProperties::GetControlInput(node); | 
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1537     a.Store(AccessBuilder::ForArgumentsLength(), jsgraph()->Constant(length)); | 1550     a.Store(AccessBuilder::ForArgumentsLength(), jsgraph()->Constant(length)); | 
| 1538     RelaxControls(node); | 1551     RelaxControls(node); | 
| 1539     a.FinishAndChange(node); | 1552     a.FinishAndChange(node); | 
| 1540     return Changed(node); | 1553     return Changed(node); | 
| 1541   } | 1554   } | 
| 1542 | 1555 | 
| 1543   return NoChange(); | 1556   return NoChange(); | 
| 1544 } | 1557 } | 
| 1545 | 1558 | 
| 1546 | 1559 | 
|  | 1560 Reduction JSTypedLowering::ReduceJSCreateArray(Node* node) { | 
|  | 1561   DCHECK_EQ(IrOpcode::kJSCreateArray, node->opcode()); | 
|  | 1562   CreateArrayParameters const& p = CreateArrayParametersOf(node->op()); | 
|  | 1563   Node* const target = NodeProperties::GetValueInput(node, 0); | 
|  | 1564   Node* const new_target = NodeProperties::GetValueInput(node, 1); | 
|  | 1565 | 
|  | 1566   // TODO(bmeurer): Optimize the subclassing case. | 
|  | 1567   if (target != new_target) return NoChange(); | 
|  | 1568 | 
|  | 1569   // Check if we have a feedback {site} on the {node}. | 
|  | 1570   Handle<AllocationSite> site; | 
|  | 1571   if (!p.site().ToHandle(&site)) return NoChange(); | 
|  | 1572   ElementsKind const elements_kind = site->GetElementsKind(); | 
|  | 1573   AllocationSiteOverrideMode override_mode = | 
|  | 1574       (AllocationSite::GetMode(elements_kind) == TRACK_ALLOCATION_SITE) | 
|  | 1575           ? DISABLE_ALLOCATION_SITES | 
|  | 1576           : DONT_OVERRIDE; | 
|  | 1577 | 
|  | 1578   // Reduce {node} to the appropriate ArrayConstructorStub backend. | 
|  | 1579   // Note that these stubs "behave" like JSFunctions, which means they | 
|  | 1580   // expect a receiver on the stack, which they remove. We just push | 
|  | 1581   // undefined for the receiver. | 
|  | 1582   if (p.arity() == 0) { | 
|  | 1583     ArrayNoArgumentConstructorStub stub(isolate(), elements_kind, | 
|  | 1584                                         override_mode); | 
|  | 1585     CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 
|  | 1586         isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 1, | 
|  | 1587         CallDescriptor::kNeedsFrameState); | 
|  | 1588     node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode())); | 
|  | 1589     node->InsertInput(graph()->zone(), 2, jsgraph()->UndefinedConstant()); | 
|  | 1590     node->InsertInput(graph()->zone(), 3, jsgraph()->UndefinedConstant()); | 
|  | 1591     NodeProperties::ChangeOp(node, common()->Call(desc)); | 
|  | 1592     return Changed(node); | 
|  | 1593   } else if (p.arity() == 1) { | 
|  | 1594     // TODO(bmeurer): Optimize for the 0 length non-holey case? | 
|  | 1595     ArraySingleArgumentConstructorStub stub( | 
|  | 1596         isolate(), GetHoleyElementsKind(elements_kind), override_mode); | 
|  | 1597     CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 
|  | 1598         isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), 2, | 
|  | 1599         CallDescriptor::kNeedsFrameState); | 
|  | 1600     node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode())); | 
|  | 1601     node->InsertInput(graph()->zone(), 2, jsgraph()->HeapConstant(site)); | 
|  | 1602     node->InsertInput(graph()->zone(), 3, jsgraph()->Int32Constant(1)); | 
|  | 1603     node->InsertInput(graph()->zone(), 4, jsgraph()->UndefinedConstant()); | 
|  | 1604     NodeProperties::ChangeOp(node, common()->Call(desc)); | 
|  | 1605     return Changed(node); | 
|  | 1606   } else { | 
|  | 1607     int const arity = static_cast<int>(p.arity()); | 
|  | 1608     ArrayNArgumentsConstructorStub stub(isolate(), elements_kind, | 
|  | 1609                                         override_mode); | 
|  | 1610     CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 
|  | 1611         isolate(), graph()->zone(), stub.GetCallInterfaceDescriptor(), | 
|  | 1612         arity + 1, CallDescriptor::kNeedsFrameState); | 
|  | 1613     node->ReplaceInput(0, jsgraph()->HeapConstant(stub.GetCode())); | 
|  | 1614     node->InsertInput(graph()->zone(), 2, jsgraph()->UndefinedConstant()); | 
|  | 1615     node->InsertInput(graph()->zone(), 3, jsgraph()->Int32Constant(arity)); | 
|  | 1616     node->InsertInput(graph()->zone(), 4, jsgraph()->UndefinedConstant()); | 
|  | 1617     NodeProperties::ChangeOp(node, common()->Call(desc)); | 
|  | 1618     return Changed(node); | 
|  | 1619   } | 
|  | 1620 } | 
|  | 1621 | 
|  | 1622 | 
| 1547 Reduction JSTypedLowering::ReduceJSCreateClosure(Node* node) { | 1623 Reduction JSTypedLowering::ReduceJSCreateClosure(Node* node) { | 
| 1548   DCHECK_EQ(IrOpcode::kJSCreateClosure, node->opcode()); | 1624   DCHECK_EQ(IrOpcode::kJSCreateClosure, node->opcode()); | 
| 1549   CreateClosureParameters const& p = CreateClosureParametersOf(node->op()); | 1625   CreateClosureParameters const& p = CreateClosureParametersOf(node->op()); | 
| 1550   Handle<SharedFunctionInfo> shared = p.shared_info(); | 1626   Handle<SharedFunctionInfo> shared = p.shared_info(); | 
| 1551 | 1627 | 
| 1552   // Use the FastNewClosureStub that allocates in new space only for nested | 1628   // Use the FastNewClosureStub that allocates in new space only for nested | 
| 1553   // functions that don't need literals cloning. | 1629   // functions that don't need literals cloning. | 
| 1554   if (p.pretenure() == NOT_TENURED && shared->num_literals() == 0) { | 1630   if (p.pretenure() == NOT_TENURED && shared->num_literals() == 0) { | 
| 1555     Isolate* isolate = jsgraph()->isolate(); | 1631     Isolate* isolate = jsgraph()->isolate(); | 
| 1556     Callable callable = CodeFactory::FastNewClosure( | 1632     Callable callable = CodeFactory::FastNewClosure( | 
| (...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2233     case IrOpcode::kJSLoadProperty: | 2309     case IrOpcode::kJSLoadProperty: | 
| 2234       return ReduceJSLoadProperty(node); | 2310       return ReduceJSLoadProperty(node); | 
| 2235     case IrOpcode::kJSStoreProperty: | 2311     case IrOpcode::kJSStoreProperty: | 
| 2236       return ReduceJSStoreProperty(node); | 2312       return ReduceJSStoreProperty(node); | 
| 2237     case IrOpcode::kJSInstanceOf: | 2313     case IrOpcode::kJSInstanceOf: | 
| 2238       return ReduceJSInstanceOf(node); | 2314       return ReduceJSInstanceOf(node); | 
| 2239     case IrOpcode::kJSLoadContext: | 2315     case IrOpcode::kJSLoadContext: | 
| 2240       return ReduceJSLoadContext(node); | 2316       return ReduceJSLoadContext(node); | 
| 2241     case IrOpcode::kJSStoreContext: | 2317     case IrOpcode::kJSStoreContext: | 
| 2242       return ReduceJSStoreContext(node); | 2318       return ReduceJSStoreContext(node); | 
|  | 2319     case IrOpcode::kJSLoadNativeContext: | 
|  | 2320       return ReduceJSLoadNativeContext(node); | 
| 2243     case IrOpcode::kJSConvertReceiver: | 2321     case IrOpcode::kJSConvertReceiver: | 
| 2244       return ReduceJSConvertReceiver(node); | 2322       return ReduceJSConvertReceiver(node); | 
| 2245     case IrOpcode::kJSCreate: | 2323     case IrOpcode::kJSCreate: | 
| 2246       return ReduceJSCreate(node); | 2324       return ReduceJSCreate(node); | 
| 2247     case IrOpcode::kJSCreateArguments: | 2325     case IrOpcode::kJSCreateArguments: | 
| 2248       return ReduceJSCreateArguments(node); | 2326       return ReduceJSCreateArguments(node); | 
|  | 2327     case IrOpcode::kJSCreateArray: | 
|  | 2328       return ReduceJSCreateArray(node); | 
| 2249     case IrOpcode::kJSCreateClosure: | 2329     case IrOpcode::kJSCreateClosure: | 
| 2250       return ReduceJSCreateClosure(node); | 2330       return ReduceJSCreateClosure(node); | 
| 2251     case IrOpcode::kJSCreateLiteralArray: | 2331     case IrOpcode::kJSCreateLiteralArray: | 
| 2252       return ReduceJSCreateLiteralArray(node); | 2332       return ReduceJSCreateLiteralArray(node); | 
| 2253     case IrOpcode::kJSCreateLiteralObject: | 2333     case IrOpcode::kJSCreateLiteralObject: | 
| 2254       return ReduceJSCreateLiteralObject(node); | 2334       return ReduceJSCreateLiteralObject(node); | 
| 2255     case IrOpcode::kJSCreateFunctionContext: | 2335     case IrOpcode::kJSCreateFunctionContext: | 
| 2256       return ReduceJSCreateFunctionContext(node); | 2336       return ReduceJSCreateFunctionContext(node); | 
| 2257     case IrOpcode::kJSCreateWithContext: | 2337     case IrOpcode::kJSCreateWithContext: | 
| 2258       return ReduceJSCreateWithContext(node); | 2338       return ReduceJSCreateWithContext(node); | 
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2386 } | 2466 } | 
| 2387 | 2467 | 
| 2388 | 2468 | 
| 2389 CompilationDependencies* JSTypedLowering::dependencies() const { | 2469 CompilationDependencies* JSTypedLowering::dependencies() const { | 
| 2390   return dependencies_; | 2470   return dependencies_; | 
| 2391 } | 2471 } | 
| 2392 | 2472 | 
| 2393 }  // namespace compiler | 2473 }  // namespace compiler | 
| 2394 }  // namespace internal | 2474 }  // namespace internal | 
| 2395 }  // namespace v8 | 2475 }  // namespace v8 | 
| OLD | NEW | 
|---|