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/effect-control-linearizer.h" | 5 #include "src/compiler/effect-control-linearizer.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
9 #include "src/compiler/compiler-source-position-table.h" | 9 #include "src/compiler/compiler-source-position-table.h" |
10 #include "src/compiler/js-graph.h" | 10 #include "src/compiler/js-graph.h" |
(...skipping 2213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2224 | 2224 |
2225 return ValueEffectControl(value, effect, control); | 2225 return ValueEffectControl(value, effect, control); |
2226 } | 2226 } |
2227 | 2227 |
2228 EffectControlLinearizer::ValueEffectControl | 2228 EffectControlLinearizer::ValueEffectControl |
2229 EffectControlLinearizer::LowerStringCharCodeAt(Node* node, Node* effect, | 2229 EffectControlLinearizer::LowerStringCharCodeAt(Node* node, Node* effect, |
2230 Node* control) { | 2230 Node* control) { |
2231 Node* subject = node->InputAt(0); | 2231 Node* subject = node->InputAt(0); |
2232 Node* index = node->InputAt(1); | 2232 Node* index = node->InputAt(1); |
2233 | 2233 |
2234 // We may need to loop several times for ConsString/SlicedString {subject}s. | 2234 // We may need to loop several times for ConsString/SlicedString {subject}s. |
Igor Sheludko
2016/12/20 23:46:58
/ThinString
Jakob Kummerow
2017/01/04 12:45:06
Done.
| |
2235 Node* loop = | 2235 Node* loop = graph()->NewNode(common()->Loop(5), control, control, control, |
2236 graph()->NewNode(common()->Loop(4), control, control, control, control); | 2236 control, control); |
2237 Node* lsubject = | 2237 Node* lsubject = |
2238 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 4), | 2238 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 5), |
2239 subject, subject, subject, subject, loop); | 2239 subject, subject, subject, subject, subject, loop); |
2240 Node* lindex = | 2240 Node* lindex = |
2241 graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 4), index, | 2241 graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 5), index, |
2242 index, index, index, loop); | 2242 index, index, index, index, loop); |
2243 Node* leffect = graph()->NewNode(common()->EffectPhi(4), effect, effect, | 2243 Node* leffect = graph()->NewNode(common()->EffectPhi(5), effect, effect, |
2244 effect, effect, loop); | 2244 effect, effect, effect, loop); |
2245 | 2245 |
2246 control = loop; | 2246 control = loop; |
2247 effect = leffect; | 2247 effect = leffect; |
2248 | 2248 |
2249 // Determine the instance type of {lsubject}. | 2249 // Determine the instance type of {lsubject}. |
2250 Node* lsubject_map = effect = | 2250 Node* lsubject_map = effect = |
2251 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), | 2251 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), |
2252 lsubject, effect, control); | 2252 lsubject, effect, control); |
2253 Node* lsubject_instance_type = effect = graph()->NewNode( | 2253 Node* lsubject_instance_type = effect = graph()->NewNode( |
2254 simplified()->LoadField(AccessBuilder::ForMapInstanceType()), | 2254 simplified()->LoadField(AccessBuilder::ForMapInstanceType()), |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2449 etrue2 = | 2449 etrue2 = |
2450 graph()->NewNode(common()->EffectPhi(2), etrue3, efalse3, if_true2); | 2450 graph()->NewNode(common()->EffectPhi(2), etrue3, efalse3, if_true2); |
2451 vtrue2 = | 2451 vtrue2 = |
2452 graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), | 2452 graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), |
2453 vtrue3, vfalse3, if_true2); | 2453 vtrue3, vfalse3, if_true2); |
2454 } | 2454 } |
2455 | 2455 |
2456 Node* if_false2 = graph()->NewNode(common()->IfFalse(), branch2); | 2456 Node* if_false2 = graph()->NewNode(common()->IfFalse(), branch2); |
2457 Node* efalse2 = efalse1; | 2457 Node* efalse2 = efalse1; |
2458 { | 2458 { |
2459 // The {lsubject} is a SlicedString, continue with its parent. | 2459 // Check if the {lsubject} is a SlicedString. |
2460 Node* lsubject_parent = efalse2 = graph()->NewNode( | 2460 Node* check3 = graph()->NewNode( |
2461 simplified()->LoadField(AccessBuilder::ForSlicedStringParent()), | 2461 machine()->Word32Equal(), |
2462 lsubject, efalse2, if_false2); | 2462 graph()->NewNode( |
2463 Node* lsubject_offset = efalse2 = graph()->NewNode( | 2463 machine()->Word32And(), lsubject_instance_type, |
2464 simplified()->LoadField(AccessBuilder::ForSlicedStringOffset()), | 2464 jsgraph()->Int32Constant(kStringRepresentationMask)), |
2465 lsubject, efalse2, if_false2); | 2465 jsgraph()->Int32Constant(kSlicedStringTag)); |
2466 Node* lsubject_index = graph()->NewNode( | 2466 Node* branch3 = graph()->NewNode(common()->Branch(), check3, if_false2); |
2467 machine()->Int32Add(), lindex, ChangeSmiToInt32(lsubject_offset)); | |
2468 | 2467 |
2469 // Retry the {loop} with the parent subject. | 2468 Node* if_true3 = graph()->NewNode(common()->IfTrue(), branch3); |
2470 loop->ReplaceInput(3, if_false2); | 2469 Node* etrue3 = efalse2; |
2471 leffect->ReplaceInput(3, efalse2); | 2470 { |
2472 lindex->ReplaceInput(3, lsubject_index); | 2471 // The {lsubject} is a SlicedString, continue with its parent. |
2473 lsubject->ReplaceInput(3, lsubject_parent); | 2472 Node* lsubject_parent = etrue3 = graph()->NewNode( |
2473 simplified()->LoadField(AccessBuilder::ForSlicedStringParent()), | |
2474 lsubject, etrue3, if_true3); | |
2475 Node* lsubject_offset = etrue3 = graph()->NewNode( | |
2476 simplified()->LoadField(AccessBuilder::ForSlicedStringOffset()), | |
2477 lsubject, etrue3, if_true3); | |
2478 Node* lsubject_index = graph()->NewNode( | |
2479 machine()->Int32Add(), lindex, ChangeSmiToInt32(lsubject_offset)); | |
2480 | |
2481 // Retry the {loop} with the parent subject. | |
2482 loop->ReplaceInput(3, if_true3); | |
2483 leffect->ReplaceInput(3, etrue3); | |
2484 lindex->ReplaceInput(3, lsubject_index); | |
2485 lsubject->ReplaceInput(3, lsubject_parent); | |
2486 } | |
2487 | |
2488 Node* if_false3 = graph()->NewNode(common()->IfFalse(), branch3); | |
2489 Node* efalse3 = efalse2; | |
2490 { | |
2491 // The {lsubject} is a ThinString, continue with its actual value. | |
2492 Node* lsubject_actual = efalse3 = graph()->NewNode( | |
2493 simplified()->LoadField(AccessBuilder::ForThinStringActual()), | |
2494 lsubject, efalse3, if_false3); | |
2495 | |
2496 // Retry the {loop} with the actual subject. | |
2497 loop->ReplaceInput(4, if_false3); | |
2498 leffect->ReplaceInput(4, efalse3); | |
2499 lsubject->ReplaceInput(4, lsubject_actual); | |
2500 } | |
2474 } | 2501 } |
2475 | 2502 |
2476 if_false1 = if_true2; | 2503 if_false1 = if_true2; |
2477 efalse1 = etrue2; | 2504 efalse1 = etrue2; |
2478 vfalse1 = vtrue2; | 2505 vfalse1 = vtrue2; |
2479 } | 2506 } |
2480 | 2507 |
2481 if_false0 = if_false1; | 2508 if_false0 = if_false1; |
2482 efalse0 = efalse1; | 2509 efalse0 = efalse1; |
2483 vfalse0 = vfalse1; | 2510 vfalse0 = vfalse1; |
(...skipping 1332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3816 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3843 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
3817 Operator::kEliminatable); | 3844 Operator::kEliminatable); |
3818 to_number_operator_.set(common()->Call(desc)); | 3845 to_number_operator_.set(common()->Call(desc)); |
3819 } | 3846 } |
3820 return to_number_operator_.get(); | 3847 return to_number_operator_.get(); |
3821 } | 3848 } |
3822 | 3849 |
3823 } // namespace compiler | 3850 } // namespace compiler |
3824 } // namespace internal | 3851 } // namespace internal |
3825 } // namespace v8 | 3852 } // namespace v8 |
OLD | NEW |