LCOV - code coverage report
Current view: top level - src/compiler - effect-control-linearizer.h (source / functions) Hit Total Coverage
Test: app.info Lines: 1 1 100.0 %
Date: 2019-04-17 Functions: 0 0 -

          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             : #ifndef V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
       6             : #define V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
       7             : 
       8             : #include "src/compiler/common-operator.h"
       9             : #include "src/compiler/graph-assembler.h"
      10             : #include "src/compiler/node.h"
      11             : #include "src/compiler/simplified-operator.h"
      12             : #include "src/globals.h"
      13             : 
      14             : namespace v8 {
      15             : namespace internal {
      16             : 
      17             : // Forward declarations.
      18             : class Callable;
      19             : class Zone;
      20             : 
      21             : namespace compiler {
      22             : 
      23             : class CommonOperatorBuilder;
      24             : class SimplifiedOperatorBuilder;
      25             : class MachineOperatorBuilder;
      26             : class JSGraph;
      27             : class Graph;
      28             : class Schedule;
      29             : class SourcePositionTable;
      30             : class NodeOriginTable;
      31             : 
      32             : class V8_EXPORT_PRIVATE EffectControlLinearizer {
      33             :  public:
      34             :   enum MaskArrayIndexEnable { kDoNotMaskArrayIndex, kMaskArrayIndex };
      35             : 
      36             :   EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone,
      37             :                           SourcePositionTable* source_positions,
      38             :                           NodeOriginTable* node_origins,
      39             :                           MaskArrayIndexEnable mask_array_index,
      40             :                           std::vector<Handle<Map>>* embedded_maps);
      41             : 
      42             :   void Run();
      43             : 
      44             :  private:
      45             :   void ProcessNode(Node* node, Node** frame_state, Node** effect,
      46             :                    Node** control);
      47             : 
      48             :   bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect,
      49             :                             Node** control);
      50             :   Node* LowerChangeBitToTagged(Node* node);
      51             :   Node* LowerChangeInt31ToTaggedSigned(Node* node);
      52             :   Node* LowerChangeInt32ToTagged(Node* node);
      53             :   Node* LowerChangeInt64ToTagged(Node* node);
      54             :   Node* LowerChangeUint32ToTagged(Node* node);
      55             :   Node* LowerChangeUint64ToTagged(Node* node);
      56             :   Node* LowerChangeFloat64ToTagged(Node* node);
      57             :   Node* LowerChangeFloat64ToTaggedPointer(Node* node);
      58             :   Node* LowerChangeTaggedSignedToInt32(Node* node);
      59             :   Node* LowerChangeTaggedSignedToInt64(Node* node);
      60             :   Node* LowerChangeTaggedToBit(Node* node);
      61             :   Node* LowerChangeTaggedToInt32(Node* node);
      62             :   Node* LowerChangeTaggedToUint32(Node* node);
      63             :   Node* LowerChangeTaggedToInt64(Node* node);
      64             :   Node* LowerChangeTaggedToTaggedSigned(Node* node);
      65             :   Node* LowerChangeCompressedToTaggedSigned(Node* node);
      66             :   Node* LowerChangeTaggedToCompressedSigned(Node* node);
      67             :   Node* LowerPoisonIndex(Node* node);
      68             :   Node* LowerCheckInternalizedString(Node* node, Node* frame_state);
      69             :   Node* LowerCheckNonEmptyOneByteString(Node* node, Node* frame_state);
      70             :   Node* LowerCheckNonEmptyTwoByteString(Node* node, Node* frame_state);
      71             :   Node* LowerCheckNonEmptyString(Node* node, Node* frame_state);
      72             :   void LowerCheckMaps(Node* node, Node* frame_state);
      73             :   Node* LowerCompareMaps(Node* node);
      74             :   Node* LowerCheckNumber(Node* node, Node* frame_state);
      75             :   Node* LowerCheckReceiver(Node* node, Node* frame_state);
      76             :   Node* LowerCheckReceiverOrNullOrUndefined(Node* node, Node* frame_state);
      77             :   Node* LowerCheckString(Node* node, Node* frame_state);
      78             :   Node* LowerCheckSymbol(Node* node, Node* frame_state);
      79             :   void LowerCheckIf(Node* node, Node* frame_state);
      80             :   Node* LowerCheckedInt32Add(Node* node, Node* frame_state);
      81             :   Node* LowerCheckedInt32Sub(Node* node, Node* frame_state);
      82             :   Node* LowerCheckedInt32Div(Node* node, Node* frame_state);
      83             :   Node* LowerCheckedInt32Mod(Node* node, Node* frame_state);
      84             :   Node* LowerCheckedUint32Div(Node* node, Node* frame_state);
      85             :   Node* LowerCheckedUint32Mod(Node* node, Node* frame_state);
      86             :   Node* LowerCheckedInt32Mul(Node* node, Node* frame_state);
      87             :   Node* LowerCheckedInt32ToTaggedSigned(Node* node, Node* frame_state);
      88             :   Node* LowerCheckedInt64ToInt32(Node* node, Node* frame_state);
      89             :   Node* LowerCheckedInt64ToTaggedSigned(Node* node, Node* frame_state);
      90             :   Node* LowerCheckedUint32Bounds(Node* node, Node* frame_state);
      91             :   Node* LowerCheckedUint32ToInt32(Node* node, Node* frame_state);
      92             :   Node* LowerCheckedUint32ToTaggedSigned(Node* node, Node* frame_state);
      93             :   Node* LowerCheckedUint64Bounds(Node* node, Node* frame_state);
      94             :   Node* LowerCheckedUint64ToInt32(Node* node, Node* frame_state);
      95             :   Node* LowerCheckedUint64ToTaggedSigned(Node* node, Node* frame_state);
      96             :   Node* LowerCheckedFloat64ToInt32(Node* node, Node* frame_state);
      97             :   Node* LowerCheckedFloat64ToInt64(Node* node, Node* frame_state);
      98             :   Node* LowerCheckedTaggedSignedToInt32(Node* node, Node* frame_state);
      99             :   Node* LowerCheckedTaggedToInt32(Node* node, Node* frame_state);
     100             :   Node* LowerCheckedTaggedToInt64(Node* node, Node* frame_state);
     101             :   Node* LowerCheckedTaggedToFloat64(Node* node, Node* frame_state);
     102             :   Node* LowerCheckedTaggedToTaggedSigned(Node* node, Node* frame_state);
     103             :   Node* LowerCheckedTaggedToTaggedPointer(Node* node, Node* frame_state);
     104             :   Node* LowerCheckedCompressedToTaggedSigned(Node* node, Node* frame_state);
     105             :   Node* LowerCheckedCompressedToTaggedPointer(Node* node, Node* frame_state);
     106             :   Node* LowerCheckedTaggedToCompressedSigned(Node* node, Node* frame_state);
     107             :   Node* LowerCheckedTaggedToCompressedPointer(Node* node, Node* frame_state);
     108             :   Node* LowerChangeTaggedToFloat64(Node* node);
     109             :   void TruncateTaggedPointerToBit(Node* node, GraphAssemblerLabel<1>* done);
     110             :   Node* LowerTruncateTaggedToBit(Node* node);
     111             :   Node* LowerTruncateTaggedPointerToBit(Node* node);
     112             :   Node* LowerTruncateTaggedToFloat64(Node* node);
     113             :   Node* LowerTruncateTaggedToWord32(Node* node);
     114             :   Node* LowerCheckedTruncateTaggedToWord32(Node* node, Node* frame_state);
     115             :   Node* LowerAllocate(Node* node);
     116             :   Node* LowerNumberToString(Node* node);
     117             :   Node* LowerObjectIsArrayBufferView(Node* node);
     118             :   Node* LowerObjectIsBigInt(Node* node);
     119             :   Node* LowerObjectIsCallable(Node* node);
     120             :   Node* LowerObjectIsConstructor(Node* node);
     121             :   Node* LowerObjectIsDetectableCallable(Node* node);
     122             :   Node* LowerObjectIsMinusZero(Node* node);
     123             :   Node* LowerNumberIsMinusZero(Node* node);
     124             :   Node* LowerObjectIsNaN(Node* node);
     125             :   Node* LowerNumberIsNaN(Node* node);
     126             :   Node* LowerObjectIsNonCallable(Node* node);
     127             :   Node* LowerObjectIsNumber(Node* node);
     128             :   Node* LowerObjectIsReceiver(Node* node);
     129             :   Node* LowerObjectIsSmi(Node* node);
     130             :   Node* LowerObjectIsString(Node* node);
     131             :   Node* LowerObjectIsSymbol(Node* node);
     132             :   Node* LowerObjectIsUndetectable(Node* node);
     133             :   Node* LowerNumberIsFloat64Hole(Node* node);
     134             :   Node* LowerNumberIsFinite(Node* node);
     135             :   Node* LowerObjectIsFiniteNumber(Node* node);
     136             :   Node* LowerNumberIsInteger(Node* node);
     137             :   Node* LowerObjectIsInteger(Node* node);
     138             :   Node* LowerNumberIsSafeInteger(Node* node);
     139             :   Node* LowerObjectIsSafeInteger(Node* node);
     140             :   Node* LowerArgumentsFrame(Node* node);
     141             :   Node* LowerArgumentsLength(Node* node);
     142             :   Node* LowerNewDoubleElements(Node* node);
     143             :   Node* LowerNewSmiOrObjectElements(Node* node);
     144             :   Node* LowerNewArgumentsElements(Node* node);
     145             :   Node* LowerNewConsOneByteString(Node* node);
     146             :   Node* LowerNewConsTwoByteString(Node* node);
     147             :   Node* LowerNewConsString(Node* node);
     148             :   Node* LowerSameValue(Node* node);
     149             :   Node* LowerNumberSameValue(Node* node);
     150             :   Node* LowerDeadValue(Node* node);
     151             :   Node* LowerStringConcat(Node* node);
     152             :   Node* LowerStringToNumber(Node* node);
     153             :   Node* LowerStringCharCodeAt(Node* node);
     154             :   Node* LowerStringCodePointAt(Node* node, UnicodeEncoding encoding);
     155             :   Node* LowerStringToLowerCaseIntl(Node* node);
     156             :   Node* LowerStringToUpperCaseIntl(Node* node);
     157             :   Node* LowerStringFromSingleCharCode(Node* node);
     158             :   Node* LowerStringFromSingleCodePoint(Node* node);
     159             :   Node* LowerStringIndexOf(Node* node);
     160             :   Node* LowerStringSubstring(Node* node);
     161             :   Node* LowerStringLength(Node* node);
     162             :   Node* LowerStringEqual(Node* node);
     163             :   Node* LowerStringLessThan(Node* node);
     164             :   Node* LowerStringLessThanOrEqual(Node* node);
     165             :   Node* LowerCheckFloat64Hole(Node* node, Node* frame_state);
     166             :   Node* LowerCheckNotTaggedHole(Node* node, Node* frame_state);
     167             :   Node* LowerConvertTaggedHoleToUndefined(Node* node);
     168             :   void LowerCheckEqualsInternalizedString(Node* node, Node* frame_state);
     169             :   void LowerCheckEqualsSymbol(Node* node, Node* frame_state);
     170             :   Node* LowerTypeOf(Node* node);
     171             :   Node* LowerToBoolean(Node* node);
     172             :   Node* LowerPlainPrimitiveToNumber(Node* node);
     173             :   Node* LowerPlainPrimitiveToWord32(Node* node);
     174             :   Node* LowerPlainPrimitiveToFloat64(Node* node);
     175             :   Node* LowerEnsureWritableFastElements(Node* node);
     176             :   Node* LowerMaybeGrowFastElements(Node* node, Node* frame_state);
     177             :   void LowerTransitionElementsKind(Node* node);
     178             :   Node* LowerLoadFieldByIndex(Node* node);
     179             :   Node* LowerLoadMessage(Node* node);
     180             :   Node* LowerLoadTypedElement(Node* node);
     181             :   Node* LowerLoadDataViewElement(Node* node);
     182             :   Node* LowerLoadStackArgument(Node* node);
     183             :   void LowerStoreMessage(Node* node);
     184             :   void LowerStoreTypedElement(Node* node);
     185             :   void LowerStoreDataViewElement(Node* node);
     186             :   void LowerStoreSignedSmallElement(Node* node);
     187             :   Node* LowerFindOrderedHashMapEntry(Node* node);
     188             :   Node* LowerFindOrderedHashMapEntryForInt32Key(Node* node);
     189             :   void LowerTransitionAndStoreElement(Node* node);
     190             :   void LowerTransitionAndStoreNumberElement(Node* node);
     191             :   void LowerTransitionAndStoreNonNumberElement(Node* node);
     192             :   void LowerRuntimeAbort(Node* node);
     193             :   Node* LowerConvertReceiver(Node* node);
     194             :   Node* LowerDateNow(Node* node);
     195             : 
     196             :   // Lowering of optional operators.
     197             :   Maybe<Node*> LowerFloat64RoundUp(Node* node);
     198             :   Maybe<Node*> LowerFloat64RoundDown(Node* node);
     199             :   Maybe<Node*> LowerFloat64RoundTiesEven(Node* node);
     200             :   Maybe<Node*> LowerFloat64RoundTruncate(Node* node);
     201             : 
     202             :   Node* AllocateHeapNumberWithValue(Node* node);
     203             :   Node* AllocateConsString(Node* map, Node* length, Node* first, Node* second);
     204             :   Node* BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode,
     205             :                                    const VectorSlotPair& feedback, Node* value,
     206             :                                    Node* frame_state);
     207             :   Node* BuildCheckedFloat64ToInt64(CheckForMinusZeroMode mode,
     208             :                                    const VectorSlotPair& feedback, Node* value,
     209             :                                    Node* frame_state);
     210             :   Node* BuildCheckedHeapNumberOrOddballToFloat64(CheckTaggedInputMode mode,
     211             :                                                  const VectorSlotPair& feedback,
     212             :                                                  Node* value,
     213             :                                                  Node* frame_state);
     214             :   Node* BuildReverseBytes(ExternalArrayType type, Node* value);
     215             :   Node* BuildFloat64RoundDown(Node* value);
     216             :   Node* BuildFloat64RoundTruncate(Node* input);
     217             :   Node* BuildUint32Mod(Node* lhs, Node* rhs);
     218             :   Node* ComputeUnseededHash(Node* value);
     219             :   Node* LowerStringComparison(Callable const& callable, Node* node);
     220             :   Node* IsElementsKindGreaterThan(Node* kind, ElementsKind reference_kind);
     221             : 
     222             :   Node* ChangeInt32ToSmi(Node* value);
     223             :   Node* ChangeInt32ToIntPtr(Node* value);
     224             :   Node* ChangeInt64ToSmi(Node* value);
     225             :   Node* ChangeIntPtrToInt32(Node* value);
     226             :   Node* ChangeIntPtrToSmi(Node* value);
     227             :   Node* ChangeUint32ToUintPtr(Node* value);
     228             :   Node* ChangeUint32ToSmi(Node* value);
     229             :   Node* ChangeSmiToIntPtr(Node* value);
     230             :   Node* ChangeSmiToInt32(Node* value);
     231             :   Node* ChangeSmiToInt64(Node* value);
     232             :   Node* ObjectIsSmi(Node* value);
     233             :   Node* LoadFromSeqString(Node* receiver, Node* position, Node* is_one_byte);
     234             : 
     235             :   Node* SmiMaxValueConstant();
     236             :   Node* SmiShiftBitsConstant();
     237             :   void TransitionElementsTo(Node* node, Node* array, ElementsKind from,
     238             :                             ElementsKind to);
     239             : 
     240             :   Factory* factory() const;
     241             :   Isolate* isolate() const;
     242             :   JSGraph* jsgraph() const { return js_graph_; }
     243             :   Graph* graph() const;
     244             :   Schedule* schedule() const { return schedule_; }
     245             :   Zone* temp_zone() const { return temp_zone_; }
     246             :   CommonOperatorBuilder* common() const;
     247             :   SimplifiedOperatorBuilder* simplified() const;
     248             :   MachineOperatorBuilder* machine() const;
     249             :   std::vector<Handle<Map>>* embedded_maps() { return embedded_maps_; }
     250             : 
     251    37688459 :   GraphAssembler* gasm() { return &graph_assembler_; }
     252             : 
     253             :   JSGraph* js_graph_;
     254             :   Schedule* schedule_;
     255             :   Zone* temp_zone_;
     256             :   MaskArrayIndexEnable mask_array_index_;
     257             :   RegionObservability region_observability_ = RegionObservability::kObservable;
     258             :   SourcePositionTable* source_positions_;
     259             :   NodeOriginTable* node_origins_;
     260             :   GraphAssembler graph_assembler_;
     261             :   Node* frame_state_zapper_;  // For tracking down compiler::Node::New crashes.
     262             : 
     263             :   // embedded_maps_ keeps track of maps we've embedded as Uint32 constants.
     264             :   // We do this in order to notify the garbage collector at code-gen time.
     265             :   std::vector<Handle<Map>>* embedded_maps_;
     266             : };
     267             : 
     268             : }  // namespace compiler
     269             : }  // namespace internal
     270             : }  // namespace v8
     271             : 
     272             : #endif  // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_

Generated by: LCOV version 1.10