Line data Source code
1 : // 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 :
9 : namespace v8 {
10 : namespace internal {
11 : namespace compiler {
12 :
13 1392522 : CheckpointElimination::CheckpointElimination(Editor* editor)
14 1392522 : : AdvancedReducer(editor) {}
15 :
16 : namespace {
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.
21 9295768 : bool IsRedundantCheckpoint(Node* node) {
22 9295768 : Node* effect = NodeProperties::GetEffectInput(node);
23 24653384 : while (effect->op()->HasProperty(Operator::kNoWrite) &&
24 : effect->op()->EffectInputCount() == 1) {
25 4839981 : if (effect->opcode() == IrOpcode::kCheckpoint) return true;
26 4249451 : effect = NodeProperties::GetEffectInput(effect);
27 : }
28 : return false;
29 : }
30 :
31 : } // namespace
32 :
33 9295764 : Reduction CheckpointElimination::ReduceCheckpoint(Node* node) {
34 : DCHECK_EQ(IrOpcode::kCheckpoint, node->opcode());
35 9295764 : if (IsRedundantCheckpoint(node)) {
36 590536 : return Replace(NodeProperties::GetEffectInput(node));
37 : }
38 : return NoChange();
39 : }
40 :
41 103827317 : Reduction CheckpointElimination::Reduce(Node* node) {
42 : DisallowHeapAccess no_heap_access;
43 103827317 : switch (node->opcode()) {
44 : case IrOpcode::kCheckpoint:
45 9295764 : return ReduceCheckpoint(node);
46 : default:
47 : break;
48 : }
49 : return NoChange();
50 : }
51 :
52 : } // namespace compiler
53 : } // namespace internal
54 122004 : } // namespace v8
|