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