| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 07803854d91ff3ec814d63a9559445b3ba203007..44df621790d875f1534a839db80ecaecf4b80753 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -8951,11 +8951,16 @@ HValue* HGraphBuilder::BuildBinaryOperation(
|
| return AddUncasted<HInvokeFunction>(function, 2);
|
| }
|
|
|
| - // Inline the string addition into the stub when creating allocation
|
| - // mementos to gather allocation site feedback.
|
| - if (graph()->info()->IsStub() &&
|
| - allocation_mode.CreateAllocationMementos()) {
|
| - return BuildStringAdd(left, right, allocation_mode);
|
| + // Fast path for empty constant strings.
|
| + if (left->IsConstant() &&
|
| + HConstant::cast(left)->HasStringValue() &&
|
| + HConstant::cast(left)->StringValue()->length() == 0) {
|
| + return right;
|
| + }
|
| + if (right->IsConstant() &&
|
| + HConstant::cast(right)->HasStringValue() &&
|
| + HConstant::cast(right)->StringValue()->length() == 0) {
|
| + return left;
|
| }
|
|
|
| // Register the dependent code with the allocation site.
|
| @@ -8966,28 +8971,20 @@ HValue* HGraphBuilder::BuildBinaryOperation(
|
| site, AllocationSite::TENURING, top_info());
|
| }
|
|
|
| - // Inline string addition if we know that we'll create a cons string.
|
| - if (left->IsConstant()) {
|
| - HConstant* c_left = HConstant::cast(left);
|
| - if (c_left->HasStringValue()) {
|
| - int c_left_length = c_left->StringValue()->length();
|
| - if (c_left_length == 0) {
|
| - return right;
|
| - } else if (c_left_length + 1 >= ConsString::kMinLength) {
|
| - return BuildStringAdd(left, right, allocation_mode);
|
| - }
|
| - }
|
| - }
|
| - if (right->IsConstant()) {
|
| - HConstant* c_right = HConstant::cast(right);
|
| - if (c_right->HasStringValue()) {
|
| - int c_right_length = c_right->StringValue()->length();
|
| - if (c_right_length == 0) {
|
| - return left;
|
| - } else if (c_right_length + 1 >= ConsString::kMinLength) {
|
| - return BuildStringAdd(left, right, allocation_mode);
|
| - }
|
| - }
|
| + // Inline the string addition into the stub when creating allocation
|
| + // mementos to gather allocation site feedback, or if we can statically
|
| + // infer that we're going to create a cons string.
|
| + if ((graph()->info()->IsStub() &&
|
| + allocation_mode.CreateAllocationMementos()) ||
|
| + (left->IsConstant() &&
|
| + HConstant::cast(left)->HasStringValue() &&
|
| + HConstant::cast(left)->StringValue()->length() + 1 >=
|
| + ConsString::kMinLength) ||
|
| + (right->IsConstant() &&
|
| + HConstant::cast(right)->HasStringValue() &&
|
| + HConstant::cast(right)->StringValue()->length() + 1 >=
|
| + ConsString::kMinLength)) {
|
| + return BuildStringAdd(left, right, allocation_mode);
|
| }
|
|
|
| // Fallback to using the string add stub.
|
|
|