Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Unified Diff: src/compiler/escape-analysis.cc

Issue 1619103004: [turbofan] Minor performance tweaks in escape analysis (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@perf-improv-2
Patch Set: Unstage Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/compiler/escape-analysis-reducer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/escape-analysis.cc
diff --git a/src/compiler/escape-analysis.cc b/src/compiler/escape-analysis.cc
index cc7e184efad20a3e10073ce6f3a5655ed867f906..822ba1b3c367e599aef901fc1377f7cd18e53f38 100644
--- a/src/compiler/escape-analysis.cc
+++ b/src/compiler/escape-analysis.cc
@@ -166,8 +166,8 @@ bool VirtualObject::UpdateFrom(const VirtualObject& other) {
class VirtualState : public ZoneObject {
public:
- VirtualState(Node* owner, Zone* zone, size_t size);
- VirtualState(Node* owner, const VirtualState& states);
+ VirtualState(NodeId owner, Zone* zone, size_t size);
+ VirtualState(NodeId owner, const VirtualState& states);
VirtualObject* VirtualObjectFromAlias(size_t alias);
VirtualObject* GetOrCreateTrackedVirtualObject(Alias alias, NodeId id,
@@ -179,7 +179,7 @@ class VirtualState : public ZoneObject {
bool MergeFrom(MergeCache* cache, Zone* zone, Graph* graph,
CommonOperatorBuilder* common, Node* control, int arity);
size_t size() const { return info_.size(); }
- Node* owner() const { return owner_; }
+ NodeId owner() const { return owner_; }
VirtualObject* Copy(VirtualObject* obj, Alias alias);
void SetCopyRequired() {
for (VirtualObject* obj : info_) {
@@ -189,7 +189,7 @@ class VirtualState : public ZoneObject {
private:
ZoneVector<VirtualObject*> info_;
- Node* owner_;
+ NodeId owner_;
DISALLOW_COPY_AND_ASSIGN(VirtualState);
};
@@ -272,11 +272,11 @@ Node* MergeCache::GetFields(size_t pos) {
}
-VirtualState::VirtualState(Node* owner, Zone* zone, size_t size)
+VirtualState::VirtualState(NodeId owner, Zone* zone, size_t size)
: info_(size, nullptr, zone), owner_(owner) {}
-VirtualState::VirtualState(Node* owner, const VirtualState& state)
+VirtualState::VirtualState(NodeId owner, const VirtualState& state)
: info_(state.info_.size(), nullptr, state.info_.get_allocator().zone()),
owner_(owner) {
for (size_t i = 0; i < info_.size(); ++i) {
@@ -879,6 +879,7 @@ bool EscapeStatusAnalysis::IsNotReachable(Node* node) {
void EscapeAnalysis::RunObjectAnalysis() {
virtual_states_.resize(graph()->NodeCount());
stack().push_back(graph()->start());
+ ZoneVector<Node*> danglers(zone());
while (!stack().empty()) {
Node* node = stack().back();
stack().pop_back();
@@ -893,23 +894,13 @@ void EscapeAnalysis::RunObjectAnalysis() {
use->opcode() != IrOpcode::kLoadElement) ||
!IsDanglingEffectNode(use)) {
stack().push_back(use);
+ } else {
+ danglers.push_back(use);
}
}
}
- // First process loads: dangling loads are a problem otherwise.
- for (Edge edge : node->use_edges()) {
- Node* use = edge.from();
- if (IsNotReachable(use)) {
- continue;
- }
- if (NodeProperties::IsEffectEdge(edge)) {
- if ((use->opcode() == IrOpcode::kLoadField ||
- use->opcode() == IrOpcode::kLoadElement) &&
- IsDanglingEffectNode(use)) {
- stack().push_back(use);
- }
- }
- }
+ stack().insert(stack().end(), danglers.begin(), danglers.end());
+ danglers.clear();
}
}
#ifdef DEBUG
@@ -924,10 +915,10 @@ bool EscapeStatusAnalysis::IsDanglingEffectNode(Node* node) {
if (status_[node->id()] & kDanglingComputed) {
return status_[node->id()] & kDangling;
}
- if (node->op()->EffectInputCount() == 0) return false;
- if (node->op()->EffectOutputCount() == 0) return false;
- if (node->op()->EffectInputCount() == 1 &&
- NodeProperties::GetEffectInput(node)->opcode() == IrOpcode::kStart) {
+ if (node->op()->EffectInputCount() == 0 ||
+ node->op()->EffectOutputCount() == 0 ||
+ (node->op()->EffectInputCount() == 1 &&
+ NodeProperties::GetEffectInput(node)->opcode() == IrOpcode::kStart)) {
// The start node is used as sentinel for nodes that are in general
// effectful, but of which an analysis has determined that they do not
// produce effects in this instance. We don't consider these nodes dangling.
@@ -956,10 +947,10 @@ bool EscapeStatusAnalysis::IsEffectBranchPoint(Node* node) {
Node* use = edge.from();
if (aliases_[use->id()] == kNotReachable) continue;
if (NodeProperties::IsEffectEdge(edge)) {
- if ((node->opcode() == IrOpcode::kLoadField ||
- node->opcode() == IrOpcode::kLoadElement ||
- node->opcode() == IrOpcode::kLoad) &&
- IsDanglingEffectNode(node))
+ if ((use->opcode() == IrOpcode::kLoadField ||
+ use->opcode() == IrOpcode::kLoadElement ||
+ use->opcode() == IrOpcode::kLoad) &&
+ IsDanglingEffectNode(use))
continue;
if (++count > 1) {
status_[node->id()] |= kBranchPointComputed | kBranchPoint;
@@ -1048,8 +1039,8 @@ void EscapeAnalysis::ProcessAllocationUsers(Node* node) {
VirtualState* EscapeAnalysis::CopyForModificationAt(VirtualState* state,
Node* node) {
- if (state->owner() != node) {
- VirtualState* new_state = new (zone()) VirtualState(node, *state);
+ if (state->owner() != node->id()) {
+ VirtualState* new_state = new (zone()) VirtualState(node->id(), *state);
virtual_states_[node->id()] = new_state;
TRACE("Copying virtual state %p to new state %p at node %s#%d\n",
static_cast<void*>(state), static_cast<void*>(new_state),
@@ -1087,7 +1078,7 @@ void EscapeAnalysis::ForwardVirtualState(Node* node) {
if (effect->opcode() == IrOpcode::kEffectPhi &&
virtual_states_[effect->id()] == nullptr) {
VirtualState* state =
- new (zone()) VirtualState(effect, zone(), AliasCount());
+ new (zone()) VirtualState(effect->id(), zone(), AliasCount());
virtual_states_[effect->id()] = state;
TRACE("Effect Phi #%d got new virtual state %p.\n", effect->id(),
static_cast<void*>(virtual_states_[effect->id()]));
@@ -1116,7 +1107,7 @@ void EscapeAnalysis::ForwardVirtualState(Node* node) {
void EscapeAnalysis::ProcessStart(Node* node) {
DCHECK_EQ(node->opcode(), IrOpcode::kStart);
virtual_states_[node->id()] =
- new (zone()) VirtualState(node, zone(), AliasCount());
+ new (zone()) VirtualState(node->id(), zone(), AliasCount());
}
@@ -1126,7 +1117,7 @@ bool EscapeAnalysis::ProcessEffectPhi(Node* node) {
VirtualState* mergeState = virtual_states_[node->id()];
if (!mergeState) {
- mergeState = new (zone()) VirtualState(node, zone(), AliasCount());
+ mergeState = new (zone()) VirtualState(node->id(), zone(), AliasCount());
virtual_states_[node->id()] = mergeState;
changed = true;
TRACE("Effect Phi #%d got new virtual state %p.\n", node->id(),
@@ -1144,7 +1135,8 @@ bool EscapeAnalysis::ProcessEffectPhi(Node* node) {
if (state) {
cache_->states().push_back(state);
if (state == mergeState) {
- mergeState = new (zone()) VirtualState(node, zone(), AliasCount());
+ mergeState =
+ new (zone()) VirtualState(node->id(), zone(), AliasCount());
virtual_states_[node->id()] = mergeState;
changed = true;
}
« no previous file with comments | « no previous file | src/compiler/escape-analysis-reducer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698