| Index: src/compiler/js-type-feedback.cc
|
| diff --git a/src/compiler/js-type-feedback.cc b/src/compiler/js-type-feedback.cc
|
| index 749eebab290919e9fc5338a9734f62ca72dfb49e..fa5e33f840e107e8acbedd472c446d5ad826c41c 100644
|
| --- a/src/compiler/js-type-feedback.cc
|
| +++ b/src/compiler/js-type-feedback.cc
|
| @@ -8,7 +8,6 @@
|
|
|
| #include "src/accessors.h"
|
| #include "src/ast.h"
|
| -#include "src/compiler.h"
|
| #include "src/type-info.h"
|
|
|
| #include "src/compiler/access-builder.h"
|
| @@ -79,18 +78,6 @@
|
| }
|
|
|
|
|
| -static void AddFieldAccessTypes(FieldAccess* access,
|
| - PropertyDetails property_details) {
|
| - if (property_details.representation().IsSmi()) {
|
| - access->type = Type::SignedSmall();
|
| - access->machine_type = static_cast<MachineType>(kTypeInt32 | kRepTagged);
|
| - } else if (property_details.representation().IsDouble()) {
|
| - access->type = Type::Number();
|
| - access->machine_type = kMachFloat64;
|
| - }
|
| -}
|
| -
|
| -
|
| static bool GetInObjectFieldAccess(LoadOrStore mode, Handle<Map> map,
|
| Handle<Name> name, FieldAccess* access) {
|
| access->base_is_tagged = kTaggedBase;
|
| @@ -122,17 +109,25 @@
|
| return false;
|
| }
|
|
|
| - // Transfer known types from property details.
|
| - AddFieldAccessTypes(access, property_details);
|
| -
|
| if (mode == STORE) {
|
| - if (property_details.IsReadOnly()) {
|
| - // TODO(turbofan): deopt, ignore or throw on readonly stores.
|
| + if (property_details.IsReadOnly()) return false;
|
| + if (is_smi) {
|
| + // TODO(turbofan): SMI stores.
|
| return false;
|
| }
|
| - if (is_smi || is_double) {
|
| - // TODO(turbofan): check type and deopt for SMI/double stores.
|
| + if (is_double) {
|
| + // TODO(turbofan): double stores.
|
| return false;
|
| + }
|
| + } else {
|
| + // Check property details for loads.
|
| + if (is_smi) {
|
| + access->type = Type::SignedSmall();
|
| + access->machine_type = static_cast<MachineType>(kTypeInt32 | kRepTagged);
|
| + }
|
| + if (is_double) {
|
| + access->type = Type::Number();
|
| + access->machine_type = kMachFloat64;
|
| }
|
| }
|
|
|
| @@ -149,20 +144,8 @@
|
| }
|
|
|
|
|
| -static bool IsGlobalObject(Node* node) {
|
| - return NodeProperties::IsTyped(node) &&
|
| - NodeProperties::GetBounds(node).upper->Is(Type::GlobalObject());
|
| -}
|
| -
|
| -
|
| Reduction JSTypeFeedbackSpecializer::ReduceJSLoadNamed(Node* node) {
|
| DCHECK(node->opcode() == IrOpcode::kJSLoadNamed);
|
| - Node* receiver = node->InputAt(0);
|
| - if (IsGlobalObject(receiver)) {
|
| - return ReduceJSLoadNamedForGlobalVariable(node);
|
| - }
|
| -
|
| - if (!FLAG_turbo_deoptimization) return NoChange();
|
| // TODO(titzer): deopt locations are wrong for property accesses
|
| if (!EAGER_DEOPT_LOCATIONS_FOR_PROPERTY_ACCESS_ARE_CORRECT) return NoChange();
|
|
|
| @@ -175,6 +158,7 @@
|
| const LoadNamedParameters& p = LoadNamedParametersOf(node->op());
|
| SmallMapList maps;
|
| Handle<Name> name = p.name().handle();
|
| + Node* receiver = node->InputAt(0);
|
| Node* effect = NodeProperties::GetEffectInput(node);
|
| GatherReceiverTypes(receiver, effect, id, name, &maps);
|
|
|
| @@ -204,74 +188,6 @@
|
| NodeProperties::MergeControlToEnd(graph(), common(), deopt);
|
| NodeProperties::ReplaceWithValue(node, load, load, check_success);
|
| return Replace(load);
|
| -}
|
| -
|
| -
|
| -Reduction JSTypeFeedbackSpecializer::ReduceJSLoadNamedForGlobalVariable(
|
| - Node* node) {
|
| - Handle<String> name =
|
| - Handle<String>::cast(LoadNamedParametersOf(node->op()).name().handle());
|
| - // Try to optimize loads from the global object.
|
| - Handle<Object> constant_value =
|
| - jsgraph()->isolate()->factory()->GlobalConstantFor(name);
|
| - if (!constant_value.is_null()) {
|
| - // Always optimize global constants.
|
| - Node* constant = jsgraph()->Constant(constant_value);
|
| - NodeProperties::ReplaceWithValue(node, constant);
|
| - return Replace(constant);
|
| - }
|
| -
|
| - if (global_object_.is_null()) {
|
| - // Nothing else can be done if we don't have a global object.
|
| - return NoChange();
|
| - }
|
| -
|
| - if (FLAG_turbo_deoptimization) {
|
| - // Handle lookups in the script context.
|
| - {
|
| - Handle<ScriptContextTable> script_contexts(
|
| - global_object_->native_context()->script_context_table());
|
| - ScriptContextTable::LookupResult lookup;
|
| - if (ScriptContextTable::Lookup(script_contexts, name, &lookup)) {
|
| - // TODO(turbofan): introduce a LoadContext here.
|
| - return NoChange();
|
| - }
|
| - }
|
| -
|
| - // Constant promotion or cell access requires lazy deoptimization support.
|
| - LookupIterator it(global_object_, name, LookupIterator::OWN);
|
| -
|
| - if (it.state() == LookupIterator::DATA) {
|
| - Handle<PropertyCell> cell = it.GetPropertyCell();
|
| - dependencies_->AssumePropertyCell(cell);
|
| -
|
| - if (it.property_details().cell_type() == PropertyCellType::kConstant) {
|
| - // Constant promote the global's current value.
|
| - Handle<Object> constant_value(cell->value(), jsgraph()->isolate());
|
| - if (constant_value->IsConsString()) {
|
| - constant_value =
|
| - String::Flatten(Handle<String>::cast(constant_value));
|
| - }
|
| - Node* constant = jsgraph()->Constant(constant_value);
|
| - NodeProperties::ReplaceWithValue(node, constant);
|
| - return Replace(constant);
|
| - } else {
|
| - // Load directly from the property cell.
|
| - FieldAccess access = AccessBuilder::ForPropertyCellValue();
|
| - Node* control = NodeProperties::GetControlInput(node);
|
| - Node* load_field = graph()->NewNode(
|
| - simplified()->LoadField(access), jsgraph()->Constant(cell),
|
| - NodeProperties::GetEffectInput(node), control);
|
| - NodeProperties::ReplaceWithValue(node, load_field, load_field, control);
|
| - return Replace(load_field);
|
| - }
|
| - }
|
| - } else {
|
| - // TODO(turbofan): non-configurable properties on the global object
|
| - // should be loadable through a cell without deoptimization support.
|
| - }
|
| -
|
| - return NoChange();
|
| }
|
|
|
|
|
|
|