Upgrade V8 to 5.1.281.57 DO NOT MERGE
FPIIM-449
Change-Id: Id981b686b4d587ac31697662eb98bb34be42ad90
(cherry picked from commit 3b9bc31999c9787eb726ecdbfd5796bfdec32a18)
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
index 11ae3a9..7e1a0dc 100644
--- a/src/compiler/js-typed-lowering.cc
+++ b/src/compiler/js-typed-lowering.cc
@@ -533,15 +533,11 @@
return r.ChangeToPureOperator(
simplified()->ReferenceEqual(Type::Receiver()), invert);
}
- if (r.OneInputIs(Type::NullOrUndefined())) {
- Callable const callable = CodeFactory::CompareNilIC(isolate(), kNullValue);
- CallDescriptor const* const desc = Linkage::GetStubCallDescriptor(
- isolate(), graph()->zone(), callable.descriptor(), 0,
- CallDescriptor::kNeedsFrameState, node->op()->properties());
- node->RemoveInput(r.LeftInputIs(Type::NullOrUndefined()) ? 0 : 1);
- node->InsertInput(graph()->zone(), 0,
- jsgraph()->HeapConstant(callable.code()));
- NodeProperties::ChangeOp(node, common()->Call(desc));
+ if (r.OneInputIs(Type::Undetectable())) {
+ RelaxEffectsAndControls(node);
+ node->RemoveInput(r.LeftInputIs(Type::Undetectable()) ? 0 : 1);
+ node->TrimInputCount(1);
+ NodeProperties::ChangeOp(node, simplified()->ObjectIsUndetectable());
if (invert) {
// Insert an boolean not to invert the value.
Node* value = graph()->NewNode(simplified()->BooleanNot(), node);
@@ -648,6 +644,51 @@
return NoChange();
}
+Reduction JSTypedLowering::ReduceJSToInteger(Node* node) {
+ Node* const input = NodeProperties::GetValueInput(node, 0);
+ Type* const input_type = NodeProperties::GetType(input);
+ if (input_type->Is(type_cache_.kIntegerOrMinusZero)) {
+ // JSToInteger(x:integer) => x
+ ReplaceWithValue(node, input);
+ return Replace(input);
+ }
+ return NoChange();
+}
+
+Reduction JSTypedLowering::ReduceJSToLength(Node* node) {
+ Node* input = NodeProperties::GetValueInput(node, 0);
+ Type* input_type = NodeProperties::GetType(input);
+ if (input_type->Is(type_cache_.kIntegerOrMinusZero)) {
+ if (input_type->Max() <= 0.0) {
+ input = jsgraph()->ZeroConstant();
+ } else if (input_type->Min() >= kMaxSafeInteger) {
+ input = jsgraph()->Constant(kMaxSafeInteger);
+ } else {
+ if (input_type->Min() <= 0.0) {
+ input = graph()->NewNode(
+ common()->Select(MachineRepresentation::kTagged),
+ graph()->NewNode(simplified()->NumberLessThanOrEqual(), input,
+ jsgraph()->ZeroConstant()),
+ jsgraph()->ZeroConstant(), input);
+ input_type = Type::Range(0.0, input_type->Max(), graph()->zone());
+ NodeProperties::SetType(input, input_type);
+ }
+ if (input_type->Max() > kMaxSafeInteger) {
+ input = graph()->NewNode(
+ common()->Select(MachineRepresentation::kTagged),
+ graph()->NewNode(simplified()->NumberLessThanOrEqual(),
+ jsgraph()->Constant(kMaxSafeInteger), input),
+ jsgraph()->Constant(kMaxSafeInteger), input);
+ input_type =
+ Type::Range(input_type->Min(), kMaxSafeInteger, graph()->zone());
+ NodeProperties::SetType(input, input_type);
+ }
+ }
+ ReplaceWithValue(node, input);
+ return Replace(input);
+ }
+ return NoChange();
+}
Reduction JSTypedLowering::ReduceJSToNumberInput(Node* input) {
if (input->opcode() == IrOpcode::kJSToNumber) {
@@ -699,7 +740,10 @@
// JSToNumber(x:boolean) => BooleanToNumber(x)
return Replace(graph()->NewNode(simplified()->BooleanToNumber(), input));
}
- // TODO(turbofan): js-typed-lowering of ToNumber(x:string)
+ if (input_type->Is(Type::String())) {
+ // JSToNumber(x:string) => StringToNumber(x)
+ return Replace(graph()->NewNode(simplified()->StringToNumber(), input));
+ }
return NoChange();
}
@@ -1684,6 +1728,10 @@
return ReduceJSModulus(node);
case IrOpcode::kJSToBoolean:
return ReduceJSToBoolean(node);
+ case IrOpcode::kJSToInteger:
+ return ReduceJSToInteger(node);
+ case IrOpcode::kJSToLength:
+ return ReduceJSToLength(node);
case IrOpcode::kJSToNumber:
return ReduceJSToNumber(node);
case IrOpcode::kJSToString: