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/simplified-lowering.h" | 5 #include "src/compiler/simplified-lowering.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 : jsgraph_(jsgraph), | 69 : jsgraph_(jsgraph), |
70 count_(jsgraph->graph()->NodeCount()), | 70 count_(jsgraph->graph()->NodeCount()), |
71 info_(zone->NewArray<NodeInfo>(count_)), | 71 info_(zone->NewArray<NodeInfo>(count_)), |
72 nodes_(zone), | 72 nodes_(zone), |
73 replacements_(zone), | 73 replacements_(zone), |
74 phase_(PROPAGATE), | 74 phase_(PROPAGATE), |
75 changer_(changer), | 75 changer_(changer), |
76 queue_(zone) { | 76 queue_(zone) { |
77 memset(info_, 0, sizeof(NodeInfo) * count_); | 77 memset(info_, 0, sizeof(NodeInfo) * count_); |
78 | 78 |
79 Factory* f = zone->isolate()->factory(); | 79 Factory* f = jsgraph->isolate()->factory(); |
80 safe_int_additive_range_ = | 80 safe_int_additive_range_ = |
81 Type::Range(f->NewNumber(-std::pow(2.0, 52.0)), | 81 Type::Range(f->NewNumber(-std::pow(2.0, 52.0)), |
82 f->NewNumber(std::pow(2.0, 52.0)), zone); | 82 f->NewNumber(std::pow(2.0, 52.0)), zone); |
83 } | 83 } |
84 | 84 |
85 void Run(SimplifiedLowering* lowering) { | 85 void Run(SimplifiedLowering* lowering) { |
86 // Run propagation phase to a fixpoint. | 86 // Run propagation phase to a fixpoint. |
87 TRACE(("--{Propagation phase}--\n")); | 87 TRACE(("--{Propagation phase}--\n")); |
88 phase_ = PROPAGATE; | 88 phase_ = PROPAGATE; |
89 Enqueue(jsgraph_->graph()->end()); | 89 Enqueue(jsgraph_->graph()->end()); |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 //------------------------------------------------------------------ | 523 //------------------------------------------------------------------ |
524 case IrOpcode::kAnyToBoolean: { | 524 case IrOpcode::kAnyToBoolean: { |
525 VisitUnop(node, kMachAnyTagged, kTypeBool | kRepTagged); | 525 VisitUnop(node, kMachAnyTagged, kTypeBool | kRepTagged); |
526 if (lower()) { | 526 if (lower()) { |
527 // AnyToBoolean(x) => Call(ToBooleanStub, x, no-context) | 527 // AnyToBoolean(x) => Call(ToBooleanStub, x, no-context) |
528 Operator::Properties properties = node->op()->properties(); | 528 Operator::Properties properties = node->op()->properties(); |
529 Callable callable = CodeFactory::ToBoolean( | 529 Callable callable = CodeFactory::ToBoolean( |
530 jsgraph_->isolate(), ToBooleanStub::RESULT_AS_ODDBALL); | 530 jsgraph_->isolate(), ToBooleanStub::RESULT_AS_ODDBALL); |
531 CallDescriptor::Flags flags = CallDescriptor::kPatchableCallSite; | 531 CallDescriptor::Flags flags = CallDescriptor::kPatchableCallSite; |
532 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 532 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
533 callable.descriptor(), 0, flags, properties, jsgraph_->zone()); | 533 jsgraph_->isolate(), jsgraph_->zone(), callable.descriptor(), 0, |
| 534 flags, properties); |
534 node->set_op(jsgraph_->common()->Call(desc)); | 535 node->set_op(jsgraph_->common()->Call(desc)); |
535 node->InsertInput(jsgraph_->zone(), 0, | 536 node->InsertInput(jsgraph_->zone(), 0, |
536 jsgraph_->HeapConstant(callable.code())); | 537 jsgraph_->HeapConstant(callable.code())); |
537 node->AppendInput(jsgraph_->zone(), jsgraph_->NoContextConstant()); | 538 node->AppendInput(jsgraph_->zone(), jsgraph_->NoContextConstant()); |
538 } | 539 } |
539 break; | 540 break; |
540 } | 541 } |
541 case IrOpcode::kBooleanNot: { | 542 case IrOpcode::kBooleanNot: { |
542 if (lower()) { | 543 if (lower()) { |
543 MachineTypeUnion input = GetInfo(node->InputAt(0))->output; | 544 MachineTypeUnion input = GetInfo(node->InputAt(0))->output; |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 break; | 734 break; |
734 } | 735 } |
735 case IrOpcode::kPlainPrimitiveToNumber: { | 736 case IrOpcode::kPlainPrimitiveToNumber: { |
736 VisitUnop(node, kMachAnyTagged, kTypeNumber | kRepTagged); | 737 VisitUnop(node, kMachAnyTagged, kTypeNumber | kRepTagged); |
737 if (lower()) { | 738 if (lower()) { |
738 // PlainPrimitiveToNumber(x) => Call(ToNumberStub, x, no-context) | 739 // PlainPrimitiveToNumber(x) => Call(ToNumberStub, x, no-context) |
739 Operator::Properties properties = node->op()->properties(); | 740 Operator::Properties properties = node->op()->properties(); |
740 Callable callable = CodeFactory::ToNumber(jsgraph_->isolate()); | 741 Callable callable = CodeFactory::ToNumber(jsgraph_->isolate()); |
741 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; | 742 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; |
742 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 743 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
743 callable.descriptor(), 0, flags, properties, jsgraph_->zone()); | 744 jsgraph_->isolate(), jsgraph_->zone(), callable.descriptor(), 0, |
| 745 flags, properties); |
744 node->set_op(jsgraph_->common()->Call(desc)); | 746 node->set_op(jsgraph_->common()->Call(desc)); |
745 node->InsertInput(jsgraph_->zone(), 0, | 747 node->InsertInput(jsgraph_->zone(), 0, |
746 jsgraph_->HeapConstant(callable.code())); | 748 jsgraph_->HeapConstant(callable.code())); |
747 node->AppendInput(jsgraph_->zone(), jsgraph_->NoContextConstant()); | 749 node->AppendInput(jsgraph_->zone(), jsgraph_->NoContextConstant()); |
748 } | 750 } |
749 break; | 751 break; |
750 } | 752 } |
751 case IrOpcode::kReferenceEqual: { | 753 case IrOpcode::kReferenceEqual: { |
752 VisitBinop(node, kMachAnyTagged, kRepBit); | 754 VisitBinop(node, kMachAnyTagged, kRepBit); |
753 if (lower()) node->set_op(lowering->machine()->WordEqual()); | 755 if (lower()) node->set_op(lowering->machine()->WordEqual()); |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1082 Node* SimplifiedLowering::IsTagged(Node* node) { | 1084 Node* SimplifiedLowering::IsTagged(Node* node) { |
1083 // TODO(titzer): factor this out to a TaggingScheme abstraction. | 1085 // TODO(titzer): factor this out to a TaggingScheme abstraction. |
1084 STATIC_ASSERT(kSmiTagMask == 1); // Only works if tag is the low bit. | 1086 STATIC_ASSERT(kSmiTagMask == 1); // Only works if tag is the low bit. |
1085 return graph()->NewNode(machine()->WordAnd(), node, | 1087 return graph()->NewNode(machine()->WordAnd(), node, |
1086 jsgraph()->Int32Constant(kSmiTagMask)); | 1088 jsgraph()->Int32Constant(kSmiTagMask)); |
1087 } | 1089 } |
1088 | 1090 |
1089 | 1091 |
1090 void SimplifiedLowering::LowerAllNodes() { | 1092 void SimplifiedLowering::LowerAllNodes() { |
1091 SimplifiedOperatorBuilder simplified(graph()->zone()); | 1093 SimplifiedOperatorBuilder simplified(graph()->zone()); |
1092 RepresentationChanger changer(jsgraph(), &simplified, | 1094 RepresentationChanger changer(jsgraph(), &simplified, jsgraph()->isolate()); |
1093 graph()->zone()->isolate()); | |
1094 RepresentationSelector selector(jsgraph(), zone_, &changer); | 1095 RepresentationSelector selector(jsgraph(), zone_, &changer); |
1095 selector.Run(this); | 1096 selector.Run(this); |
1096 } | 1097 } |
1097 | 1098 |
1098 | 1099 |
1099 Node* SimplifiedLowering::Untag(Node* node) { | 1100 Node* SimplifiedLowering::Untag(Node* node) { |
1100 // TODO(titzer): factor this out to a TaggingScheme abstraction. | 1101 // TODO(titzer): factor this out to a TaggingScheme abstraction. |
1101 Node* shift_amount = jsgraph()->Int32Constant(kSmiTagSize + kSmiShiftSize); | 1102 Node* shift_amount = jsgraph()->Int32Constant(kSmiTagSize + kSmiShiftSize); |
1102 return graph()->NewNode(machine()->WordSar(), node, shift_amount); | 1103 return graph()->NewNode(machine()->WordSar(), node, shift_amount); |
1103 } | 1104 } |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1248 access.machine_type, | 1249 access.machine_type, |
1249 ComputeWriteBarrierKind(access.base_is_tagged, access.machine_type, | 1250 ComputeWriteBarrierKind(access.base_is_tagged, access.machine_type, |
1250 access.type)))); | 1251 access.type)))); |
1251 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); | 1252 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); |
1252 } | 1253 } |
1253 | 1254 |
1254 | 1255 |
1255 void SimplifiedLowering::DoStringAdd(Node* node) { | 1256 void SimplifiedLowering::DoStringAdd(Node* node) { |
1256 Operator::Properties properties = node->op()->properties(); | 1257 Operator::Properties properties = node->op()->properties(); |
1257 Callable callable = CodeFactory::StringAdd( | 1258 Callable callable = CodeFactory::StringAdd( |
1258 zone()->isolate(), STRING_ADD_CHECK_NONE, NOT_TENURED); | 1259 jsgraph()->isolate(), STRING_ADD_CHECK_NONE, NOT_TENURED); |
1259 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; | 1260 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; |
1260 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 1261 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
1261 callable.descriptor(), 0, flags, properties, zone()); | 1262 jsgraph()->isolate(), zone(), callable.descriptor(), 0, flags, |
| 1263 properties); |
1262 node->set_op(common()->Call(desc)); | 1264 node->set_op(common()->Call(desc)); |
1263 node->InsertInput(graph()->zone(), 0, | 1265 node->InsertInput(graph()->zone(), 0, |
1264 jsgraph()->HeapConstant(callable.code())); | 1266 jsgraph()->HeapConstant(callable.code())); |
1265 node->AppendInput(graph()->zone(), jsgraph()->UndefinedConstant()); | 1267 node->AppendInput(graph()->zone(), jsgraph()->UndefinedConstant()); |
1266 node->AppendInput(graph()->zone(), graph()->start()); | 1268 node->AppendInput(graph()->zone(), graph()->start()); |
1267 node->AppendInput(graph()->zone(), graph()->start()); | 1269 node->AppendInput(graph()->zone(), graph()->start()); |
1268 } | 1270 } |
1269 | 1271 |
1270 | 1272 |
1271 Node* SimplifiedLowering::StringComparison(Node* node, bool requires_ordering) { | 1273 Node* SimplifiedLowering::StringComparison(Node* node, bool requires_ordering) { |
1272 CEntryStub stub(zone()->isolate(), 1); | 1274 CEntryStub stub(jsgraph()->isolate(), 1); |
1273 Runtime::FunctionId f = | 1275 Runtime::FunctionId f = |
1274 requires_ordering ? Runtime::kStringCompare : Runtime::kStringEquals; | 1276 requires_ordering ? Runtime::kStringCompare : Runtime::kStringEquals; |
1275 ExternalReference ref(f, zone()->isolate()); | 1277 ExternalReference ref(f, jsgraph()->isolate()); |
1276 Operator::Properties props = node->op()->properties(); | 1278 Operator::Properties props = node->op()->properties(); |
1277 // TODO(mstarzinger): We should call StringCompareStub here instead, once an | 1279 // TODO(mstarzinger): We should call StringCompareStub here instead, once an |
1278 // interface descriptor is available for it. | 1280 // interface descriptor is available for it. |
1279 CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor(f, 2, props, zone()); | 1281 CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor(zone(), f, 2, props); |
1280 return graph()->NewNode(common()->Call(desc), | 1282 return graph()->NewNode(common()->Call(desc), |
1281 jsgraph()->HeapConstant(stub.GetCode()), | 1283 jsgraph()->HeapConstant(stub.GetCode()), |
1282 NodeProperties::GetValueInput(node, 0), | 1284 NodeProperties::GetValueInput(node, 0), |
1283 NodeProperties::GetValueInput(node, 1), | 1285 NodeProperties::GetValueInput(node, 1), |
1284 jsgraph()->ExternalConstant(ref), | 1286 jsgraph()->ExternalConstant(ref), |
1285 jsgraph()->Int32Constant(2), | 1287 jsgraph()->Int32Constant(2), |
1286 jsgraph()->UndefinedConstant()); | 1288 jsgraph()->UndefinedConstant()); |
1287 } | 1289 } |
1288 | 1290 |
1289 | 1291 |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1510 | 1512 |
1511 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { | 1513 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { |
1512 node->set_op(machine()->IntLessThanOrEqual()); | 1514 node->set_op(machine()->IntLessThanOrEqual()); |
1513 node->ReplaceInput(0, StringComparison(node, true)); | 1515 node->ReplaceInput(0, StringComparison(node, true)); |
1514 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); | 1516 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); |
1515 } | 1517 } |
1516 | 1518 |
1517 } // namespace compiler | 1519 } // namespace compiler |
1518 } // namespace internal | 1520 } // namespace internal |
1519 } // namespace v8 | 1521 } // namespace v8 |
OLD | NEW |