Home | History | Annotate | Download | only in compiler
      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 
     31 class V8_EXPORT_PRIVATE EffectControlLinearizer {
     32  public:
     33   EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone,
     34                           SourcePositionTable* source_positions);
     35 
     36   void Run();
     37 
     38  private:
     39   void ProcessNode(Node* node, Node** frame_state, Node** effect,
     40                    Node** control);
     41 
     42   bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect,
     43                             Node** control);
     44   Node* LowerChangeBitToTagged(Node* node);
     45   Node* LowerChangeInt31ToTaggedSigned(Node* node);
     46   Node* LowerChangeInt32ToTagged(Node* node);
     47   Node* LowerChangeUint32ToTagged(Node* node);
     48   Node* LowerChangeFloat64ToTagged(Node* node);
     49   Node* LowerChangeFloat64ToTaggedPointer(Node* node);
     50   Node* LowerChangeTaggedSignedToInt32(Node* node);
     51   Node* LowerChangeTaggedToBit(Node* node);
     52   Node* LowerChangeTaggedToInt32(Node* node);
     53   Node* LowerChangeTaggedToUint32(Node* node);
     54   Node* LowerChangeTaggedToTaggedSigned(Node* node);
     55   Node* LowerCheckBounds(Node* node, Node* frame_state);
     56   Node* LowerCheckInternalizedString(Node* node, Node* frame_state);
     57   Node* LowerCheckMaps(Node* node, Node* frame_state);
     58   Node* LowerCheckNumber(Node* node, Node* frame_state);
     59   Node* LowerCheckReceiver(Node* node, Node* frame_state);
     60   Node* LowerCheckString(Node* node, Node* frame_state);
     61   Node* LowerCheckIf(Node* node, Node* frame_state);
     62   Node* LowerCheckedInt32Add(Node* node, Node* frame_state);
     63   Node* LowerCheckedInt32Sub(Node* node, Node* frame_state);
     64   Node* LowerCheckedInt32Div(Node* node, Node* frame_state);
     65   Node* LowerCheckedInt32Mod(Node* node, Node* frame_state);
     66   Node* LowerCheckedUint32Div(Node* node, Node* frame_state);
     67   Node* LowerCheckedUint32Mod(Node* node, Node* frame_state);
     68   Node* LowerCheckedInt32Mul(Node* node, Node* frame_state);
     69   Node* LowerCheckedInt32ToTaggedSigned(Node* node, Node* frame_state);
     70   Node* LowerCheckedUint32ToInt32(Node* node, Node* frame_state);
     71   Node* LowerCheckedUint32ToTaggedSigned(Node* node, Node* frame_state);
     72   Node* LowerCheckedFloat64ToInt32(Node* node, Node* frame_state);
     73   Node* LowerCheckedTaggedSignedToInt32(Node* node, Node* frame_state);
     74   Node* LowerCheckedTaggedToInt32(Node* node, Node* frame_state);
     75   Node* LowerCheckedTaggedToFloat64(Node* node, Node* frame_state);
     76   Node* LowerCheckedTaggedToTaggedSigned(Node* node, Node* frame_state);
     77   Node* LowerCheckedTaggedToTaggedPointer(Node* node, Node* frame_state);
     78   Node* LowerChangeTaggedToFloat64(Node* node);
     79   Node* LowerTruncateTaggedToBit(Node* node);
     80   Node* LowerTruncateTaggedToFloat64(Node* node);
     81   Node* LowerTruncateTaggedToWord32(Node* node);
     82   Node* LowerCheckedTruncateTaggedToWord32(Node* node, Node* frame_state);
     83   Node* LowerObjectIsDetectableCallable(Node* node);
     84   Node* LowerObjectIsNonCallable(Node* node);
     85   Node* LowerObjectIsNumber(Node* node);
     86   Node* LowerObjectIsReceiver(Node* node);
     87   Node* LowerObjectIsSmi(Node* node);
     88   Node* LowerObjectIsString(Node* node);
     89   Node* LowerObjectIsUndetectable(Node* node);
     90   Node* LowerNewRestParameterElements(Node* node);
     91   Node* LowerNewUnmappedArgumentsElements(Node* node);
     92   Node* LowerArrayBufferWasNeutered(Node* node);
     93   Node* LowerStringCharAt(Node* node);
     94   Node* LowerStringCharCodeAt(Node* node);
     95   Node* LowerStringFromCharCode(Node* node);
     96   Node* LowerStringFromCodePoint(Node* node);
     97   Node* LowerStringIndexOf(Node* node);
     98   Node* LowerStringEqual(Node* node);
     99   Node* LowerStringLessThan(Node* node);
    100   Node* LowerStringLessThanOrEqual(Node* node);
    101   Node* LowerCheckFloat64Hole(Node* node, Node* frame_state);
    102   Node* LowerCheckTaggedHole(Node* node, Node* frame_state);
    103   Node* LowerConvertTaggedHoleToUndefined(Node* node);
    104   Node* LowerPlainPrimitiveToNumber(Node* node);
    105   Node* LowerPlainPrimitiveToWord32(Node* node);
    106   Node* LowerPlainPrimitiveToFloat64(Node* node);
    107   Node* LowerEnsureWritableFastElements(Node* node);
    108   Node* LowerMaybeGrowFastElements(Node* node, Node* frame_state);
    109   void LowerTransitionElementsKind(Node* node);
    110   Node* LowerLoadTypedElement(Node* node);
    111   void LowerStoreTypedElement(Node* node);
    112 
    113   // Lowering of optional operators.
    114   Maybe<Node*> LowerFloat64RoundUp(Node* node);
    115   Maybe<Node*> LowerFloat64RoundDown(Node* node);
    116   Maybe<Node*> LowerFloat64RoundTiesEven(Node* node);
    117   Maybe<Node*> LowerFloat64RoundTruncate(Node* node);
    118 
    119   Node* AllocateHeapNumberWithValue(Node* node);
    120   Node* BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode, Node* value,
    121                                    Node* frame_state);
    122   Node* BuildCheckedHeapNumberOrOddballToFloat64(CheckTaggedInputMode mode,
    123                                                  Node* value,
    124                                                  Node* frame_state);
    125   Node* BuildFloat64RoundDown(Node* value);
    126   Node* LowerStringComparison(Callable const& callable, Node* node);
    127 
    128   Node* ChangeInt32ToSmi(Node* value);
    129   Node* ChangeUint32ToSmi(Node* value);
    130   Node* ChangeSmiToInt32(Node* value);
    131   Node* ObjectIsSmi(Node* value);
    132 
    133   Node* SmiMaxValueConstant();
    134   Node* SmiShiftBitsConstant();
    135 
    136   Factory* factory() const;
    137   Isolate* isolate() const;
    138   JSGraph* jsgraph() const { return js_graph_; }
    139   Graph* graph() const;
    140   Schedule* schedule() const { return schedule_; }
    141   Zone* temp_zone() const { return temp_zone_; }
    142   CommonOperatorBuilder* common() const;
    143   SimplifiedOperatorBuilder* simplified() const;
    144   MachineOperatorBuilder* machine() const;
    145 
    146   GraphAssembler* gasm() { return &graph_assembler_; }
    147 
    148   JSGraph* js_graph_;
    149   Schedule* schedule_;
    150   Zone* temp_zone_;
    151   RegionObservability region_observability_ = RegionObservability::kObservable;
    152   SourcePositionTable* source_positions_;
    153   GraphAssembler graph_assembler_;
    154 };
    155 
    156 }  // namespace compiler
    157 }  // namespace internal
    158 }  // namespace v8
    159 
    160 #endif  // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
    161