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-sce.h" 6196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 7e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 8e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgnamespace v8 { 9e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgnamespace internal { 10e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 11e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid HStackCheckEliminationPhase::Run() { 12e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // For each loop block walk the dominator tree from the backwards branch to 13e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // the loop header. If a call instruction is encountered the backwards branch 14e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // is dominated by a call and the stack check in the backwards branch can be 15e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // removed. 16e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org for (int i = 0; i < graph()->blocks()->length(); i++) { 17e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org HBasicBlock* block = graph()->blocks()->at(i); 18e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org if (block->IsLoopHeader()) { 19e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org HBasicBlock* back_edge = block->loop_information()->GetLastBackEdge(); 20e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org HBasicBlock* dominator = back_edge; 21e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org while (true) { 22e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org for (HInstructionIterator it(dominator); !it.Done(); it.Advance()) { 23ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org if (it.Current()->HasStackCheck()) { 24e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org block->loop_information()->stack_check()->Eliminate(); 25e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org break; 26e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org } 27e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org } 28e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 29e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // Done when the loop header is processed. 30e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org if (dominator == block) break; 31e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 32e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // Move up the dominator tree. 33e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org dominator = dominator->dominator(); 34e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org } 35e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org } 36e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org } 37e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org} 38e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 39e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org} } // namespace v8::internal 40