[turbofan] Fixed divergence in escape analysis.

This fixes a bug where the re-creation of phi nodes leads to divergence. The fix makes sure that once a node created a phi node, it sticks to it and does not forget about it, even if the inputs suddenly agree again. The bug appeared on the trybots in https://codereview.chromium.org/2512733003/.

Also I added a line to mark effect phi nodes on the queue. This is unrelated, but seems to be an obvious ommission.

R=bmeurer@chromium.org
BUG=v8:5633

Review-Url: https://codereview.chromium.org/2522253002
Cr-Commit-Position: refs/heads/master@{#41239}
This commit is contained in:
tebbi 2016-11-23 21:49:27 -08:00 committed by Commit bot
parent 5ae3dccad0
commit 14f81dd2d2

View File

@ -476,7 +476,8 @@ bool VirtualObject::MergeFrom(MergeCache* cache, Node* at, Graph* graph,
at->opcode() == IrOpcode::kPhi);
bool changed = false;
for (size_t i = 0; i < field_count(); ++i) {
if (Node* field = cache->GetFields(i)) {
Node* field = cache->GetFields(i);
if (field && !IsCreatedPhi(i)) {
changed = changed || GetField(i) != field;
SetField(i, field);
TRACE(" Field %zu agree on rep #%d\n", i, field->id());
@ -966,6 +967,7 @@ void EscapeAnalysis::RunObjectAnalysis() {
// VirtualObjects, and we want to delay phis to improve performance.
if (use->opcode() == IrOpcode::kEffectPhi) {
if (!status_analysis_->IsInQueue(use->id())) {
status_analysis_->SetInQueue(use->id(), true);
queue.push_front(use);
}
} else if ((use->opcode() != IrOpcode::kLoadField &&