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 41 void Run(); 42 43 private: 44 void ProcessNode(Node* node, Node** frame_state, Node** effect, 45 Node** control); 46 47 bool TryWireInStateEffect(Node* node, Node* frame_state, Node** effect, 48 Node** control); 49 Node* LowerChangeBitToTagged(Node* node); 50 Node* LowerChangeInt31ToTaggedSigned(Node* node); 51 Node* LowerChangeInt32ToTagged(Node* node); 52 Node* LowerChangeUint32ToTagged(Node* node); 53 Node* LowerChangeFloat64ToTagged(Node* node); 54 Node* LowerChangeFloat64ToTaggedPointer(Node* node); 55 Node* LowerChangeTaggedSignedToInt32(Node* node); 56 Node* LowerChangeTaggedToBit(Node* node); 57 Node* LowerChangeTaggedToInt32(Node* node); 58 Node* LowerChangeTaggedToUint32(Node* node); 59 Node* LowerChangeTaggedToTaggedSigned(Node* node); 60 Node* LowerCheckBounds(Node* node, Node* frame_state); 61 Node* LowerPoisonIndex(Node* node); 62 Node* LowerCheckInternalizedString(Node* node, Node* frame_state); 63 void LowerCheckMaps(Node* node, Node* frame_state); 64 Node* LowerCompareMaps(Node* node); 65 Node* LowerCheckNumber(Node* node, Node* frame_state); 66 Node* LowerCheckReceiver(Node* node, Node* frame_state); 67 Node* LowerCheckString(Node* node, Node* frame_state); 68 Node* LowerCheckSymbol(Node* node, Node* frame_state); 69 void LowerCheckIf(Node* node, Node* frame_state); 70 Node* LowerCheckedInt32Add(Node* node, Node* frame_state); 71 Node* LowerCheckedInt32Sub(Node* node, Node* frame_state); 72 Node* LowerCheckedInt32Div(Node* node, Node* frame_state); 73 Node* LowerCheckedInt32Mod(Node* node, Node* frame_state); 74 Node* LowerCheckedUint32Div(Node* node, Node* frame_state); 75 Node* LowerCheckedUint32Mod(Node* node, Node* frame_state); 76 Node* LowerCheckedInt32Mul(Node* node, Node* frame_state); 77 Node* LowerCheckedInt32ToTaggedSigned(Node* node, Node* frame_state); 78 Node* LowerCheckedUint32ToInt32(Node* node, Node* frame_state); 79 Node* LowerCheckedUint32ToTaggedSigned(Node* node, Node* frame_state); 80 Node* LowerCheckedFloat64ToInt32(Node* node, Node* frame_state); 81 Node* LowerCheckedTaggedSignedToInt32(Node* node, Node* frame_state); 82 Node* LowerCheckedTaggedToInt32(Node* node, Node* frame_state); 83 Node* LowerCheckedTaggedToFloat64(Node* node, Node* frame_state); 84 Node* LowerCheckedTaggedToTaggedSigned(Node* node, Node* frame_state); 85 Node* LowerCheckedTaggedToTaggedPointer(Node* node, Node* frame_state); 86 Node* LowerChangeTaggedToFloat64(Node* node); 87 void TruncateTaggedPointerToBit(Node* node, GraphAssemblerLabel<1>* done); 88 Node* LowerTruncateTaggedToBit(Node* node); 89 Node* LowerTruncateTaggedPointerToBit(Node* node); 90 Node* LowerTruncateTaggedToFloat64(Node* node); 91 Node* LowerTruncateTaggedToWord32(Node* node); 92 Node* LowerCheckedTruncateTaggedToWord32(Node* node, Node* frame_state); 93 Node* LowerAllocate(Node* node); 94 Node* LowerNumberToString(Node* node); 95 Node* LowerObjectIsArrayBufferView(Node* node); 96 Node* LowerObjectIsBigInt(Node* node); 97 Node* LowerObjectIsCallable(Node* node); 98 Node* LowerObjectIsConstructor(Node* node); 99 Node* LowerObjectIsDetectableCallable(Node* node); 100 Node* LowerObjectIsMinusZero(Node* node); 101 Node* LowerObjectIsNaN(Node* node); 102 Node* LowerNumberIsNaN(Node* node); 103 Node* LowerObjectIsNonCallable(Node* node); 104 Node* LowerObjectIsNumber(Node* node); 105 Node* LowerObjectIsReceiver(Node* node); 106 Node* LowerObjectIsSmi(Node* node); 107 Node* LowerObjectIsString(Node* node); 108 Node* LowerObjectIsSymbol(Node* node); 109 Node* LowerObjectIsUndetectable(Node* node); 110 Node* LowerNumberIsFloat64Hole(Node* node); 111 Node* LowerNumberIsFinite(Node* node); 112 Node* LowerObjectIsFiniteNumber(Node* node); 113 Node* LowerNumberIsInteger(Node* node); 114 Node* LowerObjectIsInteger(Node* node); 115 Node* LowerNumberIsSafeInteger(Node* node); 116 Node* LowerObjectIsSafeInteger(Node* node); 117 Node* LowerArgumentsFrame(Node* node); 118 Node* LowerArgumentsLength(Node* node); 119 Node* LowerNewDoubleElements(Node* node); 120 Node* LowerNewSmiOrObjectElements(Node* node); 121 Node* LowerNewArgumentsElements(Node* node); 122 Node* LowerNewConsString(Node* node); 123 Node* LowerArrayBufferWasNeutered(Node* node); 124 Node* LowerSameValue(Node* node); 125 Node* LowerDeadValue(Node* node); 126 Node* LowerStringToNumber(Node* node); 127 Node* LowerStringCharCodeAt(Node* node); 128 Node* LowerStringCodePointAt(Node* node, UnicodeEncoding encoding); 129 Node* LowerStringToLowerCaseIntl(Node* node); 130 Node* LowerStringToUpperCaseIntl(Node* node); 131 Node* LowerStringFromSingleCharCode(Node* node); 132 Node* LowerStringFromSingleCodePoint(Node* node); 133 Node* LowerStringIndexOf(Node* node); 134 Node* LowerStringSubstring(Node* node); 135 Node* LowerStringLength(Node* node); 136 Node* LowerStringEqual(Node* node); 137 Node* LowerStringLessThan(Node* node); 138 Node* LowerStringLessThanOrEqual(Node* node); 139 Node* LowerCheckFloat64Hole(Node* node, Node* frame_state); 140 Node* LowerCheckNotTaggedHole(Node* node, Node* frame_state); 141 Node* LowerConvertTaggedHoleToUndefined(Node* node); 142 void LowerCheckEqualsInternalizedString(Node* node, Node* frame_state); 143 void LowerCheckEqualsSymbol(Node* node, Node* frame_state); 144 Node* LowerTypeOf(Node* node); 145 Node* LowerToBoolean(Node* node); 146 Node* LowerPlainPrimitiveToNumber(Node* node); 147 Node* LowerPlainPrimitiveToWord32(Node* node); 148 Node* LowerPlainPrimitiveToFloat64(Node* node); 149 Node* LowerEnsureWritableFastElements(Node* node); 150 Node* LowerMaybeGrowFastElements(Node* node, Node* frame_state); 151 void LowerTransitionElementsKind(Node* node); 152 Node* LowerLoadFieldByIndex(Node* node); 153 Node* LowerLoadTypedElement(Node* node); 154 Node* LowerLoadDataViewElement(Node* node); 155 void LowerStoreTypedElement(Node* node); 156 void LowerStoreDataViewElement(Node* node); 157 void LowerStoreSignedSmallElement(Node* node); 158 Node* LowerFindOrderedHashMapEntry(Node* node); 159 Node* LowerFindOrderedHashMapEntryForInt32Key(Node* node); 160 void LowerTransitionAndStoreElement(Node* node); 161 void LowerTransitionAndStoreNumberElement(Node* node); 162 void LowerTransitionAndStoreNonNumberElement(Node* node); 163 void LowerRuntimeAbort(Node* node); 164 Node* LowerConvertReceiver(Node* node); 165 Node* LowerDateNow(Node* node); 166 167 // Lowering of optional operators. 168 Maybe<Node*> LowerFloat64RoundUp(Node* node); 169 Maybe<Node*> LowerFloat64RoundDown(Node* node); 170 Maybe<Node*> LowerFloat64RoundTiesEven(Node* node); 171 Maybe<Node*> LowerFloat64RoundTruncate(Node* node); 172 173 Node* AllocateHeapNumberWithValue(Node* node); 174 Node* BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode, 175 const VectorSlotPair& feedback, Node* value, 176 Node* frame_state); 177 Node* BuildCheckedHeapNumberOrOddballToFloat64(CheckTaggedInputMode mode, 178 const VectorSlotPair& feedback, 179 Node* value, 180 Node* frame_state); 181 Node* BuildReverseBytes(ExternalArrayType type, Node* value); 182 Node* BuildFloat64RoundDown(Node* value); 183 Node* BuildFloat64RoundTruncate(Node* input); 184 Node* BuildUint32Mod(Node* lhs, Node* rhs); 185 Node* ComputeIntegerHash(Node* value); 186 Node* LowerStringComparison(Callable const& callable, Node* node); 187 Node* IsElementsKindGreaterThan(Node* kind, ElementsKind reference_kind); 188 189 Node* ChangeInt32ToSmi(Node* value); 190 Node* ChangeInt32ToIntPtr(Node* value); 191 Node* ChangeIntPtrToInt32(Node* value); 192 Node* ChangeUint32ToUintPtr(Node* value); 193 Node* ChangeUint32ToSmi(Node* value); 194 Node* ChangeSmiToIntPtr(Node* value); 195 Node* ChangeSmiToInt32(Node* value); 196 Node* ObjectIsSmi(Node* value); 197 Node* LoadFromSeqString(Node* receiver, Node* position, Node* is_one_byte); 198 199 Node* SmiMaxValueConstant(); 200 Node* SmiShiftBitsConstant(); 201 void TransitionElementsTo(Node* node, Node* array, ElementsKind from, 202 ElementsKind to); 203 204 Factory* factory() const; 205 Isolate* isolate() const; 206 JSGraph* jsgraph() const { return js_graph_; } 207 Graph* graph() const; 208 Schedule* schedule() const { return schedule_; } 209 Zone* temp_zone() const { return temp_zone_; } 210 CommonOperatorBuilder* common() const; 211 SimplifiedOperatorBuilder* simplified() const; 212 MachineOperatorBuilder* machine() const; 213 214 GraphAssembler* gasm() { return &graph_assembler_; } 215 216 JSGraph* js_graph_; 217 Schedule* schedule_; 218 Zone* temp_zone_; 219 MaskArrayIndexEnable mask_array_index_; 220 RegionObservability region_observability_ = RegionObservability::kObservable; 221 SourcePositionTable* source_positions_; 222 NodeOriginTable* node_origins_; 223 GraphAssembler graph_assembler_; 224 Node* frame_state_zapper_; // For tracking down compiler::Node::New crashes. 225 }; 226 227 } // namespace compiler 228 } // namespace internal 229 } // namespace v8 230 231 #endif // V8_COMPILER_EFFECT_CONTROL_LINEARIZER_H_ 232