| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 #include "src/compiler/simplified-operator-reducer.h" | 5 #include "src/compiler/simplified-operator-reducer.h" |
| 6 | 6 |
| 7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
| 8 #include "src/compiler/machine-operator.h" | 8 #include "src/compiler/machine-operator.h" |
| 9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
| 10 #include "src/compiler/operator-properties.h" | 10 #include "src/compiler/operator-properties.h" |
| 11 #include "src/compiler/simplified-operator.h" | 11 #include "src/compiler/simplified-operator.h" |
| 12 #include "src/conversions-inl.h" | 12 #include "src/conversions-inl.h" |
| 13 #include "src/type-cache.h" | 13 #include "src/type-cache.h" |
| 14 | 14 |
| 15 namespace v8 { | 15 namespace v8 { |
| 16 namespace internal { | 16 namespace internal { |
| 17 namespace compiler { | 17 namespace compiler { |
| 18 | 18 |
| 19 SimplifiedOperatorReducer::SimplifiedOperatorReducer(JSGraph* jsgraph) | 19 namespace { |
| 20 : jsgraph_(jsgraph), type_cache_(TypeCache::Get()) {} | 20 |
| 21 Decision DecideObjectIsSmi(Node* const input) { |
| 22 NumberMatcher m(input); |
| 23 if (m.HasValue()) { |
| 24 return IsSmiDouble(m.Value()) ? Decision::kTrue : Decision::kFalse; |
| 25 } |
| 26 if (m.IsAllocate()) return Decision::kFalse; |
| 27 if (m.IsChangeBitToTagged()) return Decision::kFalse; |
| 28 if (m.IsChangeInt31ToTaggedSigned()) return Decision::kTrue; |
| 29 if (m.IsHeapConstant()) return Decision::kFalse; |
| 30 return Decision::kUnknown; |
| 31 } |
| 32 |
| 33 } // namespace |
| 34 |
| 35 SimplifiedOperatorReducer::SimplifiedOperatorReducer(Editor* editor, |
| 36 JSGraph* jsgraph) |
| 37 : AdvancedReducer(editor), |
| 38 jsgraph_(jsgraph), |
| 39 type_cache_(TypeCache::Get()) {} |
| 21 | 40 |
| 22 SimplifiedOperatorReducer::~SimplifiedOperatorReducer() {} | 41 SimplifiedOperatorReducer::~SimplifiedOperatorReducer() {} |
| 23 | 42 |
| 24 | 43 |
| 25 Reduction SimplifiedOperatorReducer::Reduce(Node* node) { | 44 Reduction SimplifiedOperatorReducer::Reduce(Node* node) { |
| 26 switch (node->opcode()) { | 45 switch (node->opcode()) { |
| 27 case IrOpcode::kBooleanNot: { | 46 case IrOpcode::kBooleanNot: { |
| 28 HeapObjectMatcher m(node->InputAt(0)); | 47 HeapObjectMatcher m(node->InputAt(0)); |
| 29 if (m.HasValue()) { | 48 if (m.HasValue()) { |
| 30 return Replace(jsgraph()->BooleanConstant(!m.Value()->BooleanValue())); | 49 return Replace(jsgraph()->BooleanConstant(!m.Value()->BooleanValue())); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value())); | 122 if (m.HasValue()) return ReplaceInt32(DoubleToInt32(m.Value())); |
| 104 if (m.IsChangeInt31ToTaggedSigned() || m.IsChangeInt32ToTagged() || | 123 if (m.IsChangeInt31ToTaggedSigned() || m.IsChangeInt32ToTagged() || |
| 105 m.IsChangeUint32ToTagged()) { | 124 m.IsChangeUint32ToTagged()) { |
| 106 return Replace(m.InputAt(0)); | 125 return Replace(m.InputAt(0)); |
| 107 } | 126 } |
| 108 if (m.IsChangeFloat64ToTagged()) { | 127 if (m.IsChangeFloat64ToTagged()) { |
| 109 return Change(node, machine()->TruncateFloat64ToWord32(), m.InputAt(0)); | 128 return Change(node, machine()->TruncateFloat64ToWord32(), m.InputAt(0)); |
| 110 } | 129 } |
| 111 break; | 130 break; |
| 112 } | 131 } |
| 132 case IrOpcode::kCheckTaggedPointer: { |
| 133 Node* const input = node->InputAt(0); |
| 134 if (DecideObjectIsSmi(input) == Decision::kFalse) { |
| 135 ReplaceWithValue(node, input); |
| 136 return Replace(input); |
| 137 } |
| 138 break; |
| 139 } |
| 140 case IrOpcode::kCheckTaggedSigned: { |
| 141 Node* const input = node->InputAt(0); |
| 142 if (DecideObjectIsSmi(input) == Decision::kTrue) { |
| 143 ReplaceWithValue(node, input); |
| 144 return Replace(input); |
| 145 } |
| 146 break; |
| 147 } |
| 113 case IrOpcode::kObjectIsSmi: { | 148 case IrOpcode::kObjectIsSmi: { |
| 114 NumberMatcher m(node->InputAt(0)); | 149 Node* const input = node->InputAt(0); |
| 115 if (m.HasValue()) return ReplaceBoolean(IsSmiDouble(m.Value())); | 150 switch (DecideObjectIsSmi(input)) { |
| 116 if (m.IsChangeBitToTagged()) return ReplaceBoolean(false); | 151 case Decision::kTrue: |
| 117 if (m.IsChangeInt31ToTaggedSigned()) return ReplaceBoolean(true); | 152 return ReplaceBoolean(true); |
| 118 if (m.IsHeapConstant()) return ReplaceBoolean(false); | 153 case Decision::kFalse: |
| 154 return ReplaceBoolean(false); |
| 155 case Decision::kUnknown: |
| 156 break; |
| 157 } |
| 119 break; | 158 break; |
| 120 } | 159 } |
| 121 case IrOpcode::kNumberCeil: | 160 case IrOpcode::kNumberCeil: |
| 122 case IrOpcode::kNumberFloor: | 161 case IrOpcode::kNumberFloor: |
| 123 case IrOpcode::kNumberRound: | 162 case IrOpcode::kNumberRound: |
| 124 case IrOpcode::kNumberTrunc: { | 163 case IrOpcode::kNumberTrunc: { |
| 125 Node* const input = NodeProperties::GetValueInput(node, 0); | 164 Node* const input = NodeProperties::GetValueInput(node, 0); |
| 126 Type* const input_type = NodeProperties::GetType(input); | 165 Type* const input_type = NodeProperties::GetType(input); |
| 127 if (input_type->Is(type_cache_.kIntegerOrMinusZeroOrNaN)) { | 166 if (input_type->Is(type_cache_.kIntegerOrMinusZeroOrNaN)) { |
| 128 return Replace(input); | 167 return Replace(input); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 Graph* SimplifiedOperatorReducer::graph() const { return jsgraph()->graph(); } | 239 Graph* SimplifiedOperatorReducer::graph() const { return jsgraph()->graph(); } |
| 201 | 240 |
| 202 | 241 |
| 203 MachineOperatorBuilder* SimplifiedOperatorReducer::machine() const { | 242 MachineOperatorBuilder* SimplifiedOperatorReducer::machine() const { |
| 204 return jsgraph()->machine(); | 243 return jsgraph()->machine(); |
| 205 } | 244 } |
| 206 | 245 |
| 207 } // namespace compiler | 246 } // namespace compiler |
| 208 } // namespace internal | 247 } // namespace internal |
| 209 } // namespace v8 | 248 } // namespace v8 |
| OLD | NEW |