Chromium Code Reviews| Index: src/compiler/effect-control-linearizer.cc | 
| diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc | 
| index 0a8fbd900d9ddafe7f95c1c1146961e6bfaa193d..d4b361738f691604e18bb5dd059a716b48bfcb29 100644 | 
| --- a/src/compiler/effect-control-linearizer.cc | 
| +++ b/src/compiler/effect-control-linearizer.cc | 
| @@ -2232,16 +2232,16 @@ EffectControlLinearizer::LowerStringCharCodeAt(Node* node, Node* effect, | 
| Node* index = node->InputAt(1); | 
| // 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.
 
 | 
| - Node* loop = | 
| - graph()->NewNode(common()->Loop(4), control, control, control, control); | 
| + Node* loop = graph()->NewNode(common()->Loop(5), control, control, control, | 
| + control, control); | 
| Node* lsubject = | 
| - graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 4), | 
| - subject, subject, subject, subject, loop); | 
| + graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 5), | 
| + subject, subject, subject, subject, subject, loop); | 
| Node* lindex = | 
| - graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 4), index, | 
| - index, index, index, loop); | 
| - Node* leffect = graph()->NewNode(common()->EffectPhi(4), effect, effect, | 
| - effect, effect, loop); | 
| + graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 5), index, | 
| + index, index, index, index, loop); | 
| + Node* leffect = graph()->NewNode(common()->EffectPhi(5), effect, effect, | 
| + effect, effect, effect, loop); | 
| control = loop; | 
| effect = leffect; | 
| @@ -2456,21 +2456,48 @@ EffectControlLinearizer::LowerStringCharCodeAt(Node* node, Node* effect, | 
| Node* if_false2 = graph()->NewNode(common()->IfFalse(), branch2); | 
| Node* efalse2 = efalse1; | 
| { | 
| - // The {lsubject} is a SlicedString, continue with its parent. | 
| - Node* lsubject_parent = efalse2 = graph()->NewNode( | 
| - simplified()->LoadField(AccessBuilder::ForSlicedStringParent()), | 
| - lsubject, efalse2, if_false2); | 
| - Node* lsubject_offset = efalse2 = graph()->NewNode( | 
| - simplified()->LoadField(AccessBuilder::ForSlicedStringOffset()), | 
| - lsubject, efalse2, if_false2); | 
| - Node* lsubject_index = graph()->NewNode( | 
| - machine()->Int32Add(), lindex, ChangeSmiToInt32(lsubject_offset)); | 
| - | 
| - // Retry the {loop} with the parent subject. | 
| - loop->ReplaceInput(3, if_false2); | 
| - leffect->ReplaceInput(3, efalse2); | 
| - lindex->ReplaceInput(3, lsubject_index); | 
| - lsubject->ReplaceInput(3, lsubject_parent); | 
| + // Check if the {lsubject} is a SlicedString. | 
| + Node* check3 = graph()->NewNode( | 
| + machine()->Word32Equal(), | 
| + graph()->NewNode( | 
| + machine()->Word32And(), lsubject_instance_type, | 
| + jsgraph()->Int32Constant(kStringRepresentationMask)), | 
| + jsgraph()->Int32Constant(kSlicedStringTag)); | 
| + Node* branch3 = graph()->NewNode(common()->Branch(), check3, if_false2); | 
| + | 
| + Node* if_true3 = graph()->NewNode(common()->IfTrue(), branch3); | 
| + Node* etrue3 = efalse2; | 
| + { | 
| + // The {lsubject} is a SlicedString, continue with its parent. | 
| + Node* lsubject_parent = etrue3 = graph()->NewNode( | 
| + simplified()->LoadField(AccessBuilder::ForSlicedStringParent()), | 
| + lsubject, etrue3, if_true3); | 
| + Node* lsubject_offset = etrue3 = graph()->NewNode( | 
| + simplified()->LoadField(AccessBuilder::ForSlicedStringOffset()), | 
| + lsubject, etrue3, if_true3); | 
| + Node* lsubject_index = graph()->NewNode( | 
| + machine()->Int32Add(), lindex, ChangeSmiToInt32(lsubject_offset)); | 
| + | 
| + // Retry the {loop} with the parent subject. | 
| + loop->ReplaceInput(3, if_true3); | 
| + leffect->ReplaceInput(3, etrue3); | 
| + lindex->ReplaceInput(3, lsubject_index); | 
| + lsubject->ReplaceInput(3, lsubject_parent); | 
| + } | 
| + | 
| + Node* if_false3 = graph()->NewNode(common()->IfFalse(), branch3); | 
| + Node* efalse3 = efalse2; | 
| + { | 
| + // The {lsubject} is a ThinString, continue with its actual value. | 
| + Node* lsubject_actual = efalse3 = graph()->NewNode( | 
| + simplified()->LoadField(AccessBuilder::ForThinStringActual()), | 
| + lsubject, efalse3, if_false3); | 
| + | 
| + // Retry the {loop} with the actual subject. | 
| + loop->ReplaceInput(4, if_false3); | 
| + leffect->ReplaceInput(4, efalse3); | 
| + lsubject->ReplaceInput(4, lsubject_actual); | 
| + } | 
| } | 
| if_false1 = if_true2; |