1e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-redundant-phi.h" 6e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 7e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgnamespace v8 { 8e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgnamespace internal { 9e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 10e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid HRedundantPhiEliminationPhase::Run() { 1163ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org // Gather all phis from all blocks first. 12e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org const ZoneList<HBasicBlock*>* blocks(graph()->blocks()); 1363ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org ZoneList<HPhi*> all_phis(blocks->length(), zone()); 1463ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org for (int i = 0; i < blocks->length(); ++i) { 1563ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org HBasicBlock* block = blocks->at(i); 1663ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org for (int j = 0; j < block->phis()->length(); j++) { 1763ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org all_phis.Add(block->phis()->at(j), zone()); 18e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org } 1963ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org } 2063ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org 2163ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org // Iteratively reduce all phis in the list. 2263ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org ProcessPhis(&all_phis); 23e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 24e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#if DEBUG 25e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // Make sure that we *really* removed all redundant phis. 26e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org for (int i = 0; i < blocks->length(); ++i) { 27e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org for (int j = 0; j < blocks->at(i)->phis()->length(); j++) { 28e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(blocks->at(i)->phis()->at(j)->GetRedundantReplacement() == NULL); 29e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org } 30e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org } 31e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#endif 32e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org} 33e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 3463ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org 3563ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.orgvoid HRedundantPhiEliminationPhase::ProcessBlock(HBasicBlock* block) { 3663ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org ProcessPhis(block->phis()); 3763ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org} 3863ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org 3963ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org 4063ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.orgvoid HRedundantPhiEliminationPhase::ProcessPhis(const ZoneList<HPhi*>* phis) { 4163ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org bool updated; 4263ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org do { 4363ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org // Iterately replace all redundant phis in the given list. 4463ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org updated = false; 4563ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org for (int i = 0; i < phis->length(); i++) { 4663ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org HPhi* phi = phis->at(i); 4763ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org if (phi->CheckFlag(HValue::kIsDead)) continue; // Already replaced. 4863ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org 4963ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org HValue* replacement = phi->GetRedundantReplacement(); 5063ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org if (replacement != NULL) { 5163ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org phi->SetFlag(HValue::kIsDead); 5263ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) { 5363ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org HValue* value = it.value(); 5463ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org value->SetOperandAt(it.index(), replacement); 5563ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org // Iterate again if used in another non-dead phi. 5663ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org updated |= value->IsPhi() && !value->CheckFlag(HValue::kIsDead); 5763ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org } 5863ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org phi->block()->RemovePhi(phi); 5963ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org } 6063ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org } 6163ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org } while (updated); 6263ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org} 6363ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org 6463ea3d20e0c5531a4bb0853218d5f746117edea1mvstanton@chromium.org 65e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org} } // namespace v8::internal 66