blob: d81e1096820fbfba966ba1b34f6ee12bd8cac358 [file] [log] [blame]
Ben Murdoch61f157c2016-09-16 13:49:30 +01001// Copyright 2016 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/compiler/checkpoint-elimination.h"
6
7#include "src/compiler/node-properties.h"
8
9namespace v8 {
10namespace internal {
11namespace compiler {
12
13CheckpointElimination::CheckpointElimination(Editor* editor)
14 : AdvancedReducer(editor) {}
15
16namespace {
17
18// The given checkpoint is redundant if it is effect-wise dominated by another
19// checkpoint and there is no observable write in between. For now we consider
20// a linear effect chain only instead of true effect-wise dominance.
21bool IsRedundantCheckpoint(Node* node) {
22 Node* effect = NodeProperties::GetEffectInput(node);
23 while (effect->op()->HasProperty(Operator::kNoWrite) &&
24 effect->op()->EffectInputCount() == 1) {
25 if (effect->opcode() == IrOpcode::kCheckpoint) return true;
26 effect = NodeProperties::GetEffectInput(effect);
27 }
28 return false;
29}
30
31} // namespace
32
33Reduction CheckpointElimination::Reduce(Node* node) {
34 if (node->opcode() != IrOpcode::kCheckpoint) return NoChange();
35 if (IsRedundantCheckpoint(node)) {
36 return Replace(NodeProperties::GetEffectInput(node));
37 }
38 return NoChange();
39}
40
41} // namespace compiler
42} // namespace internal
43} // namespace v8