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