| Index: src/compiler/js-typed-lowering.cc
|
| diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
|
| index c64c9359389efd3999bc48f45e55d9111257e18d..c7a1f43426815e944e66b7aa956d98fa3884217f 100644
|
| --- a/src/compiler/js-typed-lowering.cc
|
| +++ b/src/compiler/js-typed-lowering.cc
|
| @@ -82,16 +82,13 @@ class JSBinopReduction final {
|
| if (BothInputsAre(Type::String()) ||
|
| ((lowering_->flags() & JSTypedLowering::kDeoptimizationEnabled) &&
|
| BinaryOperationHintOf(node_->op()) == BinaryOperationHint::kString)) {
|
| - if (left_type()->IsHeapConstant() &&
|
| - left_type()->AsHeapConstant()->Value()->IsString()) {
|
| - Handle<String> left_string =
|
| - Handle<String>::cast(left_type()->AsHeapConstant()->Value());
|
| + HeapObjectBinopMatcher m(node_);
|
| + if (m.left().HasValue() && m.left().Value()->IsString()) {
|
| + Handle<String> left_string = Handle<String>::cast(m.left().Value());
|
| if (left_string->length() >= ConsString::kMinLength) return true;
|
| }
|
| - if (right_type()->IsHeapConstant() &&
|
| - right_type()->AsHeapConstant()->Value()->IsString()) {
|
| - Handle<String> right_string =
|
| - Handle<String>::cast(right_type()->AsHeapConstant()->Value());
|
| + if (m.right().HasValue() && m.right().Value()->IsString()) {
|
| + Handle<String> right_string = Handle<String>::cast(m.right().Value());
|
| if (right_string->length() >= ConsString::kMinLength) return true;
|
| }
|
| }
|
| @@ -596,21 +593,20 @@ Reduction JSTypedLowering::ReduceCreateConsString(Node* node) {
|
| }
|
|
|
| // Determine the {first} length.
|
| + HeapObjectBinopMatcher m(node);
|
| Node* first_length =
|
| - first_type->IsHeapConstant()
|
| + (m.left().HasValue() && m.left().Value()->IsString())
|
| ? jsgraph()->Constant(
|
| - Handle<String>::cast(first_type->AsHeapConstant()->Value())
|
| - ->length())
|
| + Handle<String>::cast(m.left().Value())->length())
|
| : effect = graph()->NewNode(
|
| simplified()->LoadField(AccessBuilder::ForStringLength()),
|
| first, effect, control);
|
|
|
| // Determine the {second} length.
|
| Node* second_length =
|
| - second_type->IsHeapConstant()
|
| + (m.right().HasValue() && m.right().Value()->IsString())
|
| ? jsgraph()->Constant(
|
| - Handle<String>::cast(second_type->AsHeapConstant()->Value())
|
| - ->length())
|
| + Handle<String>::cast(m.right().Value())->length())
|
| : effect = graph()->NewNode(
|
| simplified()->LoadField(AccessBuilder::ForStringLength()),
|
| second, effect, control);
|
| @@ -979,12 +975,17 @@ Reduction JSTypedLowering::ReduceJSToLength(Node* node) {
|
| Reduction JSTypedLowering::ReduceJSToNumberInput(Node* input) {
|
| // Try constant-folding of JSToNumber with constant inputs.
|
| Type* input_type = NodeProperties::GetType(input);
|
| - if (input_type->IsHeapConstant()) {
|
| - Handle<Object> input_value = input_type->AsHeapConstant()->Value();
|
| - if (input_value->IsString()) {
|
| + if (input_type->Is(Type::String())) {
|
| + HeapObjectMatcher m(input);
|
| + if (m.HasValue() && m.Value()->IsString()) {
|
| + Handle<Object> input_value = m.Value();
|
| return Replace(jsgraph()->Constant(
|
| String::ToNumber(Handle<String>::cast(input_value))));
|
| - } else if (input_value->IsOddball()) {
|
| + }
|
| + }
|
| + if (input_type->IsHeapConstant()) {
|
| + Handle<Object> input_value = input_type->AsHeapConstant()->Value();
|
| + if (input_value->IsOddball()) {
|
| return Replace(jsgraph()->Constant(
|
| Oddball::ToNumber(Handle<Oddball>::cast(input_value))));
|
| }
|
|
|