Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Unified Diff: src/compiler/effect-control-linearizer.cc

Issue 2549773002: Internalize strings in-place (Closed)
Patch Set: forgot one Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698