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; ValueEffectControlValueEffectControl45 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; jsgraph()217 JSGraph* jsgraph() const { return js_graph_; } 218 Graph* graph() const; schedule()219 Schedule* schedule() const { return schedule_; } temp_zone()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