Chromium Code Reviews| Index: src/compiler/js-intrinsic-lowering.cc |
| diff --git a/src/compiler/js-intrinsic-lowering.cc b/src/compiler/js-intrinsic-lowering.cc |
| index f7504a78939f78a48e2866f17e2e4752535aaf50..3f559b5b01de1768e1441613285db60ebbe92280 100644 |
| --- a/src/compiler/js-intrinsic-lowering.cc |
| +++ b/src/compiler/js-intrinsic-lowering.cc |
| @@ -6,13 +6,16 @@ |
| #include <stack> |
| +#include "src/code-factory.h" |
| #include "src/compiler/access-builder.h" |
| #include "src/compiler/js-graph.h" |
| +#include "src/compiler/linkage.h" |
| #include "src/compiler/node-matchers.h" |
| #include "src/compiler/node-properties.h" |
| #include "src/compiler/operator-properties.h" |
| #include "src/counters.h" |
| #include "src/objects-inl.h" |
| +#include "src/type-cache.h" |
| namespace v8 { |
| namespace internal { |
| @@ -20,7 +23,10 @@ namespace compiler { |
| JSIntrinsicLowering::JSIntrinsicLowering(Editor* editor, JSGraph* jsgraph, |
| DeoptimizationMode mode) |
| - : AdvancedReducer(editor), jsgraph_(jsgraph), mode_(mode) {} |
| + : AdvancedReducer(editor), |
| + jsgraph_(jsgraph), |
| + mode_(mode), |
| + type_cache_(TypeCache::Get()) {} |
| Reduction JSIntrinsicLowering::Reduce(Node* node) { |
| @@ -91,8 +97,20 @@ Reduction JSIntrinsicLowering::Reduce(Node* node) { |
| return ReduceGetTypeFeedbackVector(node); |
| case Runtime::kInlineGetCallerJSFunction: |
| return ReduceGetCallerJSFunction(node); |
| + case Runtime::kInlineToInteger: |
| + return ReduceToInteger(node); |
| + case Runtime::kInlineToLength: |
| + return ReduceToLength(node); |
| + case Runtime::kInlineToName: |
| + return ReduceToName(node); |
| + case Runtime::kInlineToNumber: |
| + return ReduceToNumber(node); |
| case Runtime::kInlineToObject: |
| return ReduceToObject(node); |
| + case Runtime::kInlineToPrimitive: |
| + return ReduceToPrimitive(node); |
| + case Runtime::kInlineToString: |
| + return ReduceToString(node); |
| case Runtime::kInlineThrowNotDateError: |
| return ReduceThrowNotDateError(node); |
| case Runtime::kInlineCallFunction: |
| @@ -523,12 +541,95 @@ Reduction JSIntrinsicLowering::ReduceThrowNotDateError(Node* node) { |
| } |
| +Reduction JSIntrinsicLowering::ReduceToInteger(Node* node) { |
| + Node* value = NodeProperties::GetValueInput(node, 0); |
| + Type* value_type = NodeProperties::GetType(value); |
| + if (value_type->Is(type_cache().kIntegerish)) { |
| + ReplaceWithValue(node, value); |
| + return Replace(value); |
| + } |
| + return NoChange(); |
| +} |
| + |
| + |
| +Reduction JSIntrinsicLowering::ReduceToName(Node* node) { |
| + NodeProperties::ChangeOp(node, javascript()->ToName()); |
| + return Changed(node); |
| +} |
| + |
| + |
| +Reduction JSIntrinsicLowering::ReduceToNumber(Node* node) { |
| + NodeProperties::ChangeOp(node, javascript()->ToNumber()); |
| + return Changed(node); |
| +} |
| + |
| + |
| +Reduction JSIntrinsicLowering::ReduceToLength(Node* node) { |
| + Node* value = NodeProperties::GetValueInput(node, 0); |
| + Type* value_type = NodeProperties::GetType(value); |
| + if (value_type->Is(type_cache().kIntegerish)) { |
| + if (value_type->Max() <= 0.0) { |
| + value = jsgraph()->ZeroConstant(); |
| + } else if (value_type->Min() >= kMaxSafeInteger) { |
| + value = jsgraph()->Constant(kMaxSafeInteger); |
| + } else { |
| + if (value_type->Min() <= 0.0) { |
| + value = graph()->NewNode( |
| + common()->Select(kMachAnyTagged), |
| + graph()->NewNode(simplified()->NumberLessThanOrEqual(), value, |
| + jsgraph()->ZeroConstant()), |
| + jsgraph()->ZeroConstant(), value); |
| + value_type = Type::Range(0.0, value_type->Max(), graph()->zone()); |
| + NodeProperties::SetType(value, value_type); |
|
Jarin
2015/11/05 09:25:29
Ouch. I am wondering whether we will want to have
|
| + } |
| + if (value_type->Max() > kMaxSafeInteger) { |
| + value = graph()->NewNode( |
| + common()->Select(kMachAnyTagged), |
| + graph()->NewNode(simplified()->NumberLessThanOrEqual(), |
| + jsgraph()->Constant(kMaxSafeInteger), value), |
| + jsgraph()->Constant(kMaxSafeInteger), value); |
| + value_type = |
| + Type::Range(value_type->Min(), kMaxSafeInteger, graph()->zone()); |
| + NodeProperties::SetType(value, value_type); |
| + } |
| + } |
| + ReplaceWithValue(node, value); |
| + return Replace(value); |
| + } |
| + Callable callable = CodeFactory::ToLength(isolate()); |
| + CallDescriptor const* const desc = Linkage::GetStubCallDescriptor( |
| + isolate(), graph()->zone(), callable.descriptor(), 0, |
| + CallDescriptor::kNeedsFrameState, node->op()->properties()); |
| + node->InsertInput(graph()->zone(), 0, |
| + jsgraph()->HeapConstant(callable.code())); |
| + NodeProperties::ChangeOp(node, common()->Call(desc)); |
| + return Changed(node); |
| +} |
| + |
| + |
| Reduction JSIntrinsicLowering::ReduceToObject(Node* node) { |
| NodeProperties::ChangeOp(node, javascript()->ToObject()); |
| return Changed(node); |
| } |
| +Reduction JSIntrinsicLowering::ReduceToPrimitive(Node* node) { |
| + Node* value = NodeProperties::GetValueInput(node, 0); |
| + Type* value_type = NodeProperties::GetType(value); |
| + if (value_type->Is(Type::Primitive())) { |
| + ReplaceWithValue(node, value); |
| + return Replace(value); |
| + } |
| + return NoChange(); |
| +} |
| + |
| + |
| +Reduction JSIntrinsicLowering::ReduceToString(Node* node) { |
| + NodeProperties::ChangeOp(node, javascript()->ToString()); |
| + return Changed(node); |
| +} |
| + |
| + |
| Reduction JSIntrinsicLowering::ReduceCallFunction(Node* node) { |
| CallRuntimeParameters params = CallRuntimeParametersOf(node->op()); |
| size_t arity = params.arity(); |
| @@ -591,6 +692,9 @@ Reduction JSIntrinsicLowering::ChangeToUndefined(Node* node, Node* effect) { |
| Graph* JSIntrinsicLowering::graph() const { return jsgraph()->graph(); } |
| +Isolate* JSIntrinsicLowering::isolate() const { return jsgraph()->isolate(); } |
| + |
| + |
| CommonOperatorBuilder* JSIntrinsicLowering::common() const { |
| return jsgraph()->common(); |
| } |