| Index: src/compiler/js-typed-lowering.cc
|
| diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
|
| index ce3ecc59d49f541a6ecbfac23335a02acdc01443..9094a662087ddb876fea4287a963d7e5ca462276 100644
|
| --- a/src/compiler/js-typed-lowering.cc
|
| +++ b/src/compiler/js-typed-lowering.cc
|
| @@ -4,7 +4,7 @@
|
|
|
| #include "src/compiler/access-builder.h"
|
| #include "src/compiler/graph-inl.h"
|
| -#include "src/compiler/js-builtin-reducer.h"
|
| +#include "src/compiler/js-graph.h"
|
| #include "src/compiler/js-typed-lowering.h"
|
| #include "src/compiler/node-aux-data-inl.h"
|
| #include "src/compiler/node-matchers.h"
|
| @@ -32,28 +32,27 @@ static void RelaxEffects(Node* node) {
|
|
|
| JSTypedLowering::JSTypedLowering(JSGraph* jsgraph)
|
| : jsgraph_(jsgraph), simplified_(jsgraph->zone()) {
|
| - Factory* factory = zone()->isolate()->factory();
|
| - Handle<Object> zero = factory->NewNumber(0.0);
|
| - Handle<Object> one = factory->NewNumber(1.0);
|
| - zero_range_ = Type::Range(zero, zero, zone());
|
| - one_range_ = Type::Range(one, one, zone());
|
| - Handle<Object> thirtyone = factory->NewNumber(31.0);
|
| - zero_thirtyone_range_ = Type::Range(zero, thirtyone, zone());
|
| + Handle<Object> zero = factory()->NewNumber(0.0);
|
| + Handle<Object> one = factory()->NewNumber(1.0);
|
| + zero_range_ = Type::Range(zero, zero, graph()->zone());
|
| + one_range_ = Type::Range(one, one, graph()->zone());
|
| + Handle<Object> thirtyone = factory()->NewNumber(31.0);
|
| + zero_thirtyone_range_ = Type::Range(zero, thirtyone, graph()->zone());
|
| // TODO(jarin): Can we have a correctification of the stupid type system?
|
| // These stupid work-arounds are just stupid!
|
| shifted_int32_ranges_[0] = Type::Signed32();
|
| if (SmiValuesAre31Bits()) {
|
| shifted_int32_ranges_[1] = Type::SignedSmall();
|
| for (size_t k = 2; k < arraysize(shifted_int32_ranges_); ++k) {
|
| - Handle<Object> min = factory->NewNumber(kMinInt / (1 << k));
|
| - Handle<Object> max = factory->NewNumber(kMaxInt / (1 << k));
|
| - shifted_int32_ranges_[k] = Type::Range(min, max, zone());
|
| + Handle<Object> min = factory()->NewNumber(kMinInt / (1 << k));
|
| + Handle<Object> max = factory()->NewNumber(kMaxInt / (1 << k));
|
| + shifted_int32_ranges_[k] = Type::Range(min, max, graph()->zone());
|
| }
|
| } else {
|
| for (size_t k = 1; k < arraysize(shifted_int32_ranges_); ++k) {
|
| - Handle<Object> min = factory->NewNumber(kMinInt / (1 << k));
|
| - Handle<Object> max = factory->NewNumber(kMaxInt / (1 << k));
|
| - shifted_int32_ranges_[k] = Type::Range(min, max, zone());
|
| + Handle<Object> min = factory()->NewNumber(kMinInt / (1 << k));
|
| + Handle<Object> max = factory()->NewNumber(kMaxInt / (1 << k));
|
| + shifted_int32_ranges_[k] = Type::Range(min, max, graph()->zone());
|
| }
|
| }
|
| }
|
| @@ -69,7 +68,7 @@ Reduction JSTypedLowering::ReplaceEagerly(Node* old, Node* node) {
|
| // JSOperator. This class manages the rewriting of context, control, and effect
|
| // dependencies during lowering of a binop and contains numerous helper
|
| // functions for matching the types of inputs to an operation.
|
| -class JSBinopReduction {
|
| +class JSBinopReduction FINAL {
|
| public:
|
| JSBinopReduction(JSTypedLowering* lowering, Node* node)
|
| : lowering_(lowering),
|
| @@ -82,9 +81,10 @@ class JSBinopReduction {
|
| node_->ReplaceInput(1, ConvertToNumber(right()));
|
| }
|
|
|
| - void ConvertInputsToInt32(bool left_signed, bool right_signed) {
|
| - node_->ReplaceInput(0, ConvertToI32(left_signed, left()));
|
| - node_->ReplaceInput(1, ConvertToI32(right_signed, right()));
|
| + void ConvertInputsToUI32(Signedness left_signedness,
|
| + Signedness right_signedness) {
|
| + node_->ReplaceInput(0, ConvertToUI32(left(), left_signedness));
|
| + node_->ReplaceInput(1, ConvertToUI32(right(), right_signedness));
|
| }
|
|
|
| void ConvertInputsToString() {
|
| @@ -93,9 +93,9 @@ class JSBinopReduction {
|
| }
|
|
|
| // Convert inputs for bitwise shift operation (ES5 spec 11.7).
|
| - void ConvertInputsForShift(bool left_signed) {
|
| - node_->ReplaceInput(0, ConvertToI32(left_signed, left()));
|
| - Node* rnum = ConvertToI32(false, right());
|
| + void ConvertInputsForShift(Signedness left_signedness) {
|
| + node_->ReplaceInput(0, ConvertToUI32(left(), left_signedness));
|
| + Node* rnum = ConvertToUI32(right(), kUnsigned);
|
| Type* rnum_type = NodeProperties::GetBounds(rnum).upper;
|
| if (!rnum_type->Is(lowering_->zero_thirtyone_range_)) {
|
| rnum = graph()->NewNode(machine()->Word32And(), rnum,
|
| @@ -205,18 +205,21 @@ class JSBinopReduction {
|
| return n;
|
| }
|
|
|
| - Node* ConvertToI32(bool is_signed, Node* node) {
|
| + Node* ConvertToUI32(Node* node, Signedness signedness) {
|
| // Avoid introducing too many eager NumberToXXnt32() operations.
|
| node = ConvertToNumber(node);
|
| - Type* type = is_signed ? Type::Signed32() : Type::Unsigned32();
|
| - Type* input_type = NodeProperties::GetBounds(node).upper;
|
| -
|
| - if (input_type->Is(type)) return node; // already in the value range.
|
| -
|
| - const Operator* op = is_signed ? simplified()->NumberToInt32()
|
| - : simplified()->NumberToUint32();
|
| - Node* n = graph()->NewNode(op, node);
|
| - return n;
|
| + Type* type = NodeProperties::GetBounds(node).upper;
|
| + if (signedness == kSigned) {
|
| + if (!type->Is(Type::Signed32())) {
|
| + node = graph()->NewNode(simplified()->NumberToInt32(), node);
|
| + }
|
| + } else {
|
| + DCHECK_EQ(kUnsigned, signedness);
|
| + if (!type->Is(Type::Unsigned32())) {
|
| + node = graph()->NewNode(simplified()->NumberToUint32(), node);
|
| + }
|
| + }
|
| + return node;
|
| }
|
|
|
| void update_effect(Node* effect) {
|
| @@ -231,8 +234,8 @@ Reduction JSTypedLowering::ReduceJSAdd(Node* node) {
|
| // JSAdd(x:number, y:number) => NumberAdd(x, y)
|
| return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number());
|
| }
|
| - Type* maybe_string = Type::Union(Type::String(), Type::Receiver(), zone());
|
| - if (r.BothInputsAre(Type::Primitive()) && r.NeitherInputCanBe(maybe_string)) {
|
| + if (r.BothInputsAre(Type::Primitive()) &&
|
| + r.NeitherInputCanBe(Type::StringOrReceiver())) {
|
| // JSAdd(x:-string, y:-string) => NumberAdd(ToNumber(x), ToNumber(y))
|
| r.ConvertInputsToNumber();
|
| return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number());
|
| @@ -273,7 +276,7 @@ Reduction JSTypedLowering::ReduceJSBitwiseOr(Node* node) {
|
| // operations
|
| // on some platforms.
|
| // TODO(turbofan): make this heuristic configurable for code size.
|
| - r.ConvertInputsToInt32(true, true);
|
| + r.ConvertInputsToUI32(kSigned, kSigned);
|
| return r.ChangeToPureOperator(machine()->Word32Or(), Type::Integral32());
|
| }
|
| return NoChange();
|
| @@ -318,9 +321,7 @@ Reduction JSTypedLowering::ReduceNumberBinop(Node* node,
|
| }
|
|
|
|
|
| -Reduction JSTypedLowering::ReduceI32Binop(Node* node, bool left_signed,
|
| - bool right_signed,
|
| - const Operator* intOp) {
|
| +Reduction JSTypedLowering::ReduceInt32Binop(Node* node, const Operator* intOp) {
|
| JSBinopReduction r(this, node);
|
| if (r.BothInputsAre(Type::Primitive())) {
|
| // TODO(titzer): some Smi bitwise operations don't really require going
|
| @@ -328,18 +329,19 @@ Reduction JSTypedLowering::ReduceI32Binop(Node* node, bool left_signed,
|
| // operations
|
| // on some platforms.
|
| // TODO(turbofan): make this heuristic configurable for code size.
|
| - r.ConvertInputsToInt32(left_signed, right_signed);
|
| + r.ConvertInputsToUI32(kSigned, kSigned);
|
| return r.ChangeToPureOperator(intOp, Type::Integral32());
|
| }
|
| return NoChange();
|
| }
|
|
|
|
|
| -Reduction JSTypedLowering::ReduceI32Shift(Node* node, bool left_signed,
|
| - const Operator* shift_op) {
|
| +Reduction JSTypedLowering::ReduceUI32Shift(Node* node,
|
| + Signedness left_signedness,
|
| + const Operator* shift_op) {
|
| JSBinopReduction r(this, node);
|
| if (r.BothInputsAre(Type::Primitive())) {
|
| - r.ConvertInputsForShift(left_signed);
|
| + r.ConvertInputsForShift(left_signedness);
|
| return r.ChangeToPureOperator(shift_op, Type::Integral32());
|
| }
|
| return NoChange();
|
| @@ -381,8 +383,8 @@ Reduction JSTypedLowering::ReduceJSComparison(Node* node) {
|
| ...
|
| }
|
| #endif
|
| - Type* maybe_string = Type::Union(Type::String(), Type::Receiver(), zone());
|
| - if (r.BothInputsAre(Type::Primitive()) && r.OneInputCannotBe(maybe_string)) {
|
| + if (r.BothInputsAre(Type::Primitive()) &&
|
| + r.OneInputCannotBe(Type::StringOrReceiver())) {
|
| const Operator* less_than;
|
| const Operator* less_than_or_equal;
|
| if (r.BothInputsAre(Type::Unsigned32())) {
|
| @@ -451,8 +453,7 @@ Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node, bool invert) {
|
| return ReplaceEagerly(node, jsgraph()->BooleanConstant(!invert));
|
| }
|
| }
|
| - Type* string_or_number = Type::Union(Type::String(), Type::Number(), zone());
|
| - if (r.OneInputCannotBe(string_or_number)) {
|
| + if (r.OneInputCannotBe(Type::NumberOrString())) {
|
| // For values with canonical representation (i.e. not string nor number) an
|
| // empty type intersection means the values cannot be strictly equal.
|
| if (!r.left_type()->Maybe(r.right_type())) {
|
| @@ -490,115 +491,6 @@ Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node, bool invert) {
|
| }
|
|
|
|
|
| -Reduction JSTypedLowering::ReduceJSToNumberInput(Node* input) {
|
| - if (input->opcode() == IrOpcode::kJSToNumber) {
|
| - // Recursively try to reduce the input first.
|
| - Reduction result = ReduceJSToNumber(input);
|
| - if (result.Changed()) return result;
|
| - return Changed(input); // JSToNumber(JSToNumber(x)) => JSToNumber(x)
|
| - }
|
| - Type* input_type = NodeProperties::GetBounds(input).upper;
|
| - if (input_type->Is(Type::Number())) {
|
| - // JSToNumber(x:number) => x
|
| - return Changed(input);
|
| - }
|
| - if (input_type->Is(Type::Undefined())) {
|
| - // JSToNumber(undefined) => #NaN
|
| - return Replace(jsgraph()->NaNConstant());
|
| - }
|
| - if (input_type->Is(Type::Null())) {
|
| - // JSToNumber(null) => #0
|
| - return Replace(jsgraph()->ZeroConstant());
|
| - }
|
| - if (input_type->Is(Type::Boolean())) {
|
| - // JSToNumber(x:boolean) => BooleanToNumber(x)
|
| - return Replace(graph()->NewNode(simplified()->BooleanToNumber(), input));
|
| - }
|
| - // TODO(turbofan): js-typed-lowering of ToNumber(x:string)
|
| - return NoChange();
|
| -}
|
| -
|
| -
|
| -Reduction JSTypedLowering::ReduceJSToNumber(Node* node) {
|
| - // Try to reduce the input first.
|
| - Node* const input = node->InputAt(0);
|
| - Reduction reduction = ReduceJSToNumberInput(input);
|
| - if (reduction.Changed()) {
|
| - NodeProperties::ReplaceWithValue(node, reduction.replacement());
|
| - return reduction;
|
| - }
|
| - Type* const input_type = NodeProperties::GetBounds(input).upper;
|
| - if (input_type->Is(Type::PlainPrimitive())) {
|
| - // Converting a plain primitive to a number has no observable side effects.
|
| - RelaxEffects(node);
|
| - // JSToNumber(phi(x1,...,xn,control):plain-primitive,context)
|
| - // => phi(JSToNumber(x1,no-context),...,JSToNumber(xn,no-context),control)
|
| - if (input->opcode() == IrOpcode::kPhi) {
|
| - int const input_count = input->InputCount() - 1;
|
| - Node* const control = input->InputAt(input_count);
|
| - DCHECK_LE(0, input_count);
|
| - DCHECK(NodeProperties::IsControl(control));
|
| - DCHECK(NodeProperties::GetBounds(node).upper->Is(Type::Number()));
|
| - DCHECK(!NodeProperties::GetBounds(input).upper->Is(Type::Number()));
|
| - node->set_op(common()->Phi(kMachAnyTagged, input_count));
|
| - for (int i = 0; i < input_count; ++i) {
|
| - Node* value = input->InputAt(i);
|
| - // Recursively try to reduce the value first.
|
| - Reduction reduction = ReduceJSToNumberInput(value);
|
| - if (reduction.Changed()) {
|
| - value = reduction.replacement();
|
| - } else {
|
| - value = graph()->NewNode(javascript()->ToNumber(), value,
|
| - jsgraph()->NoContextConstant(),
|
| - graph()->start(), graph()->start());
|
| - }
|
| - if (i < node->InputCount()) {
|
| - node->ReplaceInput(i, value);
|
| - } else {
|
| - node->AppendInput(graph()->zone(), value);
|
| - }
|
| - }
|
| - if (input_count < node->InputCount()) {
|
| - node->ReplaceInput(input_count, control);
|
| - } else {
|
| - node->AppendInput(graph()->zone(), control);
|
| - }
|
| - node->TrimInputCount(input_count + 1);
|
| - }
|
| - return Changed(node);
|
| - }
|
| - return NoChange();
|
| -}
|
| -
|
| -
|
| -Reduction JSTypedLowering::ReduceJSToStringInput(Node* input) {
|
| - if (input->opcode() == IrOpcode::kJSToString) {
|
| - // Recursively try to reduce the input first.
|
| - Reduction result = ReduceJSToStringInput(input->InputAt(0));
|
| - if (result.Changed()) {
|
| - RelaxEffects(input);
|
| - return result;
|
| - }
|
| - return Changed(input); // JSToString(JSToString(x)) => JSToString(x)
|
| - }
|
| - Type* input_type = NodeProperties::GetBounds(input).upper;
|
| - if (input_type->Is(Type::String())) {
|
| - return Changed(input); // JSToString(x:string) => x
|
| - }
|
| - if (input_type->Is(Type::Undefined())) {
|
| - return Replace(jsgraph()->HeapConstant(
|
| - graph()->zone()->isolate()->factory()->undefined_string()));
|
| - }
|
| - if (input_type->Is(Type::Null())) {
|
| - return Replace(jsgraph()->HeapConstant(
|
| - graph()->zone()->isolate()->factory()->null_string()));
|
| - }
|
| - // TODO(turbofan): js-typed-lowering of ToString(x:boolean)
|
| - // TODO(turbofan): js-typed-lowering of ToString(x:number)
|
| - return NoChange();
|
| -}
|
| -
|
| -
|
| Reduction JSTypedLowering::ReduceJSToBooleanInput(Node* input) {
|
| if (input->opcode() == IrOpcode::kJSToBoolean) {
|
| // Recursively try to reduce the input first.
|
| @@ -727,6 +619,160 @@ Reduction JSTypedLowering::ReduceJSToBoolean(Node* node) {
|
| }
|
|
|
|
|
| +Reduction JSTypedLowering::ReduceJSToNumberInput(Node* input) {
|
| + if (input->opcode() == IrOpcode::kJSToNumber) {
|
| + // Recursively try to reduce the input first.
|
| + Reduction result = ReduceJSToNumber(input);
|
| + if (result.Changed()) return result;
|
| + return Changed(input); // JSToNumber(JSToNumber(x)) => JSToNumber(x)
|
| + }
|
| + Type* input_type = NodeProperties::GetBounds(input).upper;
|
| + if (input_type->Is(Type::Number())) {
|
| + // JSToNumber(x:number) => x
|
| + return Changed(input);
|
| + }
|
| + if (input_type->Is(Type::Undefined())) {
|
| + // JSToNumber(undefined) => #NaN
|
| + return Replace(jsgraph()->NaNConstant());
|
| + }
|
| + if (input_type->Is(Type::Null())) {
|
| + // JSToNumber(null) => #0
|
| + return Replace(jsgraph()->ZeroConstant());
|
| + }
|
| + if (input_type->Is(Type::Boolean())) {
|
| + // JSToNumber(x:boolean) => BooleanToNumber(x)
|
| + return Replace(graph()->NewNode(simplified()->BooleanToNumber(), input));
|
| + }
|
| + // TODO(turbofan): js-typed-lowering of ToNumber(x:string)
|
| + return NoChange();
|
| +}
|
| +
|
| +
|
| +Reduction JSTypedLowering::ReduceJSToNumber(Node* node) {
|
| + // Try to reduce the input first.
|
| + Node* const input = node->InputAt(0);
|
| + Reduction reduction = ReduceJSToNumberInput(input);
|
| + if (reduction.Changed()) {
|
| + NodeProperties::ReplaceWithValue(node, reduction.replacement());
|
| + return reduction;
|
| + }
|
| + Type* const input_type = NodeProperties::GetBounds(input).upper;
|
| + if (input_type->Is(Type::PlainPrimitive())) {
|
| + // Converting a plain primitive to a number has no observable side effects.
|
| + RelaxEffects(node);
|
| + if (input->opcode() == IrOpcode::kPhi) {
|
| + // JSToNumber(phi(x1,...,xn,control):plain-primitive,context)
|
| + // => phi(JSToNumber(x1,no-context),
|
| + // ...,
|
| + // JSToNumber(xn,no-context),control)
|
| + int const input_count = input->InputCount() - 1;
|
| + Node* const control = input->InputAt(input_count);
|
| + DCHECK_LE(0, input_count);
|
| + DCHECK(NodeProperties::IsControl(control));
|
| + DCHECK(NodeProperties::GetBounds(node).upper->Is(Type::Number()));
|
| + DCHECK(!NodeProperties::GetBounds(input).upper->Is(Type::Number()));
|
| + node->set_op(common()->Phi(kMachAnyTagged, input_count));
|
| + for (int i = 0; i < input_count; ++i) {
|
| + Node* value = input->InputAt(i);
|
| + // Recursively try to reduce the value first.
|
| + Reduction reduction = ReduceJSToNumberInput(value);
|
| + if (reduction.Changed()) {
|
| + value = reduction.replacement();
|
| + } else {
|
| + // We must be very careful not to introduce cycles when pushing
|
| + // operations into phis. It is safe for {value}, since it appears
|
| + // as input to the phi that we are replacing, but it's not safe
|
| + // to simply reuse the context of the {node}. However, ToNumber()
|
| + // does not require a context anyways, so it's safe to discard it
|
| + // here and pass the dummy context.
|
| + value = graph()->NewNode(javascript()->ToNumber(), value,
|
| + jsgraph()->NoContextConstant(),
|
| + graph()->start(), graph()->start());
|
| + }
|
| + if (i < node->InputCount()) {
|
| + node->ReplaceInput(i, value);
|
| + } else {
|
| + node->AppendInput(graph()->zone(), value);
|
| + }
|
| + }
|
| + if (input_count < node->InputCount()) {
|
| + node->ReplaceInput(input_count, control);
|
| + } else {
|
| + node->AppendInput(graph()->zone(), control);
|
| + }
|
| + node->TrimInputCount(input_count + 1);
|
| + } else if (input->opcode() == IrOpcode::kSelect) {
|
| + // JSToNumber(select(c,x1,x2):plain-primitive,context)
|
| + // => select(c,JSToNumber(x1,no-context),JSToNumber(x2,no-context))
|
| + int const input_count = input->InputCount();
|
| + BranchHint const input_hint = SelectParametersOf(input->op()).hint();
|
| + DCHECK_EQ(3, input_count);
|
| + DCHECK(NodeProperties::GetBounds(node).upper->Is(Type::Number()));
|
| + DCHECK(!NodeProperties::GetBounds(input).upper->Is(Type::Number()));
|
| + node->set_op(common()->Select(kMachAnyTagged, input_hint));
|
| + node->ReplaceInput(0, input->InputAt(0));
|
| + for (int i = 1; i < input_count; ++i) {
|
| + Node* value = input->InputAt(i);
|
| + // Recursively try to reduce the value first.
|
| + Reduction reduction = ReduceJSToNumberInput(value);
|
| + if (reduction.Changed()) {
|
| + value = reduction.replacement();
|
| + } else {
|
| + // We must be very careful not to introduce cycles when pushing
|
| + // operations into selects. It is safe for {value}, since it appears
|
| + // as input to the select that we are replacing, but it's not safe
|
| + // to simply reuse the context of the {node}. However, ToNumber()
|
| + // does not require a context anyways, so it's safe to discard it
|
| + // here and pass the dummy context.
|
| + value = graph()->NewNode(javascript()->ToNumber(), value,
|
| + jsgraph()->NoContextConstant(),
|
| + graph()->start(), graph()->start());
|
| + }
|
| + node->ReplaceInput(i, value);
|
| + }
|
| + node->TrimInputCount(input_count);
|
| + }
|
| + return Changed(node);
|
| + }
|
| + return NoChange();
|
| +}
|
| +
|
| +
|
| +Reduction JSTypedLowering::ReduceJSToStringInput(Node* input) {
|
| + if (input->opcode() == IrOpcode::kJSToString) {
|
| + // Recursively try to reduce the input first.
|
| + Reduction result = ReduceJSToString(input);
|
| + if (result.Changed()) return result;
|
| + return Changed(input); // JSToString(JSToString(x)) => JSToString(x)
|
| + }
|
| + Type* input_type = NodeProperties::GetBounds(input).upper;
|
| + if (input_type->Is(Type::String())) {
|
| + return Changed(input); // JSToString(x:string) => x
|
| + }
|
| + if (input_type->Is(Type::Undefined())) {
|
| + return Replace(jsgraph()->HeapConstant(factory()->undefined_string()));
|
| + }
|
| + if (input_type->Is(Type::Null())) {
|
| + return Replace(jsgraph()->HeapConstant(factory()->null_string()));
|
| + }
|
| + // TODO(turbofan): js-typed-lowering of ToString(x:boolean)
|
| + // TODO(turbofan): js-typed-lowering of ToString(x:number)
|
| + return NoChange();
|
| +}
|
| +
|
| +
|
| +Reduction JSTypedLowering::ReduceJSToString(Node* node) {
|
| + // Try to reduce the input first.
|
| + Node* const input = node->InputAt(0);
|
| + Reduction reduction = ReduceJSToStringInput(input);
|
| + if (reduction.Changed()) {
|
| + NodeProperties::ReplaceWithValue(node, reduction.replacement());
|
| + return reduction;
|
| + }
|
| + return NoChange();
|
| +}
|
| +
|
| +
|
| Reduction JSTypedLowering::ReduceJSLoadProperty(Node* node) {
|
| Node* key = NodeProperties::GetValueInput(node, 1);
|
| Node* base = NodeProperties::GetValueInput(node, 0);
|
| @@ -888,15 +934,6 @@ Reduction JSTypedLowering::ReduceJSStoreContext(Node* node) {
|
| }
|
|
|
|
|
| -static Reduction ReplaceWithReduction(Node* node, Reduction reduction) {
|
| - if (reduction.Changed()) {
|
| - NodeProperties::ReplaceWithValue(node, reduction.replacement());
|
| - return reduction;
|
| - }
|
| - return Reducer::NoChange();
|
| -}
|
| -
|
| -
|
| Reduction JSTypedLowering::Reduce(Node* node) {
|
| // Check if the output type is a singleton. In that case we already know the
|
| // result value and can simply replace the node unless there are effects.
|
| @@ -925,15 +962,15 @@ Reduction JSTypedLowering::Reduce(Node* node) {
|
| case IrOpcode::kJSBitwiseOr:
|
| return ReduceJSBitwiseOr(node);
|
| case IrOpcode::kJSBitwiseXor:
|
| - return ReduceI32Binop(node, true, true, machine()->Word32Xor());
|
| + return ReduceInt32Binop(node, machine()->Word32Xor());
|
| case IrOpcode::kJSBitwiseAnd:
|
| - return ReduceI32Binop(node, true, true, machine()->Word32And());
|
| + return ReduceInt32Binop(node, machine()->Word32And());
|
| case IrOpcode::kJSShiftLeft:
|
| - return ReduceI32Shift(node, true, machine()->Word32Shl());
|
| + return ReduceUI32Shift(node, kSigned, machine()->Word32Shl());
|
| case IrOpcode::kJSShiftRight:
|
| - return ReduceI32Shift(node, true, machine()->Word32Sar());
|
| + return ReduceUI32Shift(node, kSigned, machine()->Word32Sar());
|
| case IrOpcode::kJSShiftRightLogical:
|
| - return ReduceI32Shift(node, false, machine()->Word32Shr());
|
| + return ReduceUI32Shift(node, kUnsigned, machine()->Word32Shr());
|
| case IrOpcode::kJSAdd:
|
| return ReduceJSAdd(node);
|
| case IrOpcode::kJSSubtract:
|
| @@ -961,8 +998,7 @@ Reduction JSTypedLowering::Reduce(Node* node) {
|
| case IrOpcode::kJSToNumber:
|
| return ReduceJSToNumber(node);
|
| case IrOpcode::kJSToString:
|
| - return ReplaceWithReduction(node,
|
| - ReduceJSToStringInput(node->InputAt(0)));
|
| + return ReduceJSToString(node);
|
| case IrOpcode::kJSLoadProperty:
|
| return ReduceJSLoadProperty(node);
|
| case IrOpcode::kJSStoreProperty:
|
| @@ -971,8 +1007,6 @@ Reduction JSTypedLowering::Reduce(Node* node) {
|
| return ReduceJSLoadContext(node);
|
| case IrOpcode::kJSStoreContext:
|
| return ReduceJSStoreContext(node);
|
| - case IrOpcode::kJSCallFunction:
|
| - return JSBuiltinReducer(jsgraph()).Reduce(node);
|
| default:
|
| break;
|
| }
|
| @@ -986,6 +1020,27 @@ Node* JSTypedLowering::Word32Shl(Node* const lhs, int32_t const rhs) {
|
| jsgraph()->Int32Constant(rhs));
|
| }
|
|
|
| +
|
| +Factory* JSTypedLowering::factory() const { return jsgraph()->factory(); }
|
| +
|
| +
|
| +Graph* JSTypedLowering::graph() const { return jsgraph()->graph(); }
|
| +
|
| +
|
| +JSOperatorBuilder* JSTypedLowering::javascript() const {
|
| + return jsgraph()->javascript();
|
| +}
|
| +
|
| +
|
| +CommonOperatorBuilder* JSTypedLowering::common() const {
|
| + return jsgraph()->common();
|
| +}
|
| +
|
| +
|
| +MachineOperatorBuilder* JSTypedLowering::machine() const {
|
| + return jsgraph()->machine();
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|