1 // Copyright 2013 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/crankshaft/hydrogen-sce.h" 6 7 namespace v8 { 8 namespace internal { 9 10 void HStackCheckEliminationPhase::Run() { 11 // For each loop block walk the dominator tree from the backwards branch to 12 // the loop header. If a call instruction is encountered the backwards branch 13 // is dominated by a call and the stack check in the backwards branch can be 14 // removed. 15 for (int i = 0; i < graph()->blocks()->length(); i++) { 16 HBasicBlock* block = graph()->blocks()->at(i); 17 if (block->IsLoopHeader()) { 18 HBasicBlock* back_edge = block->loop_information()->GetLastBackEdge(); 19 HBasicBlock* dominator = back_edge; 20 while (true) { 21 for (HInstructionIterator it(dominator); !it.Done(); it.Advance()) { 22 if (it.Current()->HasStackCheck()) { 23 block->loop_information()->stack_check()->Eliminate(); 24 break; 25 } 26 } 27 28 // Done when the loop header is processed. 29 if (dominator == block) break; 30 31 // Move up the dominator tree. 32 dominator = dominator->dominator(); 33 } 34 } 35 } 36 } 37 38 } // namespace internal 39 } // namespace v8 40