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/node.h"
     10 #include "src/compiler/simplified-operator.h"
     11 #include "src/globals.h"
     12 
     13 namespace v8 {
     14 namespace internal {
     15 
     16 // Forward declarations.
     17 class Callable;
     18 class Zone;
     19 
     20 namespace compiler {
     21 
     22 class CommonOperatorBuilder;
     23 class SimplifiedOperatorBuilder;
     24 class MachineOperatorBuilder;
     25 class JSGraph;
     26 class Graph;
     27 class Schedule;
     28 class SourcePositionTable;
     29 
     30 class V8_EXPORT_PRIVATE EffectControlLinearizer {
     31  public:
     32   EffectControlLinearizer(JSGraph* graph, Schedule* schedule, Zone* temp_zone,
     33                           SourcePositionTable* source_positions);
     34 
     35   void Run();
     36 
     37  private:
     38   void ProcessNode(Node* node, Node** frame_state, Node** effect,
     39                    Node** control);
     40 
     41   struct ValueEffectControl {
     42     Node* value;
     43     Node* effect;
     44     Node* control;
     45     ValueEffectControl(Node* value, Node* effect, Node* control)
     46         : value(value), effect(effect), control(control) {}
     47   };
     48 
     49   bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect,
     50                             Node** control);
     51   ValueEffectControl LowerChangeBitToTagged(Node* node, Node* effect,
     52                                             Node* control);
     53   ValueEffectControl LowerChangeInt31ToTaggedSigned(Node* node, Node* effect,
     54                                                     Node* control);
     55   ValueEffectControl LowerChangeInt32ToTagged(Node* node, Node* effect,
     56                                               Node* control);
     57   ValueEffectControl LowerChangeUint32ToTagged(Node* node, Node* effect,
     58                                                Node* control);
     59   ValueEffectControl LowerChangeFloat64ToTagged(Node* node, Node* effect,
     60                                                 Node* control);
     61   ValueEffectControl LowerChangeFloat64ToTaggedPointer(Node* node, Node* effect,
     62                                                        Node* control);
     63   ValueEffectControl LowerChangeTaggedSignedToInt32(Node* node, Node* effect,
     64                                                     Node* control);
     65   ValueEffectControl LowerChangeTaggedToBit(Node* node, Node* effect,
     66                                             Node* control);
     67   ValueEffectControl LowerChangeTaggedToInt32(Node* node, Node* effect,
     68                                               Node* control);
     69   ValueEffectControl LowerChangeTaggedToUint32(Node* node, Node* effect,
     70                                                Node* control);
     71   ValueEffectControl LowerCheckBounds(Node* node, Node* frame_state,
     72                                       Node* effect, Node* control);
     73   ValueEffectControl LowerCheckMaps(Node* node, Node* frame_state, Node* effect,
     74                                     Node* control);
     75   ValueEffectControl LowerCheckNumber(Node* node, Node* frame_state,
     76                                       Node* effect, Node* control);
     77   ValueEffectControl LowerCheckString(Node* node, Node* frame_state,
     78                                       Node* effect, Node* control);
     79   ValueEffectControl LowerCheckIf(Node* node, Node* frame_state, Node* effect,
     80                                   Node* control);
     81   ValueEffectControl LowerCheckedInt32Add(Node* node, Node* frame_state,
     82                                           Node* effect, Node* control);
     83   ValueEffectControl LowerCheckedInt32Sub(Node* node, Node* frame_state,
     84                                           Node* effect, Node* control);
     85   ValueEffectControl LowerCheckedInt32Div(Node* node, Node* frame_state,
     86                                           Node* effect, Node* control);
     87   ValueEffectControl LowerCheckedInt32Mod(Node* node, Node* frame_state,
     88                                           Node* effect, Node* control);
     89   ValueEffectControl LowerCheckedUint32Div(Node* node, Node* frame_state,
     90                                            Node* effect, Node* control);
     91   ValueEffectControl LowerCheckedUint32Mod(Node* node, Node* frame_state,
     92                                            Node* effect, Node* control);
     93   ValueEffectControl LowerCheckedInt32Mul(Node* node, Node* frame_state,
     94                                           Node* effect, Node* control);
     95   ValueEffectControl LowerCheckedInt32ToTaggedSigned(Node* node,
     96                                                      Node* frame_state,
     97                                                      Node* effect,
     98                                                      Node* control);
     99   ValueEffectControl LowerCheckedUint32ToInt32(Node* node, Node* frame_state,
    100                                                Node* effect, Node* control);
    101   ValueEffectControl LowerCheckedUint32ToTaggedSigned(Node* node,
    102                                                       Node* frame_state,
    103                                                       Node* effect,
    104                                                       Node* control);
    105   ValueEffectControl LowerCheckedFloat64ToInt32(Node* node, Node* frame_state,
    106                                                 Node* effect, Node* control);
    107   ValueEffectControl LowerCheckedTaggedSignedToInt32(Node* node,
    108                                                      Node* frame_state,
    109                                                      Node* effect,
    110                                                      Node* control);
    111   ValueEffectControl LowerCheckedTaggedToInt32(Node* node, Node* frame_state,
    112                                                Node* effect, Node* control);
    113   ValueEffectControl LowerCheckedTaggedToFloat64(Node* node, Node* frame_state,
    114                                                  Node* effect, Node* control);
    115   ValueEffectControl LowerCheckedTaggedToTaggedSigned(Node* node,
    116                                                       Node* frame_state,
    117                                                       Node* effect,
    118                                                       Node* control);
    119   ValueEffectControl LowerCheckedTaggedToTaggedPointer(Node* node,
    120                                                        Node* frame_state,
    121                                                        Node* effect,
    122                                                        Node* control);
    123   ValueEffectControl LowerChangeTaggedToFloat64(Node* node, Node* effect,
    124                                                 Node* control);
    125   ValueEffectControl LowerTruncateTaggedToBit(Node* node, Node* effect,
    126                                               Node* control);
    127   ValueEffectControl LowerTruncateTaggedToFloat64(Node* node, Node* effect,
    128                                                   Node* control);
    129   ValueEffectControl LowerTruncateTaggedToWord32(Node* node, Node* effect,
    130                                                  Node* control);
    131   ValueEffectControl LowerCheckedTruncateTaggedToWord32(Node* node,
    132                                                         Node* frame_state,
    133                                                         Node* effect,
    134                                                         Node* control);
    135   ValueEffectControl LowerObjectIsCallable(Node* node, Node* effect,
    136                                            Node* control);
    137   ValueEffectControl LowerObjectIsNumber(Node* node, Node* effect,
    138                                          Node* control);
    139   ValueEffectControl LowerObjectIsReceiver(Node* node, Node* effect,
    140                                            Node* control);
    141   ValueEffectControl LowerObjectIsSmi(Node* node, Node* effect, Node* control);
    142   ValueEffectControl LowerObjectIsString(Node* node, Node* effect,
    143                                          Node* control);
    144   ValueEffectControl LowerObjectIsUndetectable(Node* node, Node* effect,
    145                                                Node* control);
    146   ValueEffectControl LowerArrayBufferWasNeutered(Node* node, Node* effect,
    147                                                  Node* control);
    148   ValueEffectControl LowerStringCharCodeAt(Node* node, Node* effect,
    149                                            Node* control);
    150   ValueEffectControl LowerStringFromCharCode(Node* node, Node* effect,
    151                                              Node* control);
    152   ValueEffectControl LowerStringFromCodePoint(Node* node, Node* effect,
    153                                               Node* control);
    154   ValueEffectControl LowerStringEqual(Node* node, Node* effect, Node* control);
    155   ValueEffectControl LowerStringLessThan(Node* node, Node* effect,
    156                                          Node* control);
    157   ValueEffectControl LowerStringLessThanOrEqual(Node* node, Node* effect,
    158                                                 Node* control);
    159   ValueEffectControl LowerCheckFloat64Hole(Node* node, Node* frame_state,
    160                                            Node* effect, Node* control);
    161   ValueEffectControl LowerCheckTaggedHole(Node* node, Node* frame_state,
    162                                           Node* effect, Node* control);
    163   ValueEffectControl LowerConvertTaggedHoleToUndefined(Node* node, Node* effect,
    164                                                        Node* control);
    165   ValueEffectControl LowerPlainPrimitiveToNumber(Node* node, Node* effect,
    166                                                  Node* control);
    167   ValueEffectControl LowerPlainPrimitiveToWord32(Node* node, Node* effect,
    168                                                  Node* control);
    169   ValueEffectControl LowerPlainPrimitiveToFloat64(Node* node, Node* effect,
    170                                                   Node* control);
    171   ValueEffectControl LowerEnsureWritableFastElements(Node* node, Node* effect,
    172                                                      Node* control);
    173   ValueEffectControl LowerMaybeGrowFastElements(Node* node, Node* frame_state,
    174                                                 Node* effect, Node* control);
    175   ValueEffectControl LowerTransitionElementsKind(Node* node, Node* effect,
    176                                                  Node* control);
    177   ValueEffectControl LowerLoadTypedElement(Node* node, Node* effect,
    178                                            Node* control);
    179   ValueEffectControl LowerStoreTypedElement(Node* node, Node* effect,
    180                                             Node* control);
    181 
    182   // Lowering of optional operators.
    183   ValueEffectControl LowerFloat64RoundUp(Node* node, Node* effect,
    184                                          Node* control);
    185   ValueEffectControl LowerFloat64RoundDown(Node* node, Node* effect,
    186                                            Node* control);
    187   ValueEffectControl LowerFloat64RoundTiesEven(Node* node, Node* effect,
    188                                                Node* control);
    189   ValueEffectControl LowerFloat64RoundTruncate(Node* node, Node* effect,
    190                                                Node* control);
    191 
    192   ValueEffectControl AllocateHeapNumberWithValue(Node* node, Node* effect,
    193                                                  Node* control);
    194   ValueEffectControl BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode,
    195                                                 Node* value, Node* frame_state,
    196                                                 Node* effect, Node* control);
    197   ValueEffectControl BuildCheckedHeapNumberOrOddballToFloat64(
    198       CheckTaggedInputMode mode, Node* value, Node* frame_state, Node* effect,
    199       Node* control);
    200   ValueEffectControl BuildFloat64RoundDown(Node* value, Node* effect,
    201                                            Node* control);
    202   ValueEffectControl LowerStringComparison(Callable const& callable, Node* node,
    203                                            Node* effect, Node* control);
    204 
    205   Node* ChangeInt32ToSmi(Node* value);
    206   Node* ChangeUint32ToSmi(Node* value);
    207   Node* ChangeInt32ToFloat64(Node* value);
    208   Node* ChangeUint32ToFloat64(Node* value);
    209   Node* ChangeSmiToInt32(Node* value);
    210   Node* ObjectIsSmi(Node* value);
    211 
    212   Node* SmiMaxValueConstant();
    213   Node* SmiShiftBitsConstant();
    214 
    215   Factory* factory() const;
    216   Isolate* isolate() const;
    217   JSGraph* jsgraph() const { return js_graph_; }
    218   Graph* graph() const;
    219   Schedule* schedule() const { return schedule_; }
    220   Zone* temp_zone() const { return temp_zone_; }
    221   CommonOperatorBuilder* common() const;
    222   SimplifiedOperatorBuilder* simplified() const;
    223   MachineOperatorBuilder* machine() const;
    224 
    225   Operator const* ToNumberOperator();
    226 
    227   JSGraph* js_graph_;
    228   Schedule* schedule_;
    229   Zone* temp_zone_;
    230   RegionObservability region_observability_ = RegionObservability::kObservable;
    231   SourcePositionTable* source_positions_;
    232 
    233   SetOncePointer<Operator const> to_number_operator_;
    234 };
    235 
    236 }  // namespace compiler
    237 }  // namespace internal
    238 }  // namespace v8
    239 
    240 #endif  // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_
    241