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

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

Issue 1485183002: [turbofan] Deopt support for escape analysis (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@ea-local
Patch Set: Created 5 years 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
Index: src/compiler/escape-analysis.cc
diff --git a/src/compiler/escape-analysis.cc b/src/compiler/escape-analysis.cc
index 5dee0231d69d37307a21701fe0ad4a7d411665cf..fe745cc69bdd099573b474c48cb4878763fcfede 100644
--- a/src/compiler/escape-analysis.cc
+++ b/src/compiler/escape-analysis.cc
@@ -432,13 +432,18 @@ void EscapeStatusAnalysis::DebugPrint() {
EscapeObjectAnalysis::EscapeObjectAnalysis(Graph* graph,
CommonOperatorBuilder* common,
Zone* zone)
- : graph_(graph), common_(common), zone_(zone), virtual_states_(zone) {}
+ : graph_(graph),
+ common_(common),
+ zone_(zone),
+ virtual_states_(zone),
+ effects_(zone) {}
EscapeObjectAnalysis::~EscapeObjectAnalysis() {}
void EscapeObjectAnalysis::Run() {
+ effects_.resize(graph()->NodeCount());
virtual_states_.resize(graph()->NodeCount());
ZoneVector<Node*> queue(zone());
queue.push_back(graph()->start());
@@ -485,6 +490,33 @@ bool EscapeObjectAnalysis::IsDanglingEffectNode(Node* node) {
}
+void EscapeObjectAnalysis::RecordEffectForFrameStateUses(Node* node,
+ Node* effect) {
+ DCHECK(effect->op()->EffectInputCount() > 0);
+ ZoneVector<Node*> queue(zone());
+ queue.push_back(node);
Jarin 2015/12/02 12:24:34 Nit: why is it called a queue when it is a stack?
sigurds 2015/12/02 16:35:12 Done.
+ while (!queue.empty()) {
+ Node* cur = queue.back();
+ queue.pop_back();
+ for (Edge edge : cur->input_edges()) {
+ Node* input = edge.to();
+ if (input->opcode() == IrOpcode::kFrameState ||
+ input->opcode() == IrOpcode::kStateValues) {
+ if (effects_[input->id()] != effect) {
+ effects_[input->id()] = effect;
+ if (FLAG_trace_turbo_escape) {
+ PrintF("Recorded effect #%d (%s) for frame state %d\n",
+ effect->id(), effect->op()->mnemonic(), input->id());
+ }
+ }
+ // climb up the chain.
+ queue.push_back(input);
+ }
+ }
+ }
+}
+
+
bool EscapeObjectAnalysis::Process(Node* node) {
switch (node->opcode()) {
case IrOpcode::kAllocate:
@@ -511,6 +543,7 @@ bool EscapeObjectAnalysis::Process(Node* node) {
default:
if (node->op()->EffectInputCount() > 0) {
ForwardVirtualState(node);
+ RecordEffectForFrameStateUses(node, node);
}
break;
}
@@ -678,6 +711,19 @@ Node* EscapeObjectAnalysis::GetReplacement(Node* at, NodeId id) {
}
+VirtualObject* EscapeObjectAnalysis::GetVirtualObject(Node* at, NodeId id) {
+ if (VirtualState* states = virtual_states_[at->id()]) {
+ return states->GetVirtualObject(id);
+ }
+ return nullptr;
+}
+
+
+Node* EscapeObjectAnalysis::GetEffect(Node* node) {
+ return effects_[node->id()];
+}
+
+
int EscapeObjectAnalysis::OffsetFromAccess(Node* node) {
DCHECK(OpParameter<FieldAccess>(node).offset % kPointerSize == 0);
return OpParameter<FieldAccess>(node).offset / kPointerSize;

Powered by Google App Engine
This is Rietveld 408576698