blob: 91e91d203344b810bc5c68408f9e395e9d4051c5 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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
7namespace v8 {
8namespace internal {
9
10void 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