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 #include "src/objects-inl.h"
      7 
      8 namespace v8 {
      9 namespace internal {
     10 
     11 void 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 internal
     40 }  // namespace v8
     41