LCOV - code coverage report
Current view: top level - src/compiler - js-graph.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 84 87 96.6 %
Date: 2019-04-18 Functions: 33 33 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/js-graph.h"
       6             : 
       7             : #include "src/code-factory.h"
       8             : #include "src/compiler/node-properties.h"
       9             : #include "src/compiler/typer.h"
      10             : #include "src/objects-inl.h"
      11             : 
      12             : namespace v8 {
      13             : namespace internal {
      14             : namespace compiler {
      15             : 
      16             : #define GET_CACHED_FIELD(ptr, expr) (*(ptr)) ? *(ptr) : (*(ptr) = (expr))
      17             : 
      18             : #define DEFINE_GETTER(name, expr) \
      19             :   Node* JSGraph::name() { return GET_CACHED_FIELD(&name##_, expr); }
      20             : 
      21      883460 : Node* JSGraph::CEntryStubConstant(int result_size, SaveFPRegsMode save_doubles,
      22             :                                   ArgvMode argv_mode, bool builtin_exit_frame) {
      23      883460 :   if (save_doubles == kDontSaveFPRegs && argv_mode == kArgvOnStack) {
      24             :     DCHECK(result_size >= 1 && result_size <= 3);
      25      883460 :     if (!builtin_exit_frame) {
      26             :       Node** ptr = nullptr;
      27      880493 :       if (result_size == 1) {
      28      879554 :         ptr = &CEntryStub1Constant_;
      29         939 :       } else if (result_size == 2) {
      30         939 :         ptr = &CEntryStub2Constant_;
      31             :       } else {
      32             :         DCHECK_EQ(3, result_size);
      33           0 :         ptr = &CEntryStub3Constant_;
      34             :       }
      35     1344607 :       return GET_CACHED_FIELD(ptr, HeapConstant(CodeFactory::CEntry(
      36             :                                        isolate(), result_size, save_doubles,
      37             :                                        argv_mode, builtin_exit_frame)));
      38             :     }
      39             :     Node** ptr = builtin_exit_frame ? &CEntryStub1WithBuiltinExitFrameConstant_
      40        2967 :                                     : &CEntryStub1Constant_;
      41        5269 :     return GET_CACHED_FIELD(ptr, HeapConstant(CodeFactory::CEntry(
      42             :                                      isolate(), result_size, save_doubles,
      43             :                                      argv_mode, builtin_exit_frame)));
      44             :   }
      45           0 :   return HeapConstant(CodeFactory::CEntry(isolate(), result_size, save_doubles,
      46           0 :                                           argv_mode, builtin_exit_frame));
      47             : }
      48             : 
      49      893618 : Node* JSGraph::Constant(Handle<Object> value) {
      50             :   // Dereference the handle to determine if a number constant or other
      51             :   // canonicalized node can be used.
      52      893618 :   if (value->IsNumber()) {
      53       81341 :     return Constant(value->Number());
      54      812277 :   } else if (value->IsUndefined(isolate())) {
      55        1534 :     return UndefinedConstant();
      56      810743 :   } else if (value->IsTrue(isolate())) {
      57          19 :     return TrueConstant();
      58      810724 :   } else if (value->IsFalse(isolate())) {
      59          93 :     return FalseConstant();
      60      810631 :   } else if (value->IsNull(isolate())) {
      61         115 :     return NullConstant();
      62      810516 :   } else if (value->IsTheHole(isolate())) {
      63           5 :     return TheHoleConstant();
      64             :   } else {
      65      810511 :     return HeapConstant(Handle<HeapObject>::cast(value));
      66             :   }
      67             : }
      68             : 
      69     1016801 : Node* JSGraph::Constant(const ObjectRef& ref) {
      70     1016801 :   if (ref.IsSmi()) return Constant(ref.AsSmi());
      71             :   OddballType oddball_type =
      72     1003002 :       ref.AsHeapObject().GetHeapObjectType().oddball_type();
      73     1003001 :   if (ref.IsHeapNumber()) {
      74        4473 :     return Constant(ref.AsHeapNumber().value());
      75      998528 :   } else if (oddball_type == OddballType::kUndefined) {
      76             :     DCHECK(ref.object().equals(isolate()->factory()->undefined_value()));
      77        2499 :     return UndefinedConstant();
      78      996029 :   } else if (oddball_type == OddballType::kNull) {
      79             :     DCHECK(ref.object().equals(isolate()->factory()->null_value()));
      80         196 :     return NullConstant();
      81      995833 :   } else if (oddball_type == OddballType::kHole) {
      82             :     DCHECK(ref.object().equals(isolate()->factory()->the_hole_value()));
      83        2509 :     return TheHoleConstant();
      84      993324 :   } else if (oddball_type == OddballType::kBoolean) {
      85      190950 :     if (ref.object().equals(isolate()->factory()->true_value())) {
      86       63710 :       return TrueConstant();
      87             :     } else {
      88             :       DCHECK(ref.object().equals(isolate()->factory()->false_value()));
      89      127240 :       return FalseConstant();
      90             :     }
      91             :   } else {
      92      802374 :     return HeapConstant(ref.AsHeapObject().object());
      93             :   }
      94             : }
      95             : 
      96     3217729 : Node* JSGraph::Constant(double value) {
      97     3919488 :   if (bit_cast<int64_t>(value) == bit_cast<int64_t>(0.0)) return ZeroConstant();
      98     2751835 :   if (bit_cast<int64_t>(value) == bit_cast<int64_t>(1.0)) return OneConstant();
      99     2280105 :   return NumberConstant(value);
     100             : }
     101             : 
     102     3360578 : Node* JSGraph::NumberConstant(double value) {
     103             :   Node** loc = cache_.FindNumberConstant(value);
     104     3360575 :   if (*loc == nullptr) {
     105     5244423 :     *loc = graph()->NewNode(common()->NumberConstant(value));
     106             :   }
     107     3360576 :   return *loc;
     108             : }
     109             : 
     110    12964020 : Node* JSGraph::HeapConstant(Handle<HeapObject> value) {
     111    12964020 :   Node** loc = cache_.FindHeapConstant(value);
     112    12963998 :   if (*loc == nullptr) {
     113    14385822 :     *loc = graph()->NewNode(common()->HeapConstant(value));
     114             :   }
     115    12964012 :   return *loc;
     116             : }
     117             : 
     118     4718582 : void JSGraph::GetCachedNodes(NodeVector* nodes) {
     119     4718582 :   cache_.GetCachedNodes(nodes);
     120             : #define DO_CACHED_FIELD(name) \
     121             :   if (name##_) nodes->push_back(name##_);
     122             : 
     123     4718584 :   CACHED_GLOBAL_LIST(DO_CACHED_FIELD)
     124     4718585 :   CACHED_CENTRY_LIST(DO_CACHED_FIELD)
     125             : #undef DO_CACHED_FIELD
     126     4718587 : }
     127             : 
     128      416926 : DEFINE_GETTER(AllocateInYoungGenerationStubConstant,
     129             :               HeapConstant(BUILTIN_CODE(isolate(), AllocateInYoungGeneration)))
     130             : 
     131        1257 : DEFINE_GETTER(AllocateInOldGenerationStubConstant,
     132             :               HeapConstant(BUILTIN_CODE(isolate(), AllocateInOldGeneration)))
     133             : 
     134         433 : DEFINE_GETTER(ArrayConstructorStubConstant,
     135             :               HeapConstant(BUILTIN_CODE(isolate(), ArrayConstructorImpl)))
     136             : 
     137       72960 : DEFINE_GETTER(BigIntMapConstant, HeapConstant(factory()->bigint_map()))
     138             : 
     139         124 : DEFINE_GETTER(BooleanMapConstant, HeapConstant(factory()->boolean_map()))
     140             : 
     141          87 : DEFINE_GETTER(ToNumberBuiltinConstant,
     142             :               HeapConstant(BUILTIN_CODE(isolate(), ToNumber)))
     143             : 
     144      161670 : DEFINE_GETTER(EmptyFixedArrayConstant,
     145             :               HeapConstant(factory()->empty_fixed_array()))
     146             : 
     147       76041 : DEFINE_GETTER(EmptyStringConstant, HeapConstant(factory()->empty_string()))
     148             : 
     149        3287 : DEFINE_GETTER(FixedArrayMapConstant, HeapConstant(factory()->fixed_array_map()))
     150             : 
     151        2493 : DEFINE_GETTER(PropertyArrayMapConstant,
     152             :               HeapConstant(factory()->property_array_map()))
     153             : 
     154          56 : DEFINE_GETTER(FixedDoubleArrayMapConstant,
     155             :               HeapConstant(factory()->fixed_double_array_map()))
     156             : 
     157      245620 : DEFINE_GETTER(HeapNumberMapConstant, HeapConstant(factory()->heap_number_map()))
     158             : 
     159    17503943 : DEFINE_GETTER(OptimizedOutConstant, HeapConstant(factory()->optimized_out()))
     160             : 
     161       18493 : DEFINE_GETTER(StaleRegisterConstant, HeapConstant(factory()->stale_register()))
     162             : 
     163     2208241 : DEFINE_GETTER(UndefinedConstant, HeapConstant(factory()->undefined_value()))
     164             : 
     165      514575 : DEFINE_GETTER(TheHoleConstant, HeapConstant(factory()->the_hole_value()))
     166             : 
     167     1505357 : DEFINE_GETTER(TrueConstant, HeapConstant(factory()->true_value()))
     168             : 
     169     1593463 : DEFINE_GETTER(FalseConstant, HeapConstant(factory()->false_value()))
     170             : 
     171       43586 : DEFINE_GETTER(NullConstant, HeapConstant(factory()->null_value()))
     172             : 
     173     1831467 : DEFINE_GETTER(ZeroConstant, NumberConstant(0.0))
     174             : 
     175      418431 : DEFINE_GETTER(OneConstant, NumberConstant(1.0))
     176             : 
     177         297 : DEFINE_GETTER(MinusOneConstant, NumberConstant(-1.0))
     178             : 
     179        1493 : DEFINE_GETTER(NaNConstant,
     180             :               NumberConstant(std::numeric_limits<double>::quiet_NaN()))
     181             : 
     182       23079 : DEFINE_GETTER(EmptyStateValues,
     183             :               graph()->NewNode(common()->StateValues(0,
     184             :                                                      SparseInputMask::Dense())))
     185             : 
     186     5781938 : DEFINE_GETTER(SingleDeadTypedStateValues,
     187             :               graph()->NewNode(common()->TypedStateValues(
     188             :                   new (graph()->zone()->New(sizeof(ZoneVector<MachineType>)))
     189             :                       ZoneVector<MachineType>(0, graph()->zone()),
     190             :                   SparseInputMask(SparseInputMask::kEndMarker << 1))))
     191             : 
     192             : #undef DEFINE_GETTER
     193             : #undef GET_CACHED_FIELD
     194             : 
     195             : }  // namespace compiler
     196             : }  // namespace internal
     197      122028 : }  // namespace v8

Generated by: LCOV version 1.10