OLD | NEW |
| (Empty) |
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 | |
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 | |
OLD | NEW |