Commit ac85ab0a authored by Yang Guo's avatar Yang Guo

Revert "Reland "[turbofan] Use feedback when reducing global loads/stores.""

This reverts commit e64f7c0a.

Reason for revert: this breaks chromedriver_py_test on Mac and Windows. This blocks the roll.

Details:

- DEPS roll with V8 pointing to this commit fails: https://chromium-review.googlesource.com/c/chromium/src/+/1349251
- DEPS roll with V8 pointing to the parent of this commit succeeds: https://chromium-review.googlesource.com/c/chromium/src/+/1349214

Original change's description:
> Reland "[turbofan] Use feedback when reducing global loads/stores."
> 
> This is a reland of 9c91b687 after
> fixing undefined behavior in numeric conversion that caused trouble
> on arm32.
> 
> Original change's description:
> > [turbofan] Use feedback when reducing global loads/stores.
> >
> > We already record the script context location or the property cell
> > as feedback of the global load/store IC, so Turbofan doesn't need
> > to do the lookups again.
> >
> > Change-Id: I6cbd2937de344729cd8e146b4ff85ddf3de6a56e
> > Reviewed-on: https://chromium-review.googlesource.com/c/1335691
> > Commit-Queue: Georg Neis <neis@chromium.org>
> > Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#57555}
> 
> Change-Id: Ic2d09025de02f92199755ac860bb9e91fa08f4ec
> Reviewed-on: https://chromium-review.googlesource.com/c/1340043
> Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
> Commit-Queue: Georg Neis <neis@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#57649}

TBR=neis@chromium.org,bmeurer@chromium.org

# Not skipping CQ checks because original CL landed > 1 day ago.

Change-Id: I7c9364d6a0bea6681fe9e25b28206cfc2c8557a7
Reviewed-on: https://chromium-review.googlesource.com/c/1349272Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Reviewed-by: 's avatarMaya Lekova <mslekova@chromium.org>
Commit-Queue: Yang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57768}
parent 15ca25a4
...@@ -794,6 +794,9 @@ FieldAccess ForPropertyCellValue(MachineRepresentation representation, ...@@ -794,6 +794,9 @@ FieldAccess ForPropertyCellValue(MachineRepresentation representation,
Reduction JSNativeContextSpecialization::ReduceGlobalAccess( Reduction JSNativeContextSpecialization::ReduceGlobalAccess(
Node* node, Node* receiver, Node* value, Handle<Name> name, Node* node, Node* receiver, Node* value, Handle<Name> name,
AccessMode access_mode, Node* index) { AccessMode access_mode, Node* index) {
Node* effect = NodeProperties::GetEffectInput(node);
Node* control = NodeProperties::GetControlInput(node);
// Lookup on the global object. We only deal with own data properties // Lookup on the global object. We only deal with own data properties
// of the global object here (represented as PropertyCell). // of the global object here (represented as PropertyCell).
LookupIterator it(isolate(), global_object(), name, LookupIterator::OWN); LookupIterator it(isolate(), global_object(), name, LookupIterator::OWN);
...@@ -801,25 +804,9 @@ Reduction JSNativeContextSpecialization::ReduceGlobalAccess( ...@@ -801,25 +804,9 @@ Reduction JSNativeContextSpecialization::ReduceGlobalAccess(
if (it.state() != LookupIterator::DATA) return NoChange(); if (it.state() != LookupIterator::DATA) return NoChange();
if (!it.GetHolder<JSObject>()->IsJSGlobalObject()) return NoChange(); if (!it.GetHolder<JSObject>()->IsJSGlobalObject()) return NoChange();
Handle<PropertyCell> property_cell = it.GetPropertyCell(); Handle<PropertyCell> property_cell = it.GetPropertyCell();
return ReduceGlobalAccess(node, receiver, value, name, access_mode, index,
property_cell);
}
Reduction JSNativeContextSpecialization::ReduceGlobalAccess(
Node* node, Node* receiver, Node* value, Handle<Name> name,
AccessMode access_mode, Node* index, Handle<PropertyCell> property_cell) {
Node* effect = NodeProperties::GetEffectInput(node);
Node* control = NodeProperties::GetControlInput(node);
Handle<Object> property_cell_value(property_cell->value(), isolate());
if (property_cell_value.is_identical_to(factory()->the_hole_value())) {
// The property cell is no longer valid.
return NoChange();
}
PropertyDetails property_details = property_cell->property_details(); PropertyDetails property_details = property_cell->property_details();
Handle<Object> property_cell_value(property_cell->value(), isolate());
PropertyCellType property_cell_type = property_details.cell_type(); PropertyCellType property_cell_type = property_details.cell_type();
DCHECK_EQ(kData, property_details.kind());
// We have additional constraints for stores. // We have additional constraints for stores.
if (access_mode == AccessMode::kStore) { if (access_mode == AccessMode::kStore) {
...@@ -996,100 +983,58 @@ Reduction JSNativeContextSpecialization::ReduceGlobalAccess( ...@@ -996,100 +983,58 @@ Reduction JSNativeContextSpecialization::ReduceGlobalAccess(
Reduction JSNativeContextSpecialization::ReduceJSLoadGlobal(Node* node) { Reduction JSNativeContextSpecialization::ReduceJSLoadGlobal(Node* node) {
DCHECK_EQ(IrOpcode::kJSLoadGlobal, node->opcode()); DCHECK_EQ(IrOpcode::kJSLoadGlobal, node->opcode());
NameRef name(broker(), LoadGlobalParametersOf(node->op()).name());
Node* effect = NodeProperties::GetEffectInput(node); Node* effect = NodeProperties::GetEffectInput(node);
LoadGlobalParameters const& p = LoadGlobalParametersOf(node->op()); // Try to lookup the name on the script context table first (lexical scoping).
if (!p.feedback().IsValid()) return NoChange(); base::Optional<ScriptContextTableRef::LookupResult> result =
FeedbackNexus nexus(p.feedback().vector(), p.feedback().slot()); native_context().script_context_table().lookup(name);
if (result) {
DCHECK(nexus.kind() == FeedbackSlotKind::kLoadGlobalInsideTypeof || ObjectRef contents = result->context.get(result->index);
nexus.kind() == FeedbackSlotKind::kLoadGlobalNotInsideTypeof); if (contents.IsHeapObject() &&
if (nexus.GetFeedback()->IsCleared()) return NoChange(); contents.AsHeapObject().map().oddball_type() == OddballType::kHole) {
Handle<Object> feedback(nexus.GetFeedback()->GetHeapObjectOrSmi(), isolate()); return NoChange();
if (feedback->IsSmi()) {
// The wanted name belongs to a script-scope variable and the feedback tells
// us where to find its value.
int number = feedback->Number();
int const script_context_index =
FeedbackNexus::ContextIndexBits::decode(number);
int const context_slot_index = FeedbackNexus::SlotIndexBits::decode(number);
bool const immutable = FeedbackNexus::ImmutabilityBit::decode(number);
Handle<Context> context = ScriptContextTable::GetContext(
isolate(), native_context().script_context_table().object(),
script_context_index);
{
ObjectRef contents(broker(),
handle(context->get(context_slot_index), isolate()));
CHECK(!contents.equals(ObjectRef(broker(), factory()->the_hole_value())));
} }
Node* context = jsgraph()->Constant(result->context);
Node* context_constant = jsgraph()->Constant(context);
Node* value = effect = graph()->NewNode( Node* value = effect = graph()->NewNode(
javascript()->LoadContext(0, context_slot_index, immutable), javascript()->LoadContext(0, result->index, result->immutable), context,
context_constant, effect); effect);
ReplaceWithValue(node, value, effect); ReplaceWithValue(node, value, effect);
return Replace(value); return Replace(value);
} }
CHECK(feedback->IsPropertyCell()); // Lookup the {name} on the global object instead.
// The wanted name belongs (or did belong) to a property on the global object return ReduceGlobalAccess(node, nullptr, nullptr, name.object(),
// and the feedback is the cell holding its value. AccessMode::kLoad);
return ReduceGlobalAccess(node, nullptr, nullptr, p.name(), AccessMode::kLoad,
nullptr, Handle<PropertyCell>::cast(feedback));
} }
Reduction JSNativeContextSpecialization::ReduceJSStoreGlobal(Node* node) { Reduction JSNativeContextSpecialization::ReduceJSStoreGlobal(Node* node) {
DCHECK_EQ(IrOpcode::kJSStoreGlobal, node->opcode()); DCHECK_EQ(IrOpcode::kJSStoreGlobal, node->opcode());
NameRef name(broker(), StoreGlobalParametersOf(node->op()).name());
Node* value = NodeProperties::GetValueInput(node, 0); Node* value = NodeProperties::GetValueInput(node, 0);
Node* effect = NodeProperties::GetEffectInput(node); Node* effect = NodeProperties::GetEffectInput(node);
Node* control = NodeProperties::GetControlInput(node); Node* control = NodeProperties::GetControlInput(node);
StoreGlobalParameters const& p = StoreGlobalParametersOf(node->op()); // Try to lookup the name on the script context table first (lexical scoping).
if (!p.feedback().IsValid()) return NoChange(); base::Optional<ScriptContextTableRef::LookupResult> result =
FeedbackNexus nexus(p.feedback().vector(), p.feedback().slot()); native_context().script_context_table().lookup(name);
if (result) {
DCHECK(nexus.kind() == FeedbackSlotKind::kStoreGlobalSloppy || ObjectRef contents = result->context.get(result->index);
nexus.kind() == FeedbackSlotKind::kStoreGlobalStrict); if ((contents.IsHeapObject() &&
if (nexus.GetFeedback()->IsCleared()) return NoChange(); contents.AsHeapObject().map().oddball_type() == OddballType::kHole) ||
Handle<Object> feedback(nexus.GetFeedback()->GetHeapObjectOrSmi(), isolate()); result->immutable) {
return NoChange();
if (feedback->IsSmi()) {
// The wanted name belongs to a script-scope variable and the feedback tells
// us where to find its value.
int const script_context_index =
FeedbackNexus::ContextIndexBits::decode(feedback->Number());
int const context_slot_index =
FeedbackNexus::SlotIndexBits::decode(feedback->Number());
bool const immutable =
FeedbackNexus::ImmutabilityBit::decode(feedback->Number());
Handle<Context> context = ScriptContextTable::GetContext(
isolate(), native_context().script_context_table().object(),
script_context_index);
if (immutable) return NoChange();
{
ObjectRef contents(broker(),
handle(context->get(context_slot_index), isolate()));
CHECK(!contents.equals(ObjectRef(broker(), factory()->the_hole_value())));
} }
Node* context = jsgraph()->Constant(result->context);
Node* context_constant = jsgraph()->Constant(context); effect = graph()->NewNode(javascript()->StoreContext(0, result->index),
effect = graph()->NewNode(javascript()->StoreContext(0, context_slot_index), value, context, effect, control);
value, context_constant, effect, control);
ReplaceWithValue(node, value, effect, control); ReplaceWithValue(node, value, effect, control);
return Replace(value); return Replace(value);
} }
CHECK(feedback->IsPropertyCell()); // Lookup the {name} on the global object instead.
// The wanted name belongs (or did belong) to a property on the global object return ReduceGlobalAccess(node, nullptr, value, name.object(),
// and the feedback is the cell holding its value. AccessMode::kStore);
return ReduceGlobalAccess(node, nullptr, value, p.name(), AccessMode::kStore,
nullptr, Handle<PropertyCell>::cast(feedback));
} }
Reduction JSNativeContextSpecialization::ReduceNamedAccess( Reduction JSNativeContextSpecialization::ReduceNamedAccess(
......
...@@ -112,9 +112,6 @@ class V8_EXPORT_PRIVATE JSNativeContextSpecialization final ...@@ -112,9 +112,6 @@ class V8_EXPORT_PRIVATE JSNativeContextSpecialization final
Reduction ReduceGlobalAccess(Node* node, Node* receiver, Node* value, Reduction ReduceGlobalAccess(Node* node, Node* receiver, Node* value,
Handle<Name> name, AccessMode access_mode, Handle<Name> name, AccessMode access_mode,
Node* index = nullptr); Node* index = nullptr);
Reduction ReduceGlobalAccess(Node* node, Node* receiver, Node* value,
Handle<Name> name, AccessMode access_mode,
Node* index, Handle<PropertyCell> property_cell);
Reduction ReduceSoftDeoptimize(Node* node, DeoptimizeReason reason); Reduction ReduceSoftDeoptimize(Node* node, DeoptimizeReason reason);
Reduction ReduceJSToString(Node* node); Reduction ReduceJSToString(Node* node);
......
...@@ -725,23 +725,16 @@ void FeedbackNexus::ConfigurePropertyCellMode(Handle<PropertyCell> cell) { ...@@ -725,23 +725,16 @@ void FeedbackNexus::ConfigurePropertyCellMode(Handle<PropertyCell> cell) {
} }
bool FeedbackNexus::ConfigureLexicalVarMode(int script_context_index, bool FeedbackNexus::ConfigureLexicalVarMode(int script_context_index,
int context_slot_index, int context_slot_index) {
bool immutable) {
DCHECK(IsGlobalICKind(kind())); DCHECK(IsGlobalICKind(kind()));
DCHECK_LE(0, script_context_index); DCHECK_LE(0, script_context_index);
DCHECK_LE(0, context_slot_index); DCHECK_LE(0, context_slot_index);
if (!ContextIndexBits::is_valid(script_context_index) || if (!ContextIndexBits::is_valid(script_context_index) ||
!SlotIndexBits::is_valid(context_slot_index) || !SlotIndexBits::is_valid(context_slot_index)) {
!ImmutabilityBit::is_valid(immutable)) {
return false; return false;
} }
int config = ContextIndexBits::encode(script_context_index) | int config = ContextIndexBits::encode(script_context_index) |
SlotIndexBits::encode(context_slot_index) | SlotIndexBits::encode(context_slot_index);
ImmutabilityBit::encode(immutable);
// Force {config} to be in Smi range by propagating the most significant Smi
// bit. This does not change any of the bitfield's bits.
config = (config << (32 - kSmiValueSize)) >> (32 - kSmiValueSize);
SetFeedback(Smi::FromInt(config)); SetFeedback(Smi::FromInt(config));
Isolate* isolate = GetIsolate(); Isolate* isolate = GetIsolate();
......
...@@ -666,8 +666,8 @@ class FeedbackNexus final { ...@@ -666,8 +666,8 @@ class FeedbackNexus final {
// For Global Load and Store ICs. // For Global Load and Store ICs.
void ConfigurePropertyCellMode(Handle<PropertyCell> cell); void ConfigurePropertyCellMode(Handle<PropertyCell> cell);
// Returns false if given combination of indices is not allowed. // Returns false if given combination of indices is not allowed.
bool ConfigureLexicalVarMode(int script_context_index, int context_slot_index, bool ConfigureLexicalVarMode(int script_context_index,
bool immutable); int context_slot_index);
void ConfigureHandlerMode(const MaybeObjectHandle& handler); void ConfigureHandlerMode(const MaybeObjectHandle& handler);
// For CloneObject ICs // For CloneObject ICs
...@@ -677,8 +677,7 @@ class FeedbackNexus final { ...@@ -677,8 +677,7 @@ class FeedbackNexus final {
// Bit positions in a smi that encodes lexical environment variable access. // Bit positions in a smi that encodes lexical environment variable access.
#define LEXICAL_MODE_BIT_FIELDS(V, _) \ #define LEXICAL_MODE_BIT_FIELDS(V, _) \
V(ContextIndexBits, unsigned, 12, _) \ V(ContextIndexBits, unsigned, 12, _) \
V(SlotIndexBits, unsigned, 18, _) \ V(SlotIndexBits, unsigned, 19, _)
V(ImmutabilityBit, bool, 1, _)
DEFINE_BIT_FIELDS(LEXICAL_MODE_BIT_FIELDS) DEFINE_BIT_FIELDS(LEXICAL_MODE_BIT_FIELDS)
#undef LEXICAL_MODE_BIT_FIELDS #undef LEXICAL_MODE_BIT_FIELDS
......
...@@ -502,9 +502,8 @@ MaybeHandle<Object> LoadGlobalIC::Load(Handle<Name> name) { ...@@ -502,9 +502,8 @@ MaybeHandle<Object> LoadGlobalIC::Load(Handle<Name> name) {
} }
if (FLAG_use_ic) { if (FLAG_use_ic) {
if (nexus()->ConfigureLexicalVarMode( if (nexus()->ConfigureLexicalVarMode(lookup_result.context_index,
lookup_result.context_index, lookup_result.slot_index, lookup_result.slot_index)) {
lookup_result.mode == VariableMode::kConst)) {
TRACE_HANDLER_STATS(isolate(), LoadGlobalIC_LoadScriptContextField); TRACE_HANDLER_STATS(isolate(), LoadGlobalIC_LoadScriptContextField);
} else { } else {
// Given combination of indices can't be encoded, so use slow stub. // Given combination of indices can't be encoded, so use slow stub.
...@@ -1362,9 +1361,8 @@ MaybeHandle<Object> StoreGlobalIC::Store(Handle<Name> name, ...@@ -1362,9 +1361,8 @@ MaybeHandle<Object> StoreGlobalIC::Store(Handle<Name> name,
} }
if (FLAG_use_ic) { if (FLAG_use_ic) {
if (nexus()->ConfigureLexicalVarMode( if (nexus()->ConfigureLexicalVarMode(lookup_result.context_index,
lookup_result.context_index, lookup_result.slot_index, lookup_result.slot_index)) {
lookup_result.mode == VariableMode::kConst)) {
TRACE_HANDLER_STATS(isolate(), StoreGlobalIC_StoreScriptContextField); TRACE_HANDLER_STATS(isolate(), StoreGlobalIC_StoreScriptContextField);
} else { } else {
// Given combination of indices can't be encoded, so use slow stub. // Given combination of indices can't be encoded, so use slow stub.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment