summaryrefslogtreecommitdiff
path: root/chromium/v8/src/compiler/escape-analysis.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/v8/src/compiler/escape-analysis.cc')
-rw-r--r--chromium/v8/src/compiler/escape-analysis.cc40
1 files changed, 27 insertions, 13 deletions
diff --git a/chromium/v8/src/compiler/escape-analysis.cc b/chromium/v8/src/compiler/escape-analysis.cc
index 45829734c5d..ab2b06a9528 100644
--- a/chromium/v8/src/compiler/escape-analysis.cc
+++ b/chromium/v8/src/compiler/escape-analysis.cc
@@ -125,7 +125,18 @@ class VariableTracker {
public:
Scope(VariableTracker* tracker, Node* node, Reduction* reduction);
~Scope();
- Node* Get(Variable var) { return current_state_.Get(var); }
+ Maybe<Node*> Get(Variable var) {
+ Node* node = current_state_.Get(var);
+ if (node && node->opcode() == IrOpcode::kDead) {
+ // TODO(tebbi): We use {Dead} as a sentinel for uninitialized memory.
+ // Reading uninitialized memory can only happen in unreachable code. In
+ // this case, we have to mark the object as escaping to avoid dead nodes
+ // in the graph. This is a workaround that should be removed once we can
+ // handle dead nodes everywhere.
+ return Nothing<Node*>();
+ }
+ return Just(node);
+ }
void Set(Variable var, Node* node) { current_state_.Set(var, node); }
private:
@@ -585,14 +596,12 @@ void ReduceNode(const Operator* op, EscapeAnalysisTracker::Scope* current,
Node* object = current->ValueInput(0);
const VirtualObject* vobject = current->GetVirtualObject(object);
Variable var;
+ Node* value;
if (vobject && !vobject->HasEscaped() &&
- vobject->FieldAt(OffsetOfFieldAccess(op)).To(&var)) {
- current->SetReplacement(current->Get(var));
+ vobject->FieldAt(OffsetOfFieldAccess(op)).To(&var) &&
+ current->Get(var).To(&value)) {
+ current->SetReplacement(value);
} else {
- // TODO(tebbi): At the moment, we mark objects as escaping if there
- // is a load from an invalid location to avoid dead nodes. This is a
- // workaround that should be removed once we can handle dead nodes
- // everywhere.
current->SetEscaped(object);
}
break;
@@ -603,10 +612,11 @@ void ReduceNode(const Operator* op, EscapeAnalysisTracker::Scope* current,
const VirtualObject* vobject = current->GetVirtualObject(object);
int offset;
Variable var;
+ Node* value;
if (vobject && !vobject->HasEscaped() &&
OffsetOfElementsAccess(op, index).To(&offset) &&
- vobject->FieldAt(offset).To(&var)) {
- current->SetReplacement(current->Get(var));
+ vobject->FieldAt(offset).To(&var) && current->Get(var).To(&value)) {
+ current->SetReplacement(value);
} else {
current->SetEscaped(object);
}
@@ -656,9 +666,11 @@ void ReduceNode(const Operator* op, EscapeAnalysisTracker::Scope* current,
Node* checked = current->ValueInput(0);
const VirtualObject* vobject = current->GetVirtualObject(checked);
Variable map_field;
+ Node* map;
if (vobject && !vobject->HasEscaped() &&
- vobject->FieldAt(HeapObject::kMapOffset).To(&map_field)) {
- if (Node* map = current->Get(map_field)) {
+ vobject->FieldAt(HeapObject::kMapOffset).To(&map_field) &&
+ current->Get(map_field).To(&map)) {
+ if (map) {
Type* const map_type = NodeProperties::GetType(map);
if (map_type->IsHeapConstant() &&
params.maps().contains(ZoneHandleSet<Map>(bit_cast<Handle<Map>>(
@@ -679,9 +691,11 @@ void ReduceNode(const Operator* op, EscapeAnalysisTracker::Scope* current,
Node* object = current->ValueInput(0);
const VirtualObject* vobject = current->GetVirtualObject(object);
Variable map_field;
+ Node* object_map;
if (vobject && !vobject->HasEscaped() &&
- vobject->FieldAt(HeapObject::kMapOffset).To(&map_field)) {
- if (Node* object_map = current->Get(map_field)) {
+ vobject->FieldAt(HeapObject::kMapOffset).To(&map_field) &&
+ current->Get(map_field).To(&object_map)) {
+ if (object_map) {
current->SetReplacement(LowerCompareMapsWithoutLoad(
object_map, CompareMapsParametersOf(op), jsgraph));
break;