• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Run()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