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