[turbofan] Extend escape analysis to reduce certain CheckMaps.
Enable the experimental support in escape analysis to deal with constant-foldable CheckMaps nodes and remove them from the effect chain w/o blocking the scalar replacement of the object. BUG=v8:4586,v8:5267 R=tebbi@chromium.org Review-Url: https://codereview.chromium.org/2964473002 Cr-Commit-Position: refs/heads/master@{#46311}
This commit is contained in:
parent
73ce185915
commit
adf7f54e24
@ -1517,33 +1517,30 @@ void EscapeAnalysis::ProcessCheckMaps(Node* node) {
|
||||
DCHECK_EQ(node->opcode(), IrOpcode::kCheckMaps);
|
||||
ForwardVirtualState(node);
|
||||
Node* checked = ResolveReplacement(NodeProperties::GetValueInput(node, 0));
|
||||
if (FLAG_turbo_experimental) {
|
||||
VirtualState* state = virtual_states_[node->id()];
|
||||
if (VirtualObject* object = GetVirtualObject(state, checked)) {
|
||||
if (!object->IsTracked()) {
|
||||
if (status_analysis_->SetEscaped(node)) {
|
||||
TRACE(
|
||||
"Setting #%d (%s) to escaped because checked object #%i is not "
|
||||
"tracked\n",
|
||||
node->id(), node->op()->mnemonic(), object->id());
|
||||
}
|
||||
return;
|
||||
VirtualState* state = virtual_states_[node->id()];
|
||||
if (VirtualObject* object = GetVirtualObject(state, checked)) {
|
||||
if (!object->IsTracked()) {
|
||||
if (status_analysis_->SetEscaped(node)) {
|
||||
TRACE(
|
||||
"Setting #%d (%s) to escaped because checked object #%i is not "
|
||||
"tracked\n",
|
||||
node->id(), node->op()->mnemonic(), object->id());
|
||||
}
|
||||
CheckMapsParameters params = CheckMapsParametersOf(node->op());
|
||||
return;
|
||||
}
|
||||
CheckMapsParameters params = CheckMapsParametersOf(node->op());
|
||||
|
||||
Node* value = object->GetField(HeapObject::kMapOffset / kPointerSize);
|
||||
if (value) {
|
||||
value = ResolveReplacement(value);
|
||||
// TODO(tebbi): We want to extend this beyond constant folding with a
|
||||
// CheckMapsValue operator that takes the load-eliminated map value as
|
||||
// input.
|
||||
if (value->opcode() == IrOpcode::kHeapConstant &&
|
||||
params.maps().contains(ZoneHandleSet<Map>(
|
||||
Handle<Map>::cast(OpParameter<Handle<HeapObject>>(value))))) {
|
||||
TRACE("CheckMaps #%i seems to be redundant (until now).\n",
|
||||
node->id());
|
||||
return;
|
||||
}
|
||||
Node* value = object->GetField(HeapObject::kMapOffset / kPointerSize);
|
||||
if (value) {
|
||||
value = ResolveReplacement(value);
|
||||
// TODO(tebbi): We want to extend this beyond constant folding with a
|
||||
// CheckMapsValue operator that takes the load-eliminated map value as
|
||||
// input.
|
||||
if (value->opcode() == IrOpcode::kHeapConstant &&
|
||||
params.maps().contains(ZoneHandleSet<Map>(
|
||||
Handle<Map>::cast(OpParameter<Handle<HeapObject>>(value))))) {
|
||||
TRACE("CheckMaps #%i seems to be redundant (until now).\n", node->id());
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user