LCOV - code coverage report
Current view: top level - src/compiler - operator-properties.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 21 21 100.0 %
Date: 2017-10-20 Functions: 4 4 100.0 %

          Line data    Source code
       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             : 
      11             : namespace v8 {
      12             : namespace internal {
      13             : namespace compiler {
      14             : 
      15             : // static
      16   978440999 : bool OperatorProperties::HasContextInput(const Operator* op) {
      17   978440999 :   IrOpcode::Value opcode = static_cast<IrOpcode::Value>(op->opcode());
      18   978148330 :   return IrOpcode::IsJsOpcode(opcode);
      19             : }
      20             : 
      21             : 
      22             : // static
      23   955672201 : bool OperatorProperties::HasFrameStateInput(const Operator* op) {
      24   955672201 :   switch (op->opcode()) {
      25             :     case IrOpcode::kCheckpoint:
      26             :     case IrOpcode::kFrameState:
      27             :       return true;
      28             :     case IrOpcode::kJSCallRuntime: {
      29     8073162 :       const CallRuntimeParameters& p = CallRuntimeParametersOf(op);
      30     8073163 :       return Linkage::NeedsFrameStateInput(p.id());
      31             :     }
      32             : 
      33             :     // Strict equality cannot lazily deoptimize.
      34             :     case IrOpcode::kJSStrictEqual:
      35     3945183 :       return false;
      36             : 
      37             :     // Generator creation cannot call back into arbitrary JavaScript.
      38             :     case IrOpcode::kJSCreateGeneratorObject:
      39       11194 :       return false;
      40             : 
      41             :     // Binary operations
      42             :     case IrOpcode::kJSAdd:
      43             :     case IrOpcode::kJSSubtract:
      44             :     case IrOpcode::kJSMultiply:
      45             :     case IrOpcode::kJSDivide:
      46             :     case IrOpcode::kJSModulus:
      47             : 
      48             :     // Bitwise operations
      49             :     case IrOpcode::kJSBitwiseOr:
      50             :     case IrOpcode::kJSBitwiseXor:
      51             :     case IrOpcode::kJSBitwiseAnd:
      52             : 
      53             :     // Shift operations
      54             :     case IrOpcode::kJSShiftLeft:
      55             :     case IrOpcode::kJSShiftRight:
      56             :     case IrOpcode::kJSShiftRightLogical:
      57             : 
      58             :     // Compare operations
      59             :     case IrOpcode::kJSEqual:
      60             :     case IrOpcode::kJSGreaterThan:
      61             :     case IrOpcode::kJSGreaterThanOrEqual:
      62             :     case IrOpcode::kJSLessThan:
      63             :     case IrOpcode::kJSLessThanOrEqual:
      64             :     case IrOpcode::kJSHasProperty:
      65             :     case IrOpcode::kJSHasInPrototypeChain:
      66             :     case IrOpcode::kJSInstanceOf:
      67             :     case IrOpcode::kJSOrdinaryHasInstance:
      68             : 
      69             :     // Object operations
      70             :     case IrOpcode::kJSCreate:
      71             :     case IrOpcode::kJSCreateArguments:
      72             :     case IrOpcode::kJSCreateArray:
      73             :     case IrOpcode::kJSCreateLiteralArray:
      74             :     case IrOpcode::kJSCreateLiteralObject:
      75             :     case IrOpcode::kJSCreateLiteralRegExp:
      76             : 
      77             :     // Property access operations
      78             :     case IrOpcode::kJSLoadNamed:
      79             :     case IrOpcode::kJSStoreNamed:
      80             :     case IrOpcode::kJSLoadProperty:
      81             :     case IrOpcode::kJSStoreProperty:
      82             :     case IrOpcode::kJSLoadGlobal:
      83             :     case IrOpcode::kJSStoreGlobal:
      84             :     case IrOpcode::kJSStoreNamedOwn:
      85             :     case IrOpcode::kJSStoreDataPropertyInLiteral:
      86             :     case IrOpcode::kJSDeleteProperty:
      87             : 
      88             :     // Context operations
      89             :     case IrOpcode::kJSCreateScriptContext:
      90             : 
      91             :     // Conversions
      92             :     case IrOpcode::kJSToInteger:
      93             :     case IrOpcode::kJSToLength:
      94             :     case IrOpcode::kJSToName:
      95             :     case IrOpcode::kJSToNumber:
      96             :     case IrOpcode::kJSToObject:
      97             :     case IrOpcode::kJSToString:
      98             : 
      99             :     // Call operations
     100             :     case IrOpcode::kJSConstructForwardVarargs:
     101             :     case IrOpcode::kJSConstruct:
     102             :     case IrOpcode::kJSConstructWithArrayLike:
     103             :     case IrOpcode::kJSConstructWithSpread:
     104             :     case IrOpcode::kJSCallForwardVarargs:
     105             :     case IrOpcode::kJSCall:
     106             :     case IrOpcode::kJSCallWithArrayLike:
     107             :     case IrOpcode::kJSCallWithSpread:
     108             : 
     109             :     // Misc operations
     110             :     case IrOpcode::kJSForInEnumerate:
     111             :     case IrOpcode::kJSForInNext:
     112             :     case IrOpcode::kJSStackCheck:
     113             :     case IrOpcode::kJSDebugger:
     114             :     case IrOpcode::kJSGetSuperConstructor:
     115             :       return true;
     116             : 
     117             :     default:
     118   732099854 :       return false;
     119             :   }
     120             : }
     121             : 
     122             : 
     123             : // static
     124      878007 : int OperatorProperties::GetTotalInputCount(const Operator* op) {
     125      585338 :   return op->ValueInputCount() + GetContextInputCount(op) +
     126      292669 :          GetFrameStateInputCount(op) + op->EffectInputCount() +
     127      292669 :          op->ControlInputCount();
     128             : }
     129             : 
     130             : 
     131             : // static
     132          42 : bool OperatorProperties::IsBasicBlockBegin(const Operator* op) {
     133             :   Operator::Opcode const opcode = op->opcode();
     134          42 :   return opcode == IrOpcode::kStart || opcode == IrOpcode::kEnd ||
     135          42 :          opcode == IrOpcode::kDead || opcode == IrOpcode::kLoop ||
     136          42 :          opcode == IrOpcode::kMerge || opcode == IrOpcode::kIfTrue ||
     137          42 :          opcode == IrOpcode::kIfFalse || opcode == IrOpcode::kIfSuccess ||
     138          84 :          opcode == IrOpcode::kIfException || opcode == IrOpcode::kIfValue ||
     139          42 :          opcode == IrOpcode::kIfDefault;
     140             : }
     141             : 
     142             : }  // namespace compiler
     143             : }  // namespace internal
     144             : }  // namespace v8

Generated by: LCOV version 1.10