| 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/js-typed-lowering.h" | 5 #include "src/compiler/js-typed-lowering.h" |
| 6 | 6 |
| 7 #include "src/ast/modules.h" | 7 #include "src/ast/modules.h" |
| 8 #include "src/builtins/builtins-utils.h" | 8 #include "src/builtins/builtins-utils.h" |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/compilation-dependencies.h" | 10 #include "src/compilation-dependencies.h" |
| (...skipping 2121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2132 NodeProperties::ChangeOp( | 2132 NodeProperties::ChangeOp( |
| 2133 node, | 2133 node, |
| 2134 javascript()->Call(p.arity(), p.frequency(), p.feedback(), convert_mode, | 2134 javascript()->Call(p.arity(), p.frequency(), p.feedback(), convert_mode, |
| 2135 p.tail_call_mode())); | 2135 p.tail_call_mode())); |
| 2136 return Changed(node); | 2136 return Changed(node); |
| 2137 } | 2137 } |
| 2138 | 2138 |
| 2139 return NoChange(); | 2139 return NoChange(); |
| 2140 } | 2140 } |
| 2141 | 2141 |
| 2142 | |
| 2143 Reduction JSTypedLowering::ReduceJSForInNext(Node* node) { | |
| 2144 DCHECK_EQ(IrOpcode::kJSForInNext, node->opcode()); | |
| 2145 Node* receiver = NodeProperties::GetValueInput(node, 0); | |
| 2146 Node* cache_array = NodeProperties::GetValueInput(node, 1); | |
| 2147 Node* cache_type = NodeProperties::GetValueInput(node, 2); | |
| 2148 Node* index = NodeProperties::GetValueInput(node, 3); | |
| 2149 Node* context = NodeProperties::GetContextInput(node); | |
| 2150 Node* frame_state = NodeProperties::GetFrameStateInput(node); | |
| 2151 Node* effect = NodeProperties::GetEffectInput(node); | |
| 2152 Node* control = NodeProperties::GetControlInput(node); | |
| 2153 | |
| 2154 // We know that the {index} is in Unsigned32 range here, otherwise executing | |
| 2155 // the JSForInNext wouldn't be valid. Unfortunately due to OSR and generators | |
| 2156 // this is not always reflected in the types, hence we might need to rename | |
| 2157 // the {index} here. | |
| 2158 if (!NodeProperties::GetType(index)->Is(Type::Unsigned32())) { | |
| 2159 index = graph()->NewNode(common()->TypeGuard(Type::Unsigned32()), index, | |
| 2160 control); | |
| 2161 } | |
| 2162 | |
| 2163 // Load the next {key} from the {cache_array}. | |
| 2164 Node* key = effect = graph()->NewNode( | |
| 2165 simplified()->LoadElement(AccessBuilder::ForFixedArrayElement()), | |
| 2166 cache_array, index, effect, control); | |
| 2167 | |
| 2168 // Load the map of the {receiver}. | |
| 2169 Node* receiver_map = effect = | |
| 2170 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), | |
| 2171 receiver, effect, control); | |
| 2172 | |
| 2173 // Check if the expected map still matches that of the {receiver}. | |
| 2174 Node* check0 = graph()->NewNode(simplified()->ReferenceEqual(), receiver_map, | |
| 2175 cache_type); | |
| 2176 Node* branch0 = | |
| 2177 graph()->NewNode(common()->Branch(BranchHint::kTrue), check0, control); | |
| 2178 | |
| 2179 Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0); | |
| 2180 Node* etrue0; | |
| 2181 Node* vtrue0; | |
| 2182 { | |
| 2183 // Don't need filtering since expected map still matches that of the | |
| 2184 // {receiver}. | |
| 2185 etrue0 = effect; | |
| 2186 vtrue0 = key; | |
| 2187 } | |
| 2188 | |
| 2189 Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0); | |
| 2190 Node* efalse0; | |
| 2191 Node* vfalse0; | |
| 2192 { | |
| 2193 // Filter the {key} to check if it's still a valid property of the | |
| 2194 // {receiver} (does the ToName conversion implicitly). | |
| 2195 Callable const callable = CodeFactory::ForInFilter(isolate()); | |
| 2196 CallDescriptor const* const desc = Linkage::GetStubCallDescriptor( | |
| 2197 isolate(), graph()->zone(), callable.descriptor(), 0, | |
| 2198 CallDescriptor::kNeedsFrameState); | |
| 2199 vfalse0 = efalse0 = if_false0 = graph()->NewNode( | |
| 2200 common()->Call(desc), jsgraph()->HeapConstant(callable.code()), key, | |
| 2201 receiver, context, frame_state, effect, if_false0); | |
| 2202 | |
| 2203 // Update potential {IfException} uses of {node} to point to the ahove | |
| 2204 // ForInFilter stub call node instead. | |
| 2205 Node* if_exception = nullptr; | |
| 2206 if (NodeProperties::IsExceptionalCall(node, &if_exception)) { | |
| 2207 if_false0 = graph()->NewNode(common()->IfSuccess(), vfalse0); | |
| 2208 NodeProperties::ReplaceControlInput(if_exception, vfalse0); | |
| 2209 NodeProperties::ReplaceEffectInput(if_exception, efalse0); | |
| 2210 Revisit(if_exception); | |
| 2211 } | |
| 2212 } | |
| 2213 | |
| 2214 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); | |
| 2215 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control); | |
| 2216 ReplaceWithValue(node, node, effect, control); | |
| 2217 | |
| 2218 // Morph the {node} into a Phi. | |
| 2219 node->ReplaceInput(0, vtrue0); | |
| 2220 node->ReplaceInput(1, vfalse0); | |
| 2221 node->ReplaceInput(2, control); | |
| 2222 node->TrimInputCount(3); | |
| 2223 NodeProperties::ChangeOp(node, | |
| 2224 common()->Phi(MachineRepresentation::kTagged, 2)); | |
| 2225 return Changed(node); | |
| 2226 } | |
| 2227 | |
| 2228 Reduction JSTypedLowering::ReduceJSLoadMessage(Node* node) { | 2142 Reduction JSTypedLowering::ReduceJSLoadMessage(Node* node) { |
| 2229 DCHECK_EQ(IrOpcode::kJSLoadMessage, node->opcode()); | 2143 DCHECK_EQ(IrOpcode::kJSLoadMessage, node->opcode()); |
| 2230 ExternalReference const ref = | 2144 ExternalReference const ref = |
| 2231 ExternalReference::address_of_pending_message_obj(isolate()); | 2145 ExternalReference::address_of_pending_message_obj(isolate()); |
| 2232 node->ReplaceInput(0, jsgraph()->ExternalConstant(ref)); | 2146 node->ReplaceInput(0, jsgraph()->ExternalConstant(ref)); |
| 2233 NodeProperties::ChangeOp( | 2147 NodeProperties::ChangeOp( |
| 2234 node, simplified()->LoadField(AccessBuilder::ForExternalTaggedValue())); | 2148 node, simplified()->LoadField(AccessBuilder::ForExternalTaggedValue())); |
| 2235 return Changed(node); | 2149 return Changed(node); |
| 2236 } | 2150 } |
| 2237 | 2151 |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2386 case IrOpcode::kJSStoreModule: | 2300 case IrOpcode::kJSStoreModule: |
| 2387 return ReduceJSStoreModule(node); | 2301 return ReduceJSStoreModule(node); |
| 2388 case IrOpcode::kJSConvertReceiver: | 2302 case IrOpcode::kJSConvertReceiver: |
| 2389 return ReduceJSConvertReceiver(node); | 2303 return ReduceJSConvertReceiver(node); |
| 2390 case IrOpcode::kJSConstruct: | 2304 case IrOpcode::kJSConstruct: |
| 2391 return ReduceJSConstruct(node); | 2305 return ReduceJSConstruct(node); |
| 2392 case IrOpcode::kJSCallForwardVarargs: | 2306 case IrOpcode::kJSCallForwardVarargs: |
| 2393 return ReduceJSCallForwardVarargs(node); | 2307 return ReduceJSCallForwardVarargs(node); |
| 2394 case IrOpcode::kJSCall: | 2308 case IrOpcode::kJSCall: |
| 2395 return ReduceJSCall(node); | 2309 return ReduceJSCall(node); |
| 2396 case IrOpcode::kJSForInNext: | |
| 2397 return ReduceJSForInNext(node); | |
| 2398 case IrOpcode::kJSLoadMessage: | 2310 case IrOpcode::kJSLoadMessage: |
| 2399 return ReduceJSLoadMessage(node); | 2311 return ReduceJSLoadMessage(node); |
| 2400 case IrOpcode::kJSStoreMessage: | 2312 case IrOpcode::kJSStoreMessage: |
| 2401 return ReduceJSStoreMessage(node); | 2313 return ReduceJSStoreMessage(node); |
| 2402 case IrOpcode::kJSGeneratorStore: | 2314 case IrOpcode::kJSGeneratorStore: |
| 2403 return ReduceJSGeneratorStore(node); | 2315 return ReduceJSGeneratorStore(node); |
| 2404 case IrOpcode::kJSGeneratorRestoreContinuation: | 2316 case IrOpcode::kJSGeneratorRestoreContinuation: |
| 2405 return ReduceJSGeneratorRestoreContinuation(node); | 2317 return ReduceJSGeneratorRestoreContinuation(node); |
| 2406 case IrOpcode::kJSGeneratorRestoreRegister: | 2318 case IrOpcode::kJSGeneratorRestoreRegister: |
| 2407 return ReduceJSGeneratorRestoreRegister(node); | 2319 return ReduceJSGeneratorRestoreRegister(node); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2448 } | 2360 } |
| 2449 | 2361 |
| 2450 | 2362 |
| 2451 CompilationDependencies* JSTypedLowering::dependencies() const { | 2363 CompilationDependencies* JSTypedLowering::dependencies() const { |
| 2452 return dependencies_; | 2364 return dependencies_; |
| 2453 } | 2365 } |
| 2454 | 2366 |
| 2455 } // namespace compiler | 2367 } // namespace compiler |
| 2456 } // namespace internal | 2368 } // namespace internal |
| 2457 } // namespace v8 | 2369 } // namespace v8 |
| OLD | NEW |