operator-properties.cc revision 958fae7ec3f466955f8e5b50fa5b8d38b9e91675
1// Copyright 2014 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/operator-properties.h" 6 7#include "src/compiler/js-operator.h" 8#include "src/compiler/linkage.h" 9#include "src/compiler/opcodes.h" 10 11namespace v8 { 12namespace internal { 13namespace compiler { 14 15// static 16bool OperatorProperties::HasContextInput(const Operator* op) { 17 IrOpcode::Value opcode = static_cast<IrOpcode::Value>(op->opcode()); 18 return IrOpcode::IsJsOpcode(opcode); 19} 20 21 22// static 23bool OperatorProperties::HasFrameStateInput(const Operator* op) { 24 if (!FLAG_turbo_deoptimization) { 25 return false; 26 } 27 switch (op->opcode()) { 28 case IrOpcode::kFrameState: 29 return true; 30 case IrOpcode::kJSCallRuntime: { 31 const CallRuntimeParameters& p = CallRuntimeParametersOf(op); 32 return Linkage::NeedsFrameState(p.id()); 33 } 34 35 // Strict equality cannot lazily deoptimize. 36 case IrOpcode::kJSStrictEqual: 37 case IrOpcode::kJSStrictNotEqual: 38 return false; 39 40 // Calls 41 case IrOpcode::kJSCallFunction: 42 case IrOpcode::kJSCallConstruct: 43 44 // Compare operations 45 case IrOpcode::kJSEqual: 46 case IrOpcode::kJSGreaterThan: 47 case IrOpcode::kJSGreaterThanOrEqual: 48 case IrOpcode::kJSHasProperty: 49 case IrOpcode::kJSInstanceOf: 50 case IrOpcode::kJSLessThan: 51 case IrOpcode::kJSLessThanOrEqual: 52 case IrOpcode::kJSNotEqual: 53 54 // Binary operations 55 case IrOpcode::kJSAdd: 56 case IrOpcode::kJSBitwiseAnd: 57 case IrOpcode::kJSBitwiseOr: 58 case IrOpcode::kJSBitwiseXor: 59 case IrOpcode::kJSDivide: 60 case IrOpcode::kJSLoadNamed: 61 case IrOpcode::kJSLoadProperty: 62 case IrOpcode::kJSModulus: 63 case IrOpcode::kJSMultiply: 64 case IrOpcode::kJSShiftLeft: 65 case IrOpcode::kJSShiftRight: 66 case IrOpcode::kJSShiftRightLogical: 67 case IrOpcode::kJSStoreNamed: 68 case IrOpcode::kJSStoreProperty: 69 case IrOpcode::kJSSubtract: 70 71 // Conversions 72 case IrOpcode::kJSToObject: 73 74 // Other 75 case IrOpcode::kJSDeleteProperty: 76 return true; 77 78 default: 79 return false; 80 } 81} 82 83 84// static 85int OperatorProperties::GetTotalInputCount(const Operator* op) { 86 return op->ValueInputCount() + GetContextInputCount(op) + 87 GetFrameStateInputCount(op) + op->EffectInputCount() + 88 op->ControlInputCount(); 89} 90 91 92// static 93bool OperatorProperties::IsBasicBlockBegin(const Operator* op) { 94 Operator::Opcode const opcode = op->opcode(); 95 return opcode == IrOpcode::kStart || opcode == IrOpcode::kEnd || 96 opcode == IrOpcode::kDead || opcode == IrOpcode::kLoop || 97 opcode == IrOpcode::kMerge || opcode == IrOpcode::kIfTrue || 98 opcode == IrOpcode::kIfFalse; 99} 100 101} // namespace compiler 102} // namespace internal 103} // namespace v8 104