| 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..ab169c296c059bdefed9ac552f90457019a788fc 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().kIntegerOrMinusZero)) {
|
| + 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().kIntegerOrMinusZero)) {
|
| + 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);
|
| + }
|
| + 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();
|
| }
|
|
|