Home | History | Annotate | Download | only in crankshaft
      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