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 CheckpointElimination(Editor * editor)13CheckpointElimination::CheckpointElimination(Editor* editor) 14 : 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. IsRedundantCheckpoint(Node * node)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 ReduceCheckpoint(Node * node)33Reduction CheckpointElimination::ReduceCheckpoint(Node* node) { 34 DCHECK_EQ(IrOpcode::kCheckpoint, node->opcode()); 35 if (IsRedundantCheckpoint(node)) { 36 return Replace(NodeProperties::GetEffectInput(node)); 37 } 38 return NoChange(); 39 } 40 Reduce(Node * node)41Reduction CheckpointElimination::Reduce(Node* node) { 42 DisallowHeapAccess no_heap_access; 43 switch (node->opcode()) { 44 case IrOpcode::kCheckpoint: 45 return ReduceCheckpoint(node); 46 default: 47 break; 48 } 49 return NoChange(); 50 } 51 52 } // namespace compiler 53 } // namespace internal 54 } // namespace v8 55