| 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 |