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