| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/js-global-specialization.h" | 5 #include "src/compiler/js-global-specialization.h" |
| 6 | 6 |
| 7 #include "src/compilation-dependencies.h" | 7 #include "src/compilation-dependencies.h" |
| 8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
| 9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
| 10 #include "src/compiler/js-operator.h" | 10 #include "src/compiler/js-operator.h" |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 dependencies()->AssumePropertyCell(property_cell); | 138 dependencies()->AssumePropertyCell(property_cell); |
| 139 return Replace(node, property_cell_value); | 139 return Replace(node, property_cell_value); |
| 140 } | 140 } |
| 141 // Not much we can do if we run the generic pipeline here. | 141 // Not much we can do if we run the generic pipeline here. |
| 142 if (!(flags() & kTypingEnabled)) return NoChange(); | 142 if (!(flags() & kTypingEnabled)) return NoChange(); |
| 143 // Load from constant type global property can benefit from representation | 143 // Load from constant type global property can benefit from representation |
| 144 // (and map) feedback with deoptimization support (requires code dependency). | 144 // (and map) feedback with deoptimization support (requires code dependency). |
| 145 if (property_details.cell_type() == PropertyCellType::kConstantType && | 145 if (property_details.cell_type() == PropertyCellType::kConstantType && |
| 146 (flags() & kDeoptimizationEnabled)) { | 146 (flags() & kDeoptimizationEnabled)) { |
| 147 dependencies()->AssumePropertyCell(property_cell); | 147 dependencies()->AssumePropertyCell(property_cell); |
| 148 Type* property_cell_value_type = Type::Any(); | 148 // Compute proper type based on the current value in the cell. |
| 149 switch (property_cell->GetConstantType()) { | 149 Type* property_cell_value_type; |
| 150 case PropertyCellConstantType::kSmi: | 150 if (property_cell_value->IsSmi()) { |
| 151 property_cell_value_type = Type::Intersect( | 151 property_cell_value_type = Type::Intersect( |
| 152 Type::SignedSmall(), Type::TaggedSigned(), graph()->zone()); | 152 Type::SignedSmall(), Type::TaggedSigned(), graph()->zone()); |
| 153 break; | 153 } else if (property_cell_value->IsNumber()) { |
| 154 case PropertyCellConstantType::kStableMap: { | 154 property_cell_value_type = Type::Intersect( |
| 155 // TODO(bmeurer): Determine type based on the map's instance type. | 155 Type::Number(), Type::TaggedPointer(), graph()->zone()); |
| 156 property_cell_value_type = Type::TaggedPointer(); | 156 } else { |
| 157 break; | 157 property_cell_value_type = Type::Of(property_cell_value, graph()->zone()); |
| 158 } | |
| 159 } | 158 } |
| 160 Node* value = effect = graph()->NewNode( | 159 Node* value = effect = graph()->NewNode( |
| 161 simplified()->LoadField( | 160 simplified()->LoadField( |
| 162 AccessBuilder::ForPropertyCellValue(property_cell_value_type)), | 161 AccessBuilder::ForPropertyCellValue(property_cell_value_type)), |
| 163 jsgraph()->Constant(property_cell), effect, control); | 162 jsgraph()->Constant(property_cell), effect, control); |
| 164 return Replace(node, value, effect); | 163 return Replace(node, value, effect); |
| 165 } | 164 } |
| 166 // Load from non-configurable, data property on the global can be lowered to | 165 // Load from non-configurable, data property on the global can be lowered to |
| 167 // a field load, even without deoptimization, because the property cannot be | 166 // a field load, even without deoptimization, because the property cannot be |
| 168 // deleted or reconfigured to an accessor/interceptor property. | 167 // deleted or reconfigured to an accessor/interceptor property. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 } | 230 } |
| 232 | 231 |
| 233 | 232 |
| 234 JSOperatorBuilder* JSGlobalSpecialization::javascript() const { | 233 JSOperatorBuilder* JSGlobalSpecialization::javascript() const { |
| 235 return jsgraph()->javascript(); | 234 return jsgraph()->javascript(); |
| 236 } | 235 } |
| 237 | 236 |
| 238 } // namespace compiler | 237 } // namespace compiler |
| 239 } // namespace internal | 238 } // namespace internal |
| 240 } // namespace v8 | 239 } // namespace v8 |
| OLD | NEW |