Line data Source code
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 283733 : 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 9590758 : for (int i = 0; i < graph()->blocks()->length(); i++) {
17 9311100 : HBasicBlock* block = graph()->blocks()->at(i);
18 4511649 : if (block->IsLoopHeader()) {
19 59921 : HBasicBlock* back_edge = block->loop_information()->GetLastBackEdge();
20 248798 : HBasicBlock* dominator = back_edge;
21 : while (true) {
22 2044825 : for (HInstructionIterator it(dominator); !it.Done(); it.Advance()) {
23 1740180 : if (it.Current()->HasStackCheck()) {
24 4072 : block->loop_information()->stack_check()->Eliminate();
25 : break;
26 : }
27 : }
28 :
29 : // Done when the loop header is processed.
30 308716 : if (dominator == block) break;
31 :
32 : // Move up the dominator tree.
33 : dominator = dominator->dominator();
34 248798 : }
35 : }
36 : }
37 283730 : }
38 :
39 : } // namespace internal
40 : } // namespace v8
|